目次
基本的な仕組みに関して
1 2 3 |
<span class="cp"><?php</span> <span class="c1">//処理内容</span> <span class="cp">?></span> |
※<?php ?>で1ブロック。複数ブロックがあっても全て繋がってるのでブロックをまたいで処理可能
※「;」で終わるまでは改行や空白・スペースは無視される
※1つのファイルにphpのみ記述する(htmlなどない)なら最後の「?>」は省略しても良い
phpのコンパイルと実行
phpプログラムは「レキサー」と呼ばれるものでphpプログラムを解析し、構文をばらばらにのトークンへ分解する。
そして、「パーサー」と呼ばれるものがトークンをオペコードへ変換。
そのオペコードが実行される。
echoの仕組み
echoは評価値を文字列型へキャストしてから出力している
(なので、falseなど論理値は表示されない)(小数1.0は1になる)
※小数点も表示したいならprintfを使う
issetとemptyの違い
emptyは、0、””、nullがセットされていても、falseと評価。
issetは、nullの場合にfalseと評価
1 2 |
例)変数に0が入っていた場合 emptyだと変数の値が0だと空だと判断される。でもissetだとセットされていると判断される。 |
エラー関係
エラーは大まかに3種類。
1.コンパイル出来ない(実行以前で止まる) ➡ シンタックス(パース)エラー(syntax error)
2.実行が停止するもの ➡ フェイタルエラー(fatal error)
3.実行は継続されるが警告のでるもの。 ➡ 警告(warning)、注意(notice)
1は文法の間違いなどでコンパイル出来ないなど。
2は定義してない関数を呼び出そうとした場合など。
3は初期化してない変数をいきなり使ったりなど。
エラーの重要度高い順
E_PARSE
E_ERROR
E_WARNING
E_NOTICE
E_DEPRECATED
E_STRICT
E_DEPRECATED,E_STRICTはコーディング規約に関しての問題や将来的に廃止になる(非推奨)機能が使われている場合に発生。
ログを取る
ログというのはプログラムがどこまで動いたかを記録したもの。
エラーになった時にどこでエラーになっているのか判断しやすくなる。
1 2 3 4 5 6 |
<span class="cp"><?php</span> <span class="nb">error_reporting</span><span class="p">(</span><span class="k">E_ALL</span><span class="p">);</span> <span class="c1">//E_STRICTレベル以外のエラーを報告する</span> <span class="nb">ini_set</span><span class="p">(</span><span class="s1">'display_errors'</span><span class="p">,</span><span class="s1">'On'</span><span class="p">);</span> <span class="c1">//画面にエラーを表示させるか</span> <span class="nb">ini_set</span><span class="p">(</span><span class="s1">'log_errors'</span><span class="p">,</span><span class="s1">'On'</span><span class="p">);</span> <span class="c1">//ログを取るか</span> <span class="nb">ini_set</span><span class="p">(</span><span class="s1">'error_log'</span><span class="p">,</span><span class="s1">'php.log'</span><span class="p">);</span> <span class="c1">//ログの出力ファイルを指定</span> <span class="cp">?></span> |
@「アットマーク」でエラー非表示
phpでの@(アットマーク)はエラー制御演算子で、関数や変数の前につける。
これを付けた関数や変数でエラーを出力しないようにする。
変数に関して
変数名の前に「$」をつけて宣言する。変数名の大文字小文字は区別される。
1 |
<span class="nv">$a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> |
可変変数
変数の中に変数がある感じのもの。
1 2 3 4 |
<span class="cp"><?php</span> <span class="nv">$a</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nv">$b</span> <span class="o">=</span> <span class="s1">'a'</span><span class="p">;</span> <span class="k">echo</span> <span class="nv">$$b</span><span class="p">;</span> |
※bが評価されて中に文字列「a」が入ってるので、「a」になってまたそれが評価されて中身の「1」が表示される。
変数のスコープ
javaでいうところの変数の前につくprotectedやprivateみたいなもの。
変数が参照(使える)範囲のこと。
グローバルスコープ
<?php ?>のブロック中に書かれたものは別のブロックやファイルでも使える。
ローカルスコープ
関数やクラスのメソッド内で宣言されたものはその中だけしか使えない。
スーパーグローバル変数
どこからでも使える変数。PHP実行時に自動的に定義される。
GETやPOSTなどもこのスーパーグローバル変数。
定数
1 |
<span class="nb">define</span><span class="p">(</span><span class="s1">'MOMO'</span><span class="p">,</span><span class="s1">'甘い'</span><span class="p">);</span> |
甘いという文字列が入ったMOMOという名前の定数を定義してる。
※定義可能なのは整数、小数、文字列のみ。配列やオブジェクトはダメ。
※定数名は大文字、小文字区別される。
型
phpには8つの型がある。メソッドによって自動でキャストされたりする(動的型付け言語)ので、どのタイミングでどうなるのかを把握しとく必要がある。
自動キャスト
・フォームから入力されてきた値は全て「文字列」なので注意!!
・if文などで比較する時も「$value = 1」とすると文字列の中身を整数へ自動キャストして比較している!!
・比較する時に数値っぽい文字列は数値へ自動キャストされる。
※”012345″と”12345″を「==」で比較すると「同じ」とみなされる
ヒアドキュメント
長い文字列を””や”で変数に格納するのは面倒なので、そういう時に使える。
「変数 = <<
文中に「{}」をつけて変数を書けば展開される。
※「EOI」じゃなくてもなんでもいい
※閉じる時の任意の文字列(この場合は「EOI;」)のある行には他の文字や空白などが含まれてるとエラーになる
論理型
BOOLEAN。真偽値を扱うもの。
if文などで論理型と論理型以外を比較すると自動的に論理型へキャストされて比較される。
整数0や空文字”、文字列の0、要素数が0の配列、nullは「false」と同じ。
null
nullが代入されてるもの、値が何もはいってないもの、unset()されてるものは「null」
nullが入っている変数は「定義された変数」とみなされる。
文字列
「.」で連結できる
1 2 3 |
<span class="nv">$a</span> <span class="o">=</span> <span class="s1">'aiu'</span><span class="p">;</span> <span class="nv">$b</span> <span class="o">=</span> <span class="s1">'eo'</span><span class="p">;</span> <span class="nv">$c</span> <span class="o">=</span> <span class="nv">$a</span><span class="o">.</span><span class="nv">$b</span><span class="p">;</span> |
if文以外の条件式記述方法
if文を書くより分量少なくてすむ。
1 |
<span class="nv">$value</span> <span class="o">=</span> <span class="nb">isset</span><span class="p">(</span><span class="nv">$a</span><span class="p">)</span> <span class="o">?</span> <span class="nv">$a</span> <span class="o">:</span> <span class="s1">'none'</span><span class="p">;</span> |
※もし、変数aが空じゃなければ変数aを代入。空なら文字列noneを代入する。
ページを移動する
headerファンクションはhtmlが出力される前に実行しないとダメ。
1 |
<span class="nb">header</span><span class="p">(</span><span class="s1">'Location:移動先のURL'</span><span class="p">);</span> |
他のphpファイルを読み込む
1 2 3 4 5 |
<span class="x">//一度きりの読み込みなら</span> <span class="cp"><?php</span> <span class="k">include_once</span><span class="p">(</span><span class="s1">'check.php'</span><span class="p">);</span> <span class="cp">?></span> <span class="x">//何度も読み込めるもの</span> <span class="cp"><?php</span> <span class="k">include</span><span class="p">(</span><span class="s1">'check.php'</span><span class="p">);</span> <span class="cp">?></span> |
その他に
1 2 3 4 5 |
<span class="x">//一度きりの読み込みなら</span> <span class="cp"><?php</span> <span class="k">require_once</span><span class="p">(</span><span class="s1">'check.php'</span><span class="p">);</span> <span class="cp">?></span> <span class="x">//何度も読み込めるもの</span> <span class="cp"><?php</span> <span class="k">require</span><span class="p">(</span><span class="s1">'check.php'</span><span class="p">);</span> <span class="cp">?></span> |
もある。違いは、requireの場合は読み込みエラーになったら実行停止するが、includeは警告のみ。
check.phpを1回だけ読み込ませる。
なので、各ページで同じ処理をする場合は1つのPHPファイルにその処理を書いて、
各ページでそのファイルを読み込む様にすればいい。
1 |
<span class="cp"><?php</span> <span class="k">require</span><span class="p">(</span><span class="s1">'check.php'</span><span class="p">);</span> <span class="cp">?></span> |
でもいい。違いはよく分からない。
配列
phpの配列はハッシュやマップなどの区別はなく、全部「連想配列」。
どんな型の値でも入れられる。
キーが重複してた場合は上書きされる。
配列の初期化
1 |
<span class="nv">$arr</span><span class="p">[];</span> |
ブラケット「[]」をつけると、その変数は「配列」として初期化される。
色々な配列の書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<span class="mf">1.</span> <span class="nv">$array1</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"あいうえお"</span><span class="p">;</span> <span class="nv">$array1</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"かきくけこ"</span><span class="p">;</span> <span class="nv">$array1</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"さしすせそ"</span><span class="p">;</span> <span class="mf">2.</span> <span class="nv">$array2</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"あいうえお"</span><span class="p">;</span> <span class="nv">$array2</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"かきくけこ"</span><span class="p">;</span> <span class="nv">$array2</span><span class="p">[]</span> <span class="o">=</span> <span class="s2">"さしすせそ"</span><span class="p">;</span> <span class="mf">3.</span> <span class="nv">$array3</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s2">"あいうえお"</span><span class="p">,</span> <span class="s2">"かきくけこ"</span><span class="p">,</span> <span class="s2">"さしすせそ"</span><span class="p">);</span> <span class="mf">4.</span> <span class="nv">$array4</span><span class="p">[</span><span class="s2">"a"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"あいうえお"</span><span class="p">;</span> <span class="nv">$array4</span><span class="p">[</span><span class="s2">"ka"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"かきくけこ"</span><span class="p">;</span> <span class="nv">$array4</span><span class="p">[</span><span class="s2">"sa"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"さしすせそ"</span><span class="p">;</span> <span class="mf">5.</span> <span class="nv">$array5</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span> <span class="s2">"a"</span> <span class="o">=></span> <span class="s2">"あいうえお"</span><span class="p">,</span> <span class="s2">"ka"</span> <span class="o">=></span> <span class="s2">"かきくけこ"</span><span class="p">,</span> <span class="s2">"sa"</span> <span class="o">=></span> <span class="s2">"さしすせそ"</span> <span class="p">);</span> |
配列への値の追加・削除
1 2 3 |
<span class="nv">$value</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'a'</span><span class="p">,</span><span class="s1">'b'</span><span class="p">,</span><span class="mi">7</span><span class="p">);</span> <span class="c1">//もしくは</span> <span class="o">&</span><span class="nx">value</span><span class="p">[]</span> <span class="o">=</span> <span class="s1">'d'</span><span class="p">;</span> |
1 |
<span class="nb">array_push</span><span class="p">(</span><span class="nv">$value</span><span class="p">,</span> <span class="s1">'a'</span><span class="p">);</span> |
1 |
<span class="nb">array_pop</span><span class="p">(</span><span class="nv">$value</span><span class="p">);</span> |
連想配列を使う
1 |
<span class="nv">$items</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="s1">'ケーキ'</span><span class="o">=></span><span class="s1">'あまい'</span><span class="p">,</span> <span class="s1">'レモン'</span><span class="o">=></span><span class="s1">'すっぱい'</span><span class="p">);</span> |
1 2 |
<span class="nv">$items</span><span class="p">[</span><span class="s1">'ケーキ'</span><span class="p">];</span> <span class="c1">//「あまい」が取り出される</span> |
1 2 3 |
<span class="k">foreach</span><span class="p">(</span><span class="nv">$items</span> <span class="k">as</span> <span class="nv">$key</span> <span class="o">=></span> <span class="nv">$value</span> <span class="p">{</span> <span class="nb">printf</span><span class="p">(</span><span class="nv">$key</span><span class="o">.</span><span class="s1">'は'</span><span class="o">.</span><span class="nv">$value</span><span class="o">.</span><span class="s1">'です'</span><span class="p">);</span> <span class="p">}</span> |
時刻を取得する
1 |
<span class="k">print</span><span class="p">(</span><span class="nb">date</span><span class="p">(</span><span class="nx">‘G’</span><span class="p">)</span><span class="o">.</span><span class="nx">’時’</span><span class="o">.</span><span class="nb">date</span><span class="p">(</span><span class="nx">‘i’</span><span class="p">)</span><span class="o">.</span><span class="nx">’分’</span><span class="o">.</span><span class="nb">date</span><span class="p">(</span><span class="nx">‘s’</span><span class="p">)</span><span class="o">.</span><span class="nx">’秒’</span><span class="p">);</span> |
またはもっと簡単にするなら
1 |
<span class="k">print</span><span class="p">(</span><span class="nx">‘現在は’</span><span class="o">.</span><span class="nb">date</span><span class="p">(</span><span class="nx">‘G時 i分</span> <span class="nx">s秒’</span><span class="p">)</span><span class="o">.</span><span class="nx">‘です’</span><span class="p">);</span> |
という感じで、
dateの中にパラメータを「G」とか「M」とか入れれば、「年」や「月」が取得できる。
※Warningが表示された場合
PHP5.1.0から「タイムゾーン」を設定する必要が有るため。Dateを使う前に
<?php date_default_timezone_set(‘Asia/Tokyo’); ?>
を追加すればOK。
時刻を日本時間に変更する
php.iniの設定を以下に変える
date.timezone = Asia/Tokyo
フォーム関係
フォームの値を取得する
複数選択のチェックボックスやリストボックスの値を取得
値は2次元配列で入っている。
1 2 |
<span class="nt"><input</span> <span class="na">type=</span><span class="s">”checkbox”</span> <span class="na">name=</span><span class="s">”reserve[]”</span> <span class="na">value=</span><span class="s">”男”</span><span class="nt">></span> <span class="nt"><input</span> <span class="na">type=</span><span class="s">”checkbox”</span> <span class="na">name=</span><span class="s">”reserve[]”</span> <span class="na">value=</span><span class="s">”女”</span><span class="nt">></span> |
という形で、name属性を配列にして、下のように2次元配列の形で取得する。
1 2 |
<span class="nv">$_POST</span><span class="p">[</span><span class="s1">'reserve'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s1">'reserve'</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> |
フォームに入力された値を表示する時のセキュリティ対策
フォームからjsなどのスクリプトをそのまま送られると実行されてしまうので、回避する。
ラジオボタンやチェックボックスにも使うこと!
1 |
<span class="nv">$value</span> <span class="o">=</span> <span class="nb">htmlspecialchars</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'name属性の名前'</span><span class="p">,</span> <span class="nx">ENT_QUOTES</span><span class="p">,</span><span class="s1">'UTF-8'</span><span class="p">);</span> |
「ENT_QUOTES」はシングルクウォーテーションも変換して回避するよ。というもの。
定数なので、ただの「3」でもいい。
フォームの値をチェック、変換する
半角の「数字」かチェックする
1 2 3 |
<span class="k">if</span><span class="p">(</span><span class="nb">is_numeric</span><span class="p">(</span><span class="nv">$age</span><span class="p">)){</span> <span class="c1">//処理</span> <span class="p">}</span> |
全角英数字を半角英数字へ変換する
1 |
<span class="nb">mb_convert_kana</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'age'</span><span class="p">],</span><span class="s1">'a'</span><span class="p">,</span><span class="s1">'UTF-8'</span><span class="p">);</span> |
「a」だと半角英数字へ。「n」にすると全角数字➡半角数字へ変換する。
他にも「」に何を入れるかで変換の仕方が違うので調べてみてね。
フォームに入力された内容が正しい形式か、正規表現を使ってチェックする
1 2 3 4 5 |
<span class="k">if</span><span class="p">(</span><span class="nb">preg_match</span><span class="p">(</span><span class="s2">"/|A|d{3}¥-¥d{4}¥z/"</span><span class="p">,</span> <span class="nv">$zip</span><span class="p">)){</span> <span class="c1">//処理</span> <span class="p">}</span><span class="k">else</span><span class="p">{</span> <span class="nv">$error</span><span class="p">[</span><span class="s1">'zip'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"郵便番号の形式が違います。"</span><span class="p">;</span> <span class="p">}</span> |
チェックボックス・ラジオボタンやリストボックスの値を記憶しておく
1 2 3 4 5 6 |
<span class="nt"><select</span> <span class="na">name=</span><span class="s">"prefecture"</span> <span class="na">id=</span><span class="s">"prefecture"</span><span class="nt">></span> <span class="nt"><option</span> <span class="na">value=</span><span class="s">""</span><span class="nt">></span>都道府県の選択<span class="nt"></option></span> <span class="cp"><?php</span> <span class="k">foreach</span><span class="p">(</span><span class="nv">$prf</span> <span class="k">as</span> <span class="nv">$key</span> <span class="o">=></span> <span class="nv">$value</span><span class="p">){</span> <span class="cp">?></span> <span class="nt"><option</span> <span class="na">value=</span><span class="s">"</span><span class="cp"><?php</span> <span class="k">print</span><span class="p">(</span><span class="nv">$value</span><span class="p">);</span> <span class="cp">?></span><span class="s">"</span> <span class="cp"><?php</span> <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'prefecture'</span><span class="p">])</span> <span class="o">&&</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s1">'prefecture'</span><span class="p">]</span> <span class="o">==</span> <span class="nv">$value</span><span class="p">){</span> <span class="k">print</span> <span class="s2">" selected"</span><span class="p">;</span> <span class="p">}</span><span class="cp">?></span><span class="nt">></span><span class="cp"><?php</span> <span class="k">print</span><span class="p">(</span><span class="nv">$value</span><span class="p">);</span> <span class="cp">?></span><span class="nt"></option></span> <span class="cp"><?php</span> <span class="p">}</span> <span class="cp">?></span> <span class="nt"></select></td></span> |
という感じで、
もしPOSTに値が入っていて、かつ、その値がボックスのvalueと同じなら属性にselectedをつける。
とやればいい。
※チェックボックスやラジオボタンはselectedのかわりに「checked」をつければいい。
次ページへ値を渡す
aタグで渡す
1 |
<span class="o"><</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">"hoge.php?text="</span><span class="o">.</span><span class="nb">urlencode</span><span class="p">(</span><span class="s1">'テスト'</span><span class="p">)</span><span class="o">.</span><span class="s2">" /></span> |
headerファンクションで渡す
1 2 |
<span class="nv">$url</span> <span class="o">=</span> <span class="s1">'negotiate.php?food_id='</span><span class="o">.</span><span class="nv">$_GET</span><span class="p">[</span><span class="s1">'food_id'</span><span class="p">];</span> <span class="nb">header</span><span class="p">(</span><span class="s2">"Location:</span><span class="si">$url</span><span class="s2">"</span><span class="p">);</span> |
※headerファンクションが実行されるまでに文字列などが出力されてしまっていると実行されない。
「Location : $url」という形で間空けてあると実行されないので注意!!
Cookie(クッキー)を使う
Cookieを使ってフォームに入力された値を記憶しておく
クッキーは時間指定をしてあげて、その時間が経ったらブラウザ側で破棄される仕組み。
1週間自動ログイン機能などに使える。
【処理順序】
1. まず、クッキーがあるかどうか確認
2. なければ、あげる(作る)
3. あれば、読み込む
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="c1">//ログインフォーム.php</span> <span class="k">if</span><span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_COOKIE</span><span class="p">[</span><span class="s1">'名前'</span><span class="p">])){</span> <span class="nv">$value</span> <span class="o">=</span> <span class="nv">$_COOKIE</span><span class="p">[</span><span class="s1">'名前'</span><span class="p">];</span> <span class="p">}</span><span class="k">else</span><span class="p">{</span> <span class="p">}</span> <span class="o"><</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">"checkbox"</span> <span class="nx">name</span><span class="o">=</span><span class="s2">"save"</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"on"</span> <span class="o">/><</span><span class="nx">label</span> <span class="k">for</span><span class="o">=</span><span class="s2">"save"</span><span class="o">></span><span class="nx">1週間ログインしたままにする</span><span class="o"></</span><span class="nx">label</span><span class="o">></span> <span class="c1">//ログイン後フォーム.php</span> <span class="k">if</span><span class="p">(</span><span class="nv">$save</span> <span class="o">==</span> <span class="s1">'on'</span><span class="p">){</span> <span class="nb">setcookie</span><span class="p">(</span><span class="s1">'クッキー名'</span><span class="p">,</span><span class="nx">保存する内容</span><span class="p">,</span><span class="nx">破棄までの時間(time</span><span class="p">()</span><span class="o">+</span><span class="mi">60</span><span class="o">*</span><span class="mi">60</span><span class="o">*</span><span class="mi">24</span><span class="o">*</span><span class="mi">7</span><span class="nx">)</span><span class="p">);</span> <span class="p">}</span><span class="k">else</span><span class="p">{</span> <span class="c1">//空の値を入れる事でcookieを破棄する</span> <span class="nb">setcookie</span><span class="p">(</span><span class="s1">'クッキー名'</span><span class="p">,</span><span class="s1">''</span><span class="p">);</span> <span class="p">}</span> |
「setcookie」はヘッダーが送信される前に渡さないとエラーになるので注意。
timeは60秒×60分×24時間×7日で1週間になります。
セッション(SESSION)を使う
セッションはブラウザが閉じられるまでの間だけ保存できる仕組み。
会員登録時のフォームデータ記憶などに使える。
クッキーを使って、IDを受け渡して、次回訪問時にそのIDを元にデータを引っ張ってくる。
クッキーがOFFになってると使えない!!
1 2 3 4 |
1.セッションスタートする(session_start();) 2.セッション(例えば、$_SESSION[‘counter’])があるかどうか(issetで調べる) 3.なければ、セッションを作る($_SESSION[‘counter’]=0などとして) 4.セッションが必要なければ削除する。(session_unset();) |
※毎ページでセッションスタートさせてデータ取り出しする必要があるので、セッションスタートを省略したいならphp.iniファイルを書き換える。
※違うPCでセッションIDが読み取られれば、そのIDを使ってデータ取得出来てしまうので、
他にもIPアドレスを調べたり、ブラウザ種類でマッチさせたりと確認して認証する必要が有る。
データベースへのアクセス
PHPではMySQLデータベースへのアクセスには、PEAR DB、 PEAR MDB 、PEAR MDB2 、MySQL拡張モジュール、mySQLi 、PDO など色々な方法がある。
PDOを使ったMySQL
pdoはjavaのやつみたいにDBがポスグレだったりmysqlだったりしても同じ形式で書けば、変換してクエリーを出してくれる仕組み。
Windowsで使うにはphp.iniの設定が必要。
Pdoを使うにはpdoクラスのオブジェクトを作成して使う。
dbへの接続
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="nv">$dsn</span> <span class="o">=</span> <span class="s1">'mysql:dbname=test;host=localhost;charset=utf8'</span><span class="p">;</span> <span class="nv">$user</span> <span class="o">=</span> <span class="s1">'root'</span><span class="p">;</span> <span class="nv">$password</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span> <span class="nv">$options</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span> <span class="c1">// SQL実行失敗時に例外をスロー</span> <span class="nx">PDO</span><span class="o">::</span><span class="na">ATTR_ERRMODE</span> <span class="o">=></span> <span class="nx">PDO</span><span class="o">::</span><span class="na">ERRMODE_EXCEPTION</span><span class="p">,</span> <span class="c1">// デフォルトフェッチモードを連想配列形式に設定</span> <span class="nx">PDO</span><span class="o">::</span><span class="na">ATTR_DEFAULT_FETCH_MODE</span> <span class="o">=></span> <span class="nx">PDO</span><span class="o">::</span><span class="na">FETCH_ASSOC</span><span class="p">,</span> <span class="c1">// バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減)</span> <span class="c1">// SELECTで得た結果に対してもrowCountメソッドを使えるようにする</span> <span class="nx">PDO</span><span class="o">::</span><span class="na">MYSQL_ATTR_USE_BUFFERED_QUERY</span> <span class="o">=></span> <span class="k">true</span><span class="p">,</span> <span class="p">);</span> <span class="c1">// PDOオブジェクト生成</span> <span class="nv">$dbh</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PDO</span><span class="p">(</span><span class="nv">$dsn</span><span class="p">,</span> <span class="nv">$user</span><span class="p">,</span> <span class="nv">$password</span><span class="p">,</span> <span class="nv">$options</span><span class="p">);</span> |
※文字コードは「UTF-8」じゃなくて「utf8」だから注意!!
SQL文(クエリー)作成
1 |
<span class="err">$</span><span class="n">stmt</span> <span class="o">=</span> <span class="err">$</span><span class="n">db</span><span class="o">-></span><span class="nf">prepare</span><span class="p">(</span><span class="s1">'INSERT INTO message (name,body) VALUES (:name,:comment)'</span><span class="p">);</span> |
プレースホルダに値をセット
1 2 |
<span class="nv">$stmt</span><span class="o">-></span><span class="na">bindParam</span><span class="p">(</span><span class="s1">':name'</span><span class="p">,</span> <span class="nv">$name</span><span class="p">,</span> <span class="nx">PDO</span><span class="o">::</span><span class="na">PARAM_STR</span><span class="p">);</span> <span class="nv">$stmt</span><span class="o">-></span><span class="na">bindParam</span><span class="p">(</span><span class="s1">':comment'</span><span class="p">,</span> <span class="nv">$comment</span><span class="p">,</span> <span class="nx">PDO</span><span class="o">::</span><span class="na">PARAM_STR</span><span class="p">);</span> |
SQL文実行
1 |
<span class="err">$</span><span class="n">stmt</span><span class="o">-></span><span class="nf">execute</span><span class="p">(</span><span class="nf">array</span><span class="p">(</span><span class="err">$</span><span class="n">username</span><span class="p">,</span><span class="err">$</span><span class="n">message</span><span class="p">));</span> |
結果を1件ずつ処理
1 2 3 |
<span class="k">while</span><span class="p">(</span><span class="nv">$row</span> <span class="o">=</span> <span class="nv">$stmt</span><span class="o">-></span><span class="na">fetch</span><span class="p">(</span><span class="nx">PDO</span><span class="o">::</span><span class="na">FETCH_ASSOC</span><span class="p">)){</span> <span class="c1">//処理内容</span> <span class="p">}</span> |
dbを閉じる
PHPスクリプトが終了すればデータベースへの接続は閉じられますが、明示的に閉じる場合には作成したPDOクラスのオブジェクトに”NULL”を代入します。
1 |
<span class="nv">$dbh</span> <span class="o">=</span> <span class="k">null</span><span class="p">;</span> |
SQL文書いて処理を行う
1回だけ使用するようなSQL文をデータベースへ送信するにはPDOクラスで用意されている”query”メソッドを使います。
1 2 |
<span class="nv">$sql</span> <span class="o">=</span> <span class="s1">'select id, name from shouhin'</span><span class="p">;</span> <span class="nv">$stmt</span> <span class="o">=</span> <span class="nv">$dbh</span><span class="o">-></span><span class="na">query</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> |
preparedstatementを使ったSQL文
繰り返し使いそうなSQL文はプリペアードステートメントというSQL文のひな形をまず作ってから、
値を入れて実行する。
値の入れ方は2通り。「?」を使うものと「:name」などの名前つきパラメータを使う方法がある。
1 2 3 |
<span class="nv">$sql</span> <span class="o">=</span> <span class="s1">'select id, name from mypdo where id > ? AND id < ?'</span><span class="p">;</span> <span class="nv">$stmt</span> <span class="o">=</span> <span class="nv">$dbh</span><span class="o">-></span><span class="na">prepare</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> <span class="nv">$stmt</span><span class="o">-></span><span class="na">execute</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">));</span> |
1 2 3 |
<span class="nv">$sql</span> <span class="o">=</span> <span class="s1">'select id, name from mypdo where id > :kagen AND id < :jyougen'</span><span class="p">;</span> <span class="nv">$stmt</span> <span class="o">=</span> <span class="nv">$dbh</span><span class="o">-></span><span class="na">prepare</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> <span class="nv">$stmt</span><span class="o">-></span><span class="na">execute</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">':kagen'</span><span class="o">=></span><span class="mi">2</span><span class="p">,</span> <span class="s1">':jyougen'</span><span class="o">=></span><span class="mi">4</span><span class="p">));</span> |
SELECTで結果を取得する
PDO::FETCH_NUMを指定した場合は下記のようになります。
1 2 |
$sql = 'select id, name from shouhin'; $stmt = $dbh->query($sql); |
1 2 3 |
<span class="nv">$result</span> <span class="o">=</span> <span class="nv">$stmt</span><span class="o">-></span><span class="na">fetch</span><span class="p">(</span><span class="nx">PDO</span><span class="o">::</span><span class="na">FETCH_ASSOC</span><span class="p">);</span> <span class="k">print</span><span class="p">(</span><span class="nv">$result</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="k">print</span><span class="p">(</span><span class="nv">$result</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> |
PDO::FETCH_ASSOCを指定した場合は下記のようになります。
1 2 |
<span class="nv">$sql</span> <span class="o">=</span> <span class="s1">'select id, name from shouhin'</span><span class="p">;</span> <span class="nv">$stmt</span> <span class="o">=</span> <span class="nv">$dbh</span><span class="o">-></span><span class="na">query</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> |
1 2 3 |
<span class="nv">$result</span> <span class="o">=</span> <span class="nv">$stmt</span><span class="o">-></span><span class="na">fetch</span><span class="p">(</span><span class="nx">PDO</span><span class="o">::</span><span class="na">FETCH_ASSOC</span><span class="p">);</span> <span class="k">print</span><span class="p">(</span><span class="nv">$result</span><span class="p">[</span><span class="s1">'id'</span><span class="p">]);</span> <span class="k">print</span><span class="p">(</span><span class="nv">$result</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]);</span> |
PDO::FETCH_BOTHを指定した場合(又は引数を省略した場合)は、どちらの形式でも利用が可能です。
取得したデータをフェッチしてループで使う
1 2 3 4 5 |
<span class="cp"><?php</span> <span class="k">while</span><span class="p">(</span><span class="nv">$table2</span> <span class="o">=</span> <span class="nv">$stmt2</span><span class="o">-></span><span class="na">fetch</span><span class="p">(</span><span class="nx">PDO</span><span class="o">::</span><span class="na">FETCH_ASSOC</span><span class="p">)){</span> <span class="cp">?></span> <span class="x">内容</span> <span class="cp"><?php</span> <span class="p">}</span> <span class="cp">?></span> |
INSERTで挿入したデータのIDを取得する
1 |
<span class="nv">$id</span> <span class="o">=</span> <span class="nv">$stmt</span><span class="o">-></span><span class="na">lastInsertId</span><span class="p">();</span> |
ページング機能をつける
SELECTのクエリーの最後に「LIMIT 10」という形でつけると、1ページに表示される件数が10件になる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<span class="cp"><?php</span> <span class="nv">$page</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">'page'</span><span class="p">];</span> <span class="c1">//最初のページで10件表示させるため</span> <span class="k">if</span><span class="p">(</span><span class="nv">$page</span> <span class="o">==</span> <span class="s1">''</span><span class="p">){</span> <span class="nv">$page</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="nv">$page</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="nv">$page</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">//maxはどっちか大きい方を返すファンクション。この場合1より小さければ1が返る。</span> <span class="c1">//最終ページを取得する</span> <span class="nv">$sql</span> <span class="o">=</span> <span class="s1">'SELECT COUNT(*) AS cnt FROM テーブル名'</span><span class="p">;</span> <span class="nv">$stmt</span> <span class="o">=</span> <span class="nv">$dbh</span><span class="o">-></span><span class="na">prepare</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span> <span class="nv">$table</span> <span class="o">=</span> <span class="nb">mysql_fetch_assoc</span><span class="p">(</span><span class="nv">$stmt</span><span class="p">);</span> <span class="nv">$maxPage</span> <span class="o">=</span> <span class="nb">ceil</span><span class="p">(</span><span class="nv">$table</span><span class="p">[</span><span class="s1">'cnt'</span><span class="p">]</span> <span class="o">/</span> <span class="mi">10</span><span class="p">);</span> <span class="nv">$page</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="nv">$page</span><span class="p">,</span> <span class="nv">$maxPage</span><span class="p">);</span> <span class="c1">//端数が出ても切り上げさせる。2.4ページ➡3ページになる。</span> <span class="nv">$start</span> <span class="o">=</span> <span class="p">(</span><span class="nv">$page</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">10</span><span class="p">;</span> <span class="nv">$sql</span> <span class="o">=</span> <span class="s1">'SELECT * FROM テーブル名 ORDER BY date LIMIT'</span><span class="o">.</span><span class="nv">$start</span><span class="o">.</span><span class="s1">',10'</span><span class="p">;</span> <span class="cp">?></span> <span class="x">//html部分</span> <span class="x">//1ページ目なら前ページへは出さず、maxページなら次へページは出さないようにする</span> <span class="cp"><?php</span> <span class="k">if</span><span class="p">(</span><span class="nv">$page</span> <span class="o">></span> <span class="mi">1</span><span class="p">){</span> <span class="cp">?></span> <span class="x"><a href="現在のページパス?page=</span><span class="cp"><?php</span> <span class="k">print</span><span class="p">(</span><span class="nv">$page</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="cp">?></span><span class="x">">前のページへ</a></span> <span class="cp"><?php</span> <span class="p">}</span> <span class="cp">?></span> <span class="cp"><?php</span> <span class="k">if</span><span class="p">(</span><span class="nv">$page</span> <span class="o"><</span> <span class="nv">$maxPage</span><span class="p">){</span> <span class="cp">?></span> <span class="x"><a href="現在のページパス?page=</span><span class="cp"><?php</span> <span class="k">print</span><span class="p">(</span><span class="nv">$page</span> <span class="o">+</span><span class="mi">1</span><span class="p">);</span> <span class="cp">?></span><span class="x">">次のページへ</a></span> <span class="cp"><?php</span> <span class="p">}</span> <span class="cp">?></span> |
LIMITが「1,5」「5,5」「10,5」と増えていって表示する件数を指定できる。
文字列操作
文字を切り取る・切り抜く・抜き出す
1 2 3 |
<span class="nv">$text</span> <span class="o">=</span> <span class="s1">'abcdef'</span><span class="p">;</span> <span class="nv">$result</span> <span class="o">=</span> <span class="nb">substr</span><span class="p">(</span><span class="nv">$text</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">);</span> <span class="c1">// "ef" を返す</span> <span class="nv">$result</span> <span class="o">=</span> <span class="nb">substr</span><span class="p">(</span><span class="nv">$text</span><span class="p">,</span> <span class="o">-</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="c1">// "d" を返す</span> |
「-(マイナス)」で指定すれば、後ろから何文字を抜き出す。
引数を二つ指定すれば、「何文字目から」「何文字分を」抜き出す。
文字を丸める(一定文字以上は…にして省略するとか)
1 |
<span class="nb">mb_strimwidth</span><span class="p">(</span><span class="nv">$a</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">10</span><span class="p">,</span><span class="s1">'...'</span><span class="p">,</span><span class="s1">'UTF-8'</span><span class="p">)</span> |
※変数aの中の文字列を0から10まで(日本語は2つで1文字)表示し、それ以上のものは..にする。
文字化けする場合は、最後に文字コードをつける。
※Mysqlと違って’UTF-8’と書くので注意!!(”を忘れないこと。大文字で書くこと。)
ファイル操作
ファイル読み込み
1 2 |
<span class="nv">$data</span> <span class="o">=</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="s2">"読み込むファイルパス"</span><span class="p">);</span> <span class="k">print</span><span class="p">(</span><span class="nv">$data</span><span class="p">);</span> <span class="c1">//そのままファイルの中身が見れる</span> |
読み込みと表示を同時に行う場合
1 |
<span class="nb">readfile</span><span class="p">(</span><span class="s2">"パス"</span><span class="p">);</span> |
ファイルに追記
1 2 3 |
<span class="nv">$data</span> <span class="o">=</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'読み込むファイルパス'</span><span class="p">);</span> <span class="c1">//getでファイル読み込んで</span> <span class="nv">$data</span> <span class="o">.=</span> <span class="s1">'内容'</span><span class="p">;</span> <span class="c1">//dataに追記して</span> <span class="nb">file_put_contents</span><span class="p">(</span><span class="s1">'書き込むファイルパス'</span><span class="p">,</span><span class="nv">$data</span><span class="p">);</span> <span class="c1">//putして保存する</span> |
RSSやWebAPIなどで使われているXMLファイルを読み込む
※PHP5から使えるようになったファンクション
1 2 3 4 5 |
<span class="nv">$xml</span> <span class="o">=</span> <span class="nb">simplexml_load_file</span><span class="p">(</span><span class="s1">'読み込むxmlファイルのURL'</span><span class="p">);</span> <span class="c1">//今回の場合、ファイル内の入れ子になった要素を指定してる</span> <span class="k">foreach</span><span class="p">(</span><span class="nv">$xml</span> <span class="o">-></span> <span class="na">channnel</span> <span class="o">-></span> <span class="na">item</span> <span class="k">as</span> <span class="nv">$item</span><span class="p">){</span> <span class="c1">//処理内容</span> <span class="p">};</span> |
ファイル書き込み
1 |
<span class="nv">$success</span> <span class="o">=</span> <span class="nb">file_put_contents</span><span class="p">(</span><span class="s1">'書き込むパス'</span><span class="p">,</span><span class="s1">'書き込む内容'</span><span class="p">);</span> |
※パスワードなど見られたら困るファイルはドキュメントルート(httpdocs,htdocsなど)の外に設置すること。
(URL打ち込むと見れちゃうので)
画像ファイルなどのアップロード
アップロードされた画像の受信
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="c1">//1.フォームを用意(methodは必ずpost。enctypeは下記のようにする)</span> <span class="o"><</span><span class="nx">form</span> <span class="nx">action</span><span class="o">=</span><span class="s2">""</span> <span class="nx">method</span><span class="o">=</span><span class="s2">"post"</span> <span class="nx">enctype</span><span class="o">=</span><span class="s2">"multipart/form-data"</span><span class="o">></span> <span class="c1">//2.フォームから送られたファイルを受信</span> <span class="nv">$file</span> <span class="o">=</span> <span class="nv">$_FILES</span><span class="p">[</span><span class="s1">'my_img'</span><span class="p">];</span> <span class="c1">//3.受信したファイルからいろいろな情報が取れるので、いろいろやる</span> <span class="nv">$file</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="c1">//ファイル名</span> <span class="nv">$file</span><span class="p">[</span><span class="s1">'type'</span><span class="p">]</span> <span class="c1">//ファイルタイプ(拡張子) ※アバウトなので拡張子判定には使わない方がいい</span> <span class="nv">$file</span><span class="p">[</span><span class="s1">'tmp_name'</span><span class="p">]</span> <span class="c1">//アップロードした一時保管ファイル場所</span> <span class="nv">$file</span><span class="p">[</span><span class="s1">'error'</span><span class="p">]</span> <span class="c1">//エラー内容</span> <span class="nv">$file</span><span class="p">[</span><span class="s1">'size'</span><span class="p">]</span> <span class="c1">//ファイルサイズ</span> <span class="c1">//4.自分のサーバへ送る</span> <span class="nv">$filepath</span> <span class="o">=</span> <span class="s1">'送り先ファイルパス'</span><span class="p">;</span> <span class="nb">move_uploaded_file</span><span class="p">(</span><span class="nv">$file</span><span class="p">[</span><span class="s1">'tmp_name'</span><span class="p">],</span><span class="s1">'/picture/'</span><span class="o">.</span><span class="nv">$filepath</span><span class="p">);</span> <span class="c1">//移動元のファイルパスと移動先パス</span> <span class="c1">//上のファンクション結果はboolean値で返ってくる</span> |
画像ファイルの移動
フォーム画面から確認画面へ移る際、指定された画像を一時保管からサーバへ移すが、
確認画面から「戻る」を押した場合、ファイルが残ってしまうので、
いったん、一時保管からサーバ上の一時保管へ移し、登録完了時にサーバ一時保管からサーバの画像フォルダへ移動し、
戻るボタンを押した際には、サーバの一時保管ファイル内画像を消去する時などに使える。
1 |
<span class="nb">rename</span><span class="p">(</span><span class="s2">"/tmp/file.txt"</span><span class="p">,</span> <span class="s2">"/home/hoge/dir/file.txt"</span><span class="p">);</span> |
移動元パスと移動先パスを入れる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$("#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'); } } }); }); |
カレンダー作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<?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プログラミングから起業までを一貫して学べるオンライン動画総合学習サービス『ウェブカツ!!』
様々なプログラミング学習サイトやサービスでは正直な所、自分でWEBサービスを作れるようにはならないため、「自分でWEBサービスを作れるようになる!」をゴールとしたオンライン動画総合学習サービス『ウェブカツ!!』を立ち上げました。興味ある方は登録よろしくお願いいたします。