mysql関数はPHP 5.5.0 で非推奨になりました。
オブジェクト指向でのmysqliを用いたDBへの接続、クエリ発行と取得方法をmysql関数と比較しながら記載します。
また、プリペアードステートメントでSELECT * のクエリが使えなくなってしまいましたので、使い勝手を元に戻すためのおまじない関数を紹介します。
なお、エラーチェック、文字コード設定(mysqli_set_charset)等は省略します。
#mysqliを便利に使うためのおまじない
function mysqli_prepare_bind_execute_fetch_assoc($mysqli,$stmt0,$params){
for($i = 0; $i < count($params); $i++){
if($i == 0){
$params2[$i] = $params[$i];
}else{
$params2[$i] = &$params[$i];
}
}
$stmt = $mysqli->prepare($stmt0);
if($params){
call_user_func_array(array($stmt, 'bind_param'), $params2);
}
$stmt->execute();
$meta = $stmt->result_metadata();
if($meta){ //return results
while ($field = $meta->fetch_field()) {
$parameters[] = &$row[$field->name];
}
call_user_func_array(array($stmt, 'bind_result'), $parameters);
while ($stmt->fetch()) {
foreach($row as $key => $val) {
$x[$key] = $val;
}
$results[] = $x;
}
return $results;
}
}
##DBへの接続
$link = mysql_connect('Host or IP', 'User', 'Pass');
$db_selected = mysql_select_db('DBName', $link);
// オブジェクト型:mysqliクラスをオブジェクト化して使う
$mysqli = new mysqli('Host or IP', 'User', 'Pass', 'DBName');
#使用例
##SELECT文
//mysqlパターン1:クエリ直打ち
//クエリの作成
$query=sprintf("SELECT * FROM tbl_name WHERE user = '%s' ", mysql_real_escape_string($user_input_name));
//クエリの実行
$result = mysql_query($query);
//出力
print ("\n mysqlパターン1 \n");
while ($row = mysql_fetch_assoc($result)) {
print $row['user']."/".$row['address'];
print "\n";
}
//mysqlパターン2:プリペアードステートメント(PDO)
//クエリの作成
$stmt = $dbh->prepare("SELECT * FROM tbl_name WHERE user = ?");
//変数のバインド
$stmt->bindParam(1, $user_input_name);
//クエリの実行
$stmt->execute();
//出力
print ("\n mysqlパターン2 \n");
while ($row = $stmt->fetch()) {
print $row['user']."/".$row['address'];
print "\n";
}
//mysqliパターン1:クエリ直打ち
//クエリの作成
$query = sprintf("SELECT * FROM tbl_name WHERE user = '%s' ", $mysqli->real_escape_string($user_input_name));
//クエリの実行
$result = $mysqli->query($query);
//出力
print ("\n mysqliパターン1 \n");
while ($row = mysqli_fetch_assoc($result)) {
print $row['user']."/".$row['address'];
print "\n";
}
//mysqliパターン2:プリペアードステートメント
$stmt = $mysqli->prepare("SELECT user, address FROM tbl_name WHERE user = ?");
$stmt->bind_param("s", $user_input_name);
//クエリの実行
$stmt->execute();
//結果変数をバインドします
$stmt->bind_result($col1, $col2);
//出力
print ("\n mysqlパターン2 \n");
while ($stmt->fetch()) {
print $col1."/".$col2;
print "\n";
}
//mysqliパターン3:プリペアードステートメント(旧形式対応版)
$res = mysqli_prepare_bind_execute_fetch_assoc($mysqli, "SELECT * FROM tbl_name WHERE user = ?", array("s",$user_input_name));
print ("\n mysqlパターン3 \n");
foreach ($res as $row) {
print $row['user']."/".$row['address'];
print "\n";
}
##パラメータが多変数の場合
プレースホルダーの数に対応して、第一引数に型を加え、第二引数以降に変数を列挙する。
//mysqliパターン2:プリペアードステートメント
$stmt->bind_param("ss", $user_input_name,$user_input_address);
//mysqliパターン3:プリペアードステートメント(旧形式対応版)
mysqli_prepare_bind_execute_fetch_assoc($mysqli, "SELECT * FROM tbl_name WHERE user = ? AND address = ?", array("ss", $user_input_name, $user_input_address));
#まとめ
mysqliでプリペアードステートメントを使う場合に
・select * が使えない
・パラメータをバインドする必要があるが、変数の参照でなくてはならない("hoge"や1などはエラー)
・結果変数をバインドし、バインドした変数を通じて結果を取得する
#mysqliで使えるおまじない関数のいいところ
mysqliでプリペアードステートメントを使う場合に
・select * が使える
・パラメータをバインドする必要があるが、変数は参照でなくても良い
・結果変数をこれまでのように連想配列で取得できる