まえがき
今回は、渡ってきたバラメータから
プリペアドステートメントを実行する、
そのメソッドの中身を考えてみる。
普通に考えると…
- sql文作成
- それをprepare
- ステートメントに値を渡す
- execute で Let's GO!!
- fetchで取得
それをザックリとコードにすると…
コード例
$sql = 'sql文';
$stmt = $pdo->prepare($sql);
$stmt->bindValue('値とか型の指定など');
$stmt->execute();
$result = $stmt->fetchAll();
で、これを前回のコードと混ぜ混ぜするなら…
作成中DBクラスのコード(一部抜粋)
DBクラス
// 例えば `users`テーブルの
// `name`フィールド内、
// `tarou`というユーザーを取る。
// $action = 'SELECT * ';
// $table = 'users';
// $where = array('name', '=', 'tarou');
// が、それぞれ渡ってきたとする。
public function action1($action, $table, $where = null) {
// 便宜上、色々カット!!
// 前回、最終的に分解されたものは、
// *1
$sql = "{$action} FROM {$table} WHERE {$field} {$operator} {$value}";
// となるが `$value` は `$sql` とは分けて、次に渡す。
}
public function action2($sql, $value) {
$stmt = $this->_pdo->prepare('$sql');
// ↑↑ こんな感じで実行したい。しかし、この $sql の中身は
// $sql('SELECT * FROM users WHERE name =') なので
// (*1) の $sql の最後に『"?"』をいれ、疑問符プレースホルダを用いる。
// *2
$stmt->bindValue(1, $value, PDO::PARAM_STR);
// *3
// この bindValue() 実行時点で値が決定するので、
// ('SELECT * FROM users WHERE name = tarou')
// というsql文が確定->発行。
$stmt->execute();
}
解説やら疑問やら…
いつも bindValue() する時には、
パラメータ名で指定ばかりだったので、
PHPマニュアルを拝見してビックリ!?
(*2)では、疑問符プレースホルダ を用いた場合、
bindValue() の第一引数で インデックス番号 での
指定できるようになります、と。(へぇ~~~
現状のコードでは、普通に'1'と記述していますが、
変数を作成して、ループで回してインクリメント。
ってな使い方で、複数の指定が可能になる。…はず。
あとがき
ちょっと疑問があるので、ココにメモメモ…。
-
PDO::PARAM_STRとPDO::PARAM_INTはどっちがベター? - ( ↑↑ bindValue と bindParam の勘違いww )
- もしくは文字列判定、数値判定して処理分け?
- さらに、複数の条件指定の方法は?
- さらにさらに、条件指定なしの場合には?
うーむ…とりあえず続きは帰ってから。