LoginSignup
2
2

More than 5 years have passed since last update.

データベースクラスを作成するぞ - vol.4

Last updated at Posted at 2015-08-17

まえがき

今回は、渡ってきたバラメータから
プリペアドステートメントを実行する、
そのメソッドの中身を考えてみる。

普通に考えると…

  1. sql文作成
  2. それをprepare
  3. ステートメントに値を渡す
  4. execute で Let's GO!!
  5. 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マニュアルを拝見してビックリ!?

PHPマニュアル - PDOStatement::bindValue

(*2)では、疑問符プレースホルダ を用いた場合、
bindValue() の第一引数で インデックス番号 での
指定できるようになります、と。(へぇ~~~

現状のコードでは、普通に'1'と記述していますが、
変数を作成して、ループで回してインクリメント。
ってな使い方で、複数の指定が可能になる。…はず。

あとがき

ちょっと疑問があるので、ココにメモメモ…。

  • PDO::PARAM_STRPDO::PARAM_INT はどっちがベター?
  • ( ↑↑ bindValue と bindParam の勘違いww )
  • もしくは文字列判定、数値判定して処理分け?
  • さらに、複数の条件指定の方法は?
  • さらにさらに、条件指定なしの場合には?

うーむ…とりあえず続きは帰ってから。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2