初版作成 2011.11
最終更新 2024.04.01
php は /usr/bin あるいは /usr/local/bin に インストールされる。 % php file.php で実行可能。 通常は apache から呼び出して使う。 環境変数などを参照する必要があるので、 実際に apache から動かしてみてデバッグする ケースが多い。 <注意!!!> apache から呼び出されるとき www-data などの 権限で呼び出される。ファイルのパーミッションは $ chmod 666 file.php のように、他人に対して読み込み許可を出す必要が ある。これを忘れてハマるケースがある。
php.ini の中を以下のように変更する default_charset = "UTF-8" mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = auto mbstring.http_output = pass mbstring.encoding_translation = Off mbstring.detect_order = SJIS,EUC-JP,JIS,UTF-8,ASCII mbstring.substitute_character = none; display_errors = On php.ini の場所は <?php phpinfo() ?> で得られる。
普通は <body> の中に <?php プログラム ?> ただし、クッキーを送るときは <head> の手前に置く 複数の場所に分けて書いたプログラムは一つと解釈される。
C++ と同じ // コメント /* コメント */
真偽値は TRUE or FALSE 小文字でもよい
C++ と同じ ; で区切る
$ で始まる。 宣言不要。 関数外で使うとグローバル 関数内で使うとローカル 関数内でグローバル変数を使いたいとき global $data; のように宣言する。
$moji = 'aa'.'bb'; 連結 $head = substr($line,0,2); 先頭から 2 文字取り出す $head = mb_substr($line,0,2); 同上 マルチバイト文字対応 $len = strlen($str); $len = mb_strlen($str); $euc = mb_convert_encoding($str,'UTF-8','EUC-JP'; euc --> utf-8 $str = trim($str) 左右の空白, tab, \n の切り落とし $str = implode('+',$array) perl の join $array = explode(' ',$str) perl の split mb_ereg("[あ-ん]",$cha) ひらがなかどうか調べる
print, echo はどちらも perl の print と同じ printf は C と同じ " のエスケープは \" echo $moji; echo "moji = {$moji}\n"; \n は 改行, { } がなくても動く場合がある。 echo "$a[1] $a[abc]\n"; 連想配列の添字を '' で囲むとエラーになる printf("<li><a href=\"%s\">%s</a></li>",$value,$key); print_r($array) () の内容を詳細に表示する
配列と連想配列は区別されない。 添字は整数または文字列。 普通の配列 $a = array(1,2); $a[0] = 1 $a[1] = 2 $b = array( 2 => 'aa', $b[2] = 'aa' 4 => 'bb'); $b[4] = 'bb' このとき count($b) は 2 ' の代わりに " でもよい。 連想配列 $a['aa'] = 'AA'; $a['bb'] = 'BB'; $a = array( 'aa' => 'AA', 'bb' => 'BB'); 削除 unset($a[0]); 要素を削除 unset($a); 配列全体を削除
$array は配列 foreach($array as $value){ echo "$value <br>"; } foreach($array as $key => $value){ echo "$key = $value <br>"; }
$a[0][0] = 1; $a[1][1] = 1; $a[1][2] = 1; $a[2][1] = 1; のように書ける。このとき count($a) : 3 count($a[0]) : 1 count($a[1]) : 2 count($a[2]) : 1 となる。 $c[0] = array(1,2); $c[1] = array(-1,-2,-3); $c[2] = array(10,11,12,13,14); のようにも書ける。全ての要素を書き出すには for( $i = 0; $i < count($c); $i++){ for( $j = 0; $j < count($c[$i]); $j++){ echo "$i $j : ".$c[$i][$j]."\n"; } } foreach( $c as $value ){ foreach( $value as $key2 => $value2 ){ echo "key2 = $key2 value2 = $value2 \n"; } }
C と同じ。ただし switch もループ構造とみなされる break; continue; break 2; 2 レベル抜ける continue 2; 2 レベル抜ける
if ( $a > $b ) { } elseif ( $a == $b ) { } else { }
スーパーグローバル変数 global 宣言不要 $_POST['key'] $_GET['key'] $_COOKIE['key'] 環境変数 getenv('REMOTE_ADDR') getenv('HTTP_REFERER')
isset($a['abc']) 定義されているか否か ctype_digit($a) 数値か否か
array_push($array,$data) $a = array_merge($a,$b) is_array($a) 配列か普通の変数か count($a) 配列の要素数 $array_count_values($array) 配列の要素数の種類をカウントして 連想配列として返す。
file() はファイルを全て読み込み、改行で区切って配列にする。 @ はエラーが発生してもスクリプトの実行を継続する命令。 or 以降を実行するための記号。 $lines = @file($fname) or exit('cannot open file.'); for( $i = 0; $i < count($lines); $i++){ echo $lines[$i]; } ----------- fopen, fgets, fputs, fclose は C とほぼ同じ fgets で取得した文字列の最後は 0d 0a の 2 byte が付いている。 「みるみる PHP がわかる本」によると、テキストの読み書きも b が 推奨されるらしい。 $f = @fopen($fname,"rb") or exit('cannot open file.'); while( feof($f) == false ){ // feof($f) は eof を確認したら true になる $str = fgets($f); // 行末まで読み込み echo $str."\r\n"; } fclose($f); 先頭まで巻き戻すとき rewind($f); 書き出すとき fputs($f,$str); ----------- readfile() はファイルを開いて内容を全て標準出力に出す。 @readfile($fname) or exit('cannot open file.');
読み込み $f = @fopen($fname,"rb") or exit("cannot open file."); while( !feof($f) ){ $array = fgetcsv($f); $str = implode(",",$array); echo $str."\n"; } fclose($f); 書き出し $array = array($a,$b,$c); $f = @fopen($fname,"ab") or exit("cannot open file."); fputscsv($f,$array); fclose($f);
@opendir($path) or exit("cannot open dir"); while( $f = readdir($dir) ){ echo $f."\n"; } closedir($path);
func($a); // 値渡し func(&$a); // 参照渡し 関数側は値渡し、参照渡しのどちらでも同じ構文 function func($a){ return($b); }
アップロード用 html <form method="post" action="upload_manage.php" enctype="multipart/form-data"> <input type="hidden" name="max_file_size" value="2000000"> アップロードファイル: <input type="file" name="f1" size="50"> <!-- name="fname" はダメ 原因不明 --> <p> <input type="submit" value="アップロード実行"> </form> 関係する php.ini のパラメータ file_uploads ファイルアップロードの可否 upload_tmp_dir upload_max_filesize post_max_size 「input の max_file_size」は「php.ini の upload_max_filesize」 より小さくする。 アップロード処理用 upload_manage.php <?php /* アップロードしたファイルをセーブするディレクトリは 777 にしておく。 www の権限で書き込めなくてはならない。 */ if ( is_uploaded_file($_FILES['f1']['tmp_name']) ){ $fname = $_FILES['f1']['name']; $tmp_fname = $_FILES['f1']['tmp_name']; $save_fname = "savefiles/".time()."-".$fname; $ret = move_uploaded_file($tmp_fname, $save_fname); if ( $ret == true ){ echo "ファイルのアップロードに成功しました。"; } else { echo "ファイルのアップロードに失敗しました。"; } } else { echo "ファイルが選択されていません。"; } ?>
header('location: index.php'); 移動先を指定する
クッキーを送る setcookie($key, $value, time()+3600, '/'); 第3引数は○秒。省略時はブラウザを終了するまで。 第4引数は適用されるディレクトリ。'/' はそのドメイン全て。省略時はカレントディレクトリ クッキーを読み取る if ( isset($_COOKIE['key']) ){ $value = htmlspecialchars($_COOKIE['key'], ENT_QUOTES); // html のエスケープ処理 }
date('Y / n / j H : i : s', filemtime($fname)); filetime はファイルの日付を整数で返す関数。 date はその値をフォーマット文字列に従って整形する関数。 Y 年 4 桁 n 月 先頭に 0 をつけない j 日 先頭に 0 をつけない H 時 24 時間単位 i 分 先頭に 0 をつける s 秒 先頭に 0 をつける