PHP的基础概述
正在写作的人
「かずきち」是一个提供编程学习服务、宠物沙龙预约服务、以及风俗搜索服务等多种服务的网站。
■部分经营服务
http://webukatu.com/
起初是从东京新宿的主人公过渡到房地产和保险销售,对HTML一无所知,但在三个月的自学中学习了编程和设计,并在IT行业积累了一年的实际工作经验,年收入超过一本。现在作为创业者,负责运营服务和房地产管理。
在Qiita上也写了相关的文章。
13个助于工程师赚钱的重要事项
18个希望想创办WEB服务的人能阅读的事项
关于基本的机制
<?php
//処理内容
?>
※使用”“进行区块处理。即使有多个区块,它们也都能够连接在一起,可以跨越区块进行处理。
※只要以”;”结束,换行、空格或空白都会被忽略。
※如果只在一个文件中编写php(无html等),最后的”“可以省略。
编译和运行php
PHP程序通过称为“词法分析器”的工具对PHP程序进行解析,将语法分解为多个令牌。
然后,称为“解析器”的工具将令牌转换为操作码。
这些操作码将被执行。
回声的机制
echo 将评估值转换为字符串类型并进行输出
(因此,例如false这样的逻辑值不会被显示)(小数1.0将变为1)
※如果想要显示小数点,可以使用printf方法
isset和empty的区别是什么?
即便empty函数中设置了0、””、null,仍会被评估为false。
而isset函数则会在遇到null时评估为false。
例)変数に0が入っていた場合
emptyだと変数の値が0だと空だと判断される。でもissetだとセットされていると判断される。
错误相关
错误大致可分为三种类型:
1. 无法编译(停留在执行之前) ➡ 语法错误(syntax error)
2. 导致程序停止执行的错误 ➡ 致命错误(fatal error)
3. 程序可以继续执行,但会出现警告的错误 ➡ 警告(warning)、注意(notice)
1是由于语法错误等无法编译的情况。
2是在调用未定义的函数时等。
3是在使用未初始化的变量而发生的情况。
错误的重要性按高低排序
解析错误
致命错误
警告
注意
弃用
当使用违反编码规范或即将被弃用的(不推荐)功能时,会触发 E_DEPRECATED 错误。
记录日志
日志是记录程序执行到哪一步的记录。当出现错误时,可以更容易地判断出错误出现在哪里。
<?php
error_reporting(E_ALL); //E_STRICTレベル以外のエラーを報告する
ini_set('display_errors','On'); //画面にエラーを表示させるか
ini_set('log_errors','On'); //ログを取るか
ini_set('error_log','php.log'); //ログの出力ファイルを指定
?>
请把使用@符号来隐藏错误信息的方法改写成中文:
用@符号隐藏错误不显示
在PHP中,@(at符号)是一个错误控制运算符,放置在函数或变量之前。
使用@符号可以阻止带有该符号的函数或变量输出错误信息。
对于变量来说
在声明变量名之前加上”$”符号。变量名区分大小写。
$a = 1;
可变变量
在变量内部有变量存在的感觉。
<?php
$a = 1;
$b = 'a';
echo $$b;
因为$b被评估并含有字符串”a”,所以成为”$a”,然后再被评估并显示其内容为”1″。
变量的作用域
在Java中,类似于变量前面的protected和private。
指的是变量的可访问范围。
全球范围
在块中编写的内容可以在其他块或文件中使用。
本地范围
在函数或类的方法内部声明的变量只能在该范围内使用。
超级全局变量
可以从任何地方使用的变量。在PHP执行时自动定义。
GET和POST等也属于这种超级全局变量。
确定的数量
define('MOMO','甘い');
我定义了一个名为MOMO的常量,其中包含一个表示“甜”的字符串。
※只能定义整数、小数和字符串。数组和对象不可以。
※常量名称区分大小写。
外形
在PHP中有8种类型。由于它是一种动态类型语言,这些类型会在方法中自动转换,所以我们需要了解在什么时候会发生什么。
自動傳輸
・请注意,从表单输入的值都是“字符串”类型!
・在使用if语句等进行比较时,如果写成“$value = 1”,则会自动将字符串内容转换为整数进行比较!
・在进行比较时,类似数值的字符串会被自动转换为数值。
※ 当使用“==”来比较“012345”和“12345”时,会被视为“相同”。
请使用本地语言用一种方式转述以下内容:
“ヒアドキュメント”
在储存长字符串到变量时,用””或”很麻烦,这种情况下可以使用。
如果在句子中使用 “{ }” 就可以展开变量。
“`php
$a = 1;
$value = << あいうえお かきくけこ {$a} さしすせそ。 EOI; ?>
“`
只要不是「EOI」都可以,不一定要「EOI」
只要在有关闭时带有任意字符(在这种情况下是「EOI;」)的行中,如果包含其他字符或空格等,就会出现错误。
逻辑导向
布尔值。处理布尔值的事物。
如果在if语句等中比较逻辑类型与非逻辑类型,会自动转换为逻辑类型并进行比较。
整数0、空字符串”、字符串的0、元素数量为0的数组、null与“false”相同。
对下面的句子进行中文本土化的改写,只需提供一种选项:
无
赋予null值的对象、没有值的对象以及被unset()处理过的对象被称为”null”。
含有null值的变量被视为”已定义的变量”。
文字链
可以用「.」符号进行连结
$a = 'aiu';
$b = 'eo';
$c = $a.$b;
除了if语句以外的条件描述方法
写起来比写一个if语句要简洁。
$value = isset($a) ? $a : 'none';
如果变量a不为空,则将变量a赋值。如果为空,则赋值字符串”none”。
可以用以下的方式将页面移动。
必须在输出HTML之前执行header函数。
header('Location:移動先のURL');
引用其他的php文件。
//一度きりの読み込みなら
<?php include_once('check.php'); ?>
//何度も読み込めるもの
<?php include('check.php'); ?>
其他还有
//一度きりの読み込みなら
<?php require_once('check.php'); ?>
//何度も読み込めるもの
<?php require('check.php'); ?>
在中文中,可以进行如下的翻译:
在使用`require`和`include`这两个函数时,它们的主要区别是,当发生读取错误时,`require`函数会导致程序中断执行,而`include`函数只会产生警告信息,而不会停止程序的执行。
只需加载一次check.php。
因此,如果在每个页面上执行相同的处理,只需在一个PHP文件中编写该处理,
然后在每个页面上加载该文件即可。
<?php require('check.php'); ?>
可以。我不太清楚其中的区别。
排列
PHP的数组没有区分哈希表或映射等,它们全都是”关联数组”。
可以存储任何类型的值。
如果键重复,则会进行覆盖。
数组的初始化 de
$arr[];
添加方括号「[]」后,该变量会作为一个数组进行初始化。
各种不同的排列方式
1.
$array1[0] = "あいうえお";
$array1[1] = "かきくけこ";
$array1[2] = "さしすせそ";
2.
$array2[] = "あいうえお";
$array2[] = "かきくけこ";
$array2[] = "さしすせそ";
3.
$array3 = array("あいうえお", "かきくけこ", "さしすせそ");
4.
$array4["a"] = "あいうえお";
$array4["ka"] = "かきくけこ";
$array4["sa"] = "さしすせそ";
5.
$array5 = array(
"a" => "あいうえお",
"ka" => "かきくけこ",
"sa" => "さしすせそ"
);
向数组添加或删除值。
$value = array('a','b',7);
//もしくは
&value[] = 'd';
array_push($value, 'a');
array_pop($value);
使用连续数组
$items = array('ケーキ'=>'あまい', 'レモン'=>'すっぱい');
$items['ケーキ'];
//「あまい」が取り出される
foreach($items as $key => $value {
printf($key.'は'.$value.'です');
}
获取时间
print(date(‘G’).’時’.date(‘i’).’分’.date(‘s’).’秒’);
又或者更简单一点,
print(‘現在は’.date(‘G時 i分 s秒’).‘です’);
用中国语进行本地化语句翻译:
以这种感觉,
将参数放入日期中,如“G”或“M”,就可以获取“年”或“月”。
如果出现警告,请在使用Date之前添加,因为从PHP5.1.0开始需要设置时区。
将时间转换为日本时间
将php.ini文件中的以下设置更改为:
date.timezone = Asia/Tokyo
表格相关
获取表单的值
获取多选复选框和列表框的值。
值存储在一个二维数组中。
<input type=”checkbox” name=”reserve[]” value=”男”>
<input type=”checkbox” name=”reserve[]” value=”女”>
以这种形式,将name属性转化为一个数组,并以二维数组的形式获取。
$_POST['reserve'][0]
$_POST['reserve'][1]
在显示输入到表单中的值时采取的安全措施
在表单中直接发送包含JavaScript等脚本的内容会导致其被执行,需要避免这种情况发生。还必须注意在单选按钮和复选框中同样要避免这种情况发生!
$value = htmlspecialchars($_POST['name属性の名前', ENT_QUOTES,'UTF-8');
「ENT_QUOTES」可以转换并避免单引号。这是一个常数,所以只需简单的“3”即可。
检查和转换表单的值
检查是否为半角的「数字」。
if(is_numeric($age)){
//処理
}
将全角英数字转换为半角英数字。
mb_convert_kana($_POST['age'],'a','UTF-8');
如果将「a」变为半角英数字。将其变为「n」,可以将全角数字转化为半角数字。
还有其他的输入内容在「」中,根据输入内容的不同,转换的方式也会不同,你可以自己去查一下。
使用正则表达式来检查用户输入内容是否符合正确的格式。
if(preg_match("/|A|d{3}¥-¥d{4}¥z/", $zip)){
//処理
}else{
$error['zip'] = "郵便番号の形式が違います。";
}
记住复选框、单选按钮和列表框的值
<select name="prefecture" id="prefecture">
<option value="">都道府県の選択</option>
<?php foreach($prf as $key => $value){ ?>
<option value="<?php print($value); ?>" <?php if (isset($_POST['prefecture']) && $_POST['prefecture'] == $value){ print " selected"; }?>><?php print($value); ?></option>
<?php } ?>
</select></td>
以如下方式,
如果POST中有值,并且该值与框的value相同,则添加属性selected。
对于复选框和单选按钮,可以使用”checked”代替”selected”。
将值传递到下一页
使用a标签传递
<a href="hoge.php?text=".urlencode('テスト')." />
在header功能中传递
$url = 'negotiate.php?food_id='.$_GET['food_id'];
header("Location:$url");
※如果在执行header函数之前已经输出了字符串等,则它将无法执行。
请注意,在”Location : $url”中保留空格,否则它将无法执行!
使用Cookie
使用Cookie将输入到表单中的值保留在记忆中
给予cookie一个指定的时间,到时间后在浏览器端会被销毁。
可以用于自动登录功能一周的时间等。
【处理顺序】
1. 首先,确认是否存在cookie。
2. 如果不存在,则创建一个。
3. 如果存在,则加载。
//ログインフォーム.php
if(isset($_COOKIE['名前'])){
$value = $_COOKIE['名前'];
}else{
}
<input type="checkbox" name="save" value="on" /><label for="save">1週間ログインしたままにする</label>
//ログイン後フォーム.php
if($save == 'on'){
setcookie('クッキー名',保存する内容,破棄までの時間(time()+60*60*24*7));
}else{
//空の値を入れる事でcookieを破棄する
setcookie('クッキー名','');
}
注意:必须在发送头部之前设置「setcookie」,否则会出现错误。
时间将变为 60 秒 × 60 分钟 × 24 小时 × 7 天,即为一周。
使用会话(SESSION)
会话机制可以在浏览器关闭前保存数据,可以用于记住会员注册时的表单数据等。通过使用 cookie,传递 ID 并在下次访问时根据该 ID 检索数据。如果关闭了 cookie,就无法使用该功能!
1.セッションスタートする(session_start();)
2.セッション(例えば、$_SESSION[‘counter’])があるかどうか(issetで調べる)
3.なければ、セッションを作る($_SESSION[‘counter’]=0などとして)
4.セッションが必要なければ削除する。(session_unset();)
如果想省略每一页开始会话并提取数据的步骤,需要修改php.ini文件。
如果在不同的电脑上读取会话ID,那么可以使用该ID来获取数据,所以需要检查IP地址和浏览器类型来进行身份验证和确认。
访问数据库
在PHP中,访问MySQL数据库有多种方法,如使用PEAR DB、PEAR MDB、PEAR MDB2、MySQL扩展模块、mySQLi、PDO等。
使用PDO的MySQL
Pdo和Java类似,可以在使用PostgreSQL或MySQL等不同类型的数据库时,以相同的格式编写并转换成查询语句。
要在Windows上使用,需要进行php.ini的设置。
要使用Pdo,需创建pdo类的对象并进行调用。
连接至数据库
$dsn = 'mysql:dbname=test;host=localhost;charset=utf8';
$user = 'root';
$password = '';
$options = array(
// SQL実行失敗時に例外をスロー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
// PDOオブジェクト生成
$dbh = new PDO($dsn, $user, $password, $options);
请注意,文字编码应该是“utf8”而不是“UTF-8”。
创建SQL查询
$stmt = $db->prepare('INSERT INTO message (name,body) VALUES (:name,:comment)');
在占位符中设置值
$stmt->bindParam(':name', $name, PDO::PARAM_STR);
$stmt->bindParam(':comment', $comment, PDO::PARAM_STR);
执行SQL语句
$stmt->execute(array($username,$message));
逐一处理每个结果
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
//処理内容
}
关闭数据库
在PHP脚本结束时,数据库连接将被关闭,但如果需要明确关闭,则将NULL赋值给创建的PDO类对象。
$dbh = null;
写SQL文并执行处理。
要向数据库发送一次性使用的SQL语句,可以使用PDO类中提供的”query”方法。
$sql = 'select id, name from shouhin';
$stmt = $dbh->query($sql);
用于使用preparedstatement的SQL语句。
經常使用的SQL語句可以先創建一個被稱為”預處理語句”的SQL語句模板,然後再填入數值進行執行。
填入數值有兩種方式:一種是使用”?”占位符,另一種是使用命名參數(如”:name”)。
$sql = 'select id, name from mypdo where id > ? AND id < ?';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(2, 4));
$sql = 'select id, name from mypdo where id > :kagen AND id < :jyougen';
$stmt = $dbh->prepare($sql);
$stmt->execute(array(':kagen'=>2, ':jyougen'=>4));
通过SELECT语句检索结果。
如果指定PDO::FETCH_NUM,则如下所示。
$sql = 'select id, name from shouhin';
$stmt = $dbh->query($sql);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
print($result[0]);
print($result[1]);
如果指定PDO::FETCH_ASSOC,将会如下所示。
$sql = 'select id, name from shouhin';
$stmt = $dbh->query($sql);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
print($result['id']);
print($result['name']);
如果指定了PDO::FETCH_BOTH(或者省略了参数),两种格式都可以使用。
使用获取到的数据进行提取并在循环中使用
<?php while($table2 = $stmt2->fetch(PDO::FETCH_ASSOC)){ ?>
内容
<?php } ?>
获取通过INSERT插入的数据的ID
$id = $stmt->lastInsertId();
给这个页面添加分页功能
如果在SELECT查询的末尾加上“LIMIT 10”的形式,每页显示的记录数将变为10条。
<?php
$page = $_GET['page'];
//最初のページで10件表示させるため
if($page == ''){
$page = 1;
}
$page = max($page, 1); //maxはどっちか大きい方を返すファンクション。この場合1より小さければ1が返る。
//最終ページを取得する
$sql = 'SELECT COUNT(*) AS cnt FROM テーブル名';
$stmt = $dbh->prepare($sql);
$table = mysql_fetch_assoc($stmt);
$maxPage = ceil($table['cnt'] / 10);
$page = min($page, $maxPage); //端数が出ても切り上げさせる。2.4ページ➡3ページになる。
$start = ($page -1) * 10;
$sql = 'SELECT * FROM テーブル名 ORDER BY date LIMIT'.$start.',10';
?>
//html部分
//1ページ目なら前ページへは出さず、maxページなら次へページは出さないようにする
<?php if($page > 1){ ?>
<a href="現在のページパス?page=<?php print($page -1); ?>">前のページへ</a>
<?php } ?>
<?php if($page < $maxPage){ ?>
<a href="現在のページパス?page=<?php print($page +1); ?>">次のページへ</a>
<?php } ?>
LIMIT可以逐渐增加为「1,5」、「5,5」、「10,5」,用于指定要显示的项目数量。
文本字符串处理
剪切文字
$text = 'abcdef';
$result = substr($text, -2); // "ef" を返す
$result = substr($text, -3, 1); // "d" を返す
如果用「-(减号)」来指定,则从后面取出多少个字符。
如果指定了两个参数,则取出从第几个字符开始和多少个字符。
将文本进行截断(超过指定字符数的部分将被省略)
mb_strimwidth($a,0,10,'...','UTF-8')
在中文编程语言中,我们需要在变量a中显示字符串从0到10(每两个字符算作一个字符),并将超过这个范围的字符显示为”..”。
如果出现乱码,则在最后添加字符编码。
请注意,与Mysql不同,我们要写作’UTF-8’(不要忘记引号,且要大写)。
文件操作
文件读取
$data = file_get_contents("読み込むファイルパス");
print($data); //そのままファイルの中身が見れる
如果同时进行读取和显示
readfile("パス");
将信息添加到文件中
$data = file_get_contents('読み込むファイルパス'); //getでファイル読み込んで
$data .= '内容'; //dataに追記して
file_put_contents('書き込むファイルパス',$data); //putして保存する
读取用于RSS、WebAPI等的XML文件。
※ 自从PHP5开始可用的函数。
$xml = simplexml_load_file('読み込むxmlファイルのURL');
//今回の場合、ファイル内の入れ子になった要素を指定してる
foreach($xml -> channnel -> item as $item){
//処理内容
};
文件写入
$success = file_put_contents('書き込むパス','書き込む内容');
如果密码等重要文件被看到会有麻烦,需要将其放置在文档根目录(如httpdocs,htdocs等)之外。(因为通过URL可以查看)
上传图像文件等数据
接收上传的图像
//1.フォームを用意(methodは必ずpost。enctypeは下記のようにする)
<form action="" method="post" enctype="multipart/form-data">
//2.フォームから送られたファイルを受信
$file = $_FILES['my_img'];
//3.受信したファイルからいろいろな情報が取れるので、いろいろやる
$file['name'] //ファイル名
$file['type'] //ファイルタイプ(拡張子) ※アバウトなので拡張子判定には使わない方がいい
$file['tmp_name'] //アップロードした一時保管ファイル場所
$file['error'] //エラー内容
$file['size'] //ファイルサイズ
//4.自分のサーバへ送る
$filepath = '送り先ファイルパス';
move_uploaded_file($file['tmp_name'],'/picture/'.$filepath); //移動元のファイルパスと移動先パス
//上のファンクション結果はboolean値で返ってくる
移动图片文件
当从表单界面转到确认界面时,会将指定的图片从临时存储移动到服务器,但如果在确认界面上按下“返回”按钮,则文件会残留下来。为了解决这个问题,可以先将图片从临时存储移动到服务器上的临时存储,然后在完成注册时将其从服务器临时存储移动到服务器的图像文件夹,这样可以在按下返回按钮时删除服务器临时存储文件中的图片。
rename("/tmp/file.txt", "/home/hoge/dir/file.txt");
将原始路径和目标路径放入。
$("#form_email").keyup(function(){
var email = $('#form_email').val();
$.ajax({
type: "POST",
url: "json.php",
data: 'email='+email,
//成功時のコールバック
success: function (data, textStatus, xhr) {
if(data[0].count == 0){
$("#email_rst").text('OK');
}else{
$("#email_rst").text('NG');
}
}
});
});
制作日历
<?php
// 現在の年月を取得
$year = date('Y');
$month = date('n');
// 月末日を取得
$last_day = date('j', mktime(0, 0, 0, $month + 1, 0, $year));
$calendar = array();
$j = 0;
// 月末日までループ
for ($i = 1; $i < $last_day + 1; $i++) {
// 曜日を取得
$week = date('w', mktime(0, 0, 0, $month, $i, $year));
// 1日の場合
if ($i == 1) {
// 1日目の曜日までをループ
for ($s = 1; $s <= $week; $s++) {
// 前半に空文字をセット
$calendar[$j]['day'] = '';
$j++;
}
}
// 配列に日付をセット
$calendar[$j]['day'] = $i;
$j++;
// 月末日の場合
if ($i == $last_day) {
// 月末日から残りをループ
for ($e = 1; $e <= 6 - $week; $e++) {
// 後半に空文字をセット
$calendar[$j]['day'] = '';
$j++;
}
}
}
?>
<?php echo $year; ?>年<?php echo $month; ?>月のスケジュール
<br>
<br>
<table class="calender">
<tr class="week">
<th class="sunday">日</th>
<th>月</th>
<th>火</th>
<th>水</th>
<th>木</th>
<th>金</th>
<th class="saturday">土</th>
</tr>
<tr>
<?php $today = date('j'); ?>
<?php $cnt = 0; ?>
<?php foreach ($calendar as $key => $value): ?>
<td <?php if($value['day'] == $today) echo 'class="today"'; ?>>
<?php $cnt++; ?>
<?php if(!empty($value['day'])): ?>
<a href="">
<span class="day"><?php echo $value['day']; ?></span>
</a>
<?php endif; ?>
</td>
<?php if ($cnt == 7): ?>
</tr>
<tr>
<?php $cnt = 0; ?>
<?php endif; ?>
<?php endforeach; ?>
</tr>
</table>
学员可以通过在线视频综合学习服务『ウェブカツ!!』全面学习从WEB编程到创业的过程。
我们在各种编程学习网站和服务中发现了一个事实,即无法真正让人们学会如何自己制作网络服务。因此,我们创建了一项名为“ウェブカツ!!”的在线综合视频学习服务,旨在让人们可以学会自己制作网络服务!如果您感兴趣,请注册,谢谢。