前回では、DB接続とquery()を使ったSQL文発行を学びました。
しかし、このquery()はSQL文の使いまわしがあまりうまく出来ません。
特にユーザに検索条件を入力させるようなプログラムを書く場合、
すべての条件のSQL文を用意しなければならず、使い勝手がよくありません。
そんな時のために用意されているのがプリペアドステートメントです。
前回の検索処理をプリペアドステートメントを使って書き換えてみましょう。
今回も前回と同じテーブルを使用します。
<?php
$connect = new mysqli("localhost", "user", "password");
if($connect -> connect_error){
print $connect -> connect_errno;
exit();
}
//SQL文
$sql = "select * from userData where name = ?";
//プリペアドステートメント
if($result = $connect -> prepare($sql)){
//検索条件に値を格納
$result -> bind_param("s","tanaka");
//SQL文の実行
$result -> execute();
//検索結果を変数にセットする準備(バインド)
$result -> bind_result($name, $age, $birth);
//検索結果を変数に格納
$result -> fetch();
//結果表示
print $name." ".$age." ".$birth."<br>";
$result -> close();
}
$connect -> close();
?>
tanaka 20 11/6
プリペアドステートメントでは、SQL文中に「?」を入れることで検索条件を変えることが出来るようになっています。
SQL文に値を格納するのがbind_param()です。
bind_param("値の型", 値);
i:integer
d:double
s:String
b:blob
「?」が複数ある場合は左から順に指定していきます。
$sql = "select * from userData where name=? and age=? and birth=? ";
$name = "tanaka";
$age = 20;
$birth = "11/6";
bind_param("sis", $name, $age, $birth);
date(日付型)の場合は”s”を指定します。
検索条件に値を格納してからSQL文を実行します。実行するにはexecute()を呼びます。
$resultにはこのSQL文の実行結果が格納されていますが、取得するには準備が必要です。
それが、bind_result()です。
bind_result($変数, $変数, ...);
ここでは、実行結果を格納する変数を宣言します。実行したSQL文でヒットする列数分の変数を用意するといいでしょう。
bind_result()では、結果が変数に格納されるわけではありません。
実際に変数に結果を格納するのがfetch()です。
fetch()では、bind_result()で宣言した変数に結果が格納されていきます。
実行結果が複数レコードある場合は、whileなどの繰り返し処理が必要です。
前回と今回で学んだquery()とprepare()を使うと大体のDB操作(insert, update, select, delete, …etc)は出来るはずです。
後は、SQL文の書き方を勉強すれば大丈夫です。
ということでDB操作については今回でおしまいです。


