PDOとは何なのか、PODってバンドなら知ってる。
pdoと打っているつもりがpodになりがち。
PDOとは「PHP DATA OBJECTS」の略。
$変数名=new PDO(….)
このように宣言される。
まず「$変数名」で入れる変数を決めて、
=で代入する
newはインスタンス(オブジェクト)を新しく作る
PDO()は()の引数でPDOクラスを使う(DBに接続するための情報が書かれる)
()の引数のPDOクラスでインスタンスを生成して、$変数に入れる。
オブジェクト指向の話。入門書にオブジェクト指向の解説は無い。
オブジェクトとインスタンスは同じ意味。
簡単に言うと、持たせたいパラメーターや関数のセット(クラス)を使って、
機能を持った入れ物を複製していける。RPGの酒場で仲間を増やすときに現れるように。
その後は、作成された戦士(オブジェクト)ごとに違いが出てくるが、
HP・MPなどの項目、覚えていける技、使えるアイテムは同じ。
魔法使いで使える技が違い、アイテムも一部制限されたとする、しかしHP・MPなど項目は同じ。
このあたりをオブジェクト指向で作ると楽になる。
$変数名=new PDO(….)この宣言で、変数に戦士が入っていると思えばいい。
戦士に名前を聞けば、教えてくれるし。
引数を渡し、技(メソッド)を使ってくれと言えばその結果を返してくれる。
$pdo->query(SQL文)
$pod オブジェクトに
-> 命令を出す アロー演算子
query メソッド ()のSQL文を実行する
(SQL文) SQLで書かれた命令文
PDOクラスのメソッドを把握して、SQL構文を覚えれば使えるようになる。
PDOStatementとは何なのか。
PDOクラスとPDOStatementクラスの2種類がある。
それぞれで用意されているメソッドも違う。
PDOStatementクラスはprepareメソッドで作られるインスタンス。
ややこしい話になっている。
$pdo=new PDO(….)
PDOクラスを使ったpodという名前のインスタンスができる。
簡単に言うと、DBに接続する段階
$sql=$pdo->prepare(SQL文)
PDOStatementクラスを使ったsqlという名前のインスタンスができる。
簡単に言うと、DB上でSQL命令文を入力した所(実行前)
変数sqlにはMYSQLに接続され、
命令文も打ち込まれている状態のオブジェクトが入っている。
それを実行するためのメソッドを呼び出し実行する。
$sql->execute()
簡単に言うとMYSQLの実行ボタンを押す。
queryメソッドにはprepareとexecuteの機能がある。
なぜ機能が分かれるのか。
SQL文にはPHPの変数を書いてはいけない。
以下のようにSQL文を書いてはいけない
SELECT * FROM user WHERE name=’$name’
‘;DELETE FROM user–と検索に入力されると
データーが削除されてしまう。SQLインジェクション
なので、繰り返すが
SQL文にはPHPの変数を書いてはいけない。
これを防ぐためにプレースホルダを使う
SQLの特殊文字をエスケープ処理、無効化することができる。
自分でエスケープせずに、プレースホルダを使う方が間違いがない。
:文字列 ダブルコロン+文字列でプレースホルダをしていする
プレースホルダ名は、カラム(列)名にする。
SELECT * FROM user WHERE name=:name”
この値を入れるために、prepareが使われる
その後bindValueで、プレースホルダに値をバインドする。
bindValue(‘:name’, $name, PDO::PARAM_STR);
(プレースホルダ名,バインドする値,データ形)
※バインドとは
割り当てる
まとめ
検索など、フォームの入力を使ってDBを検索する場合は
queryでは処理しないで、以下の手順を踏む。
prepareで変数部分をプレースホルダに置き換えたSQL文をセットする
bindValueでプレースホルダにPHPの変数を割り当てる。
その後、executeで実行する。
コメント