7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

mysqlユーザーのためのmysqliラッパー

Posted at

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への接続

mysql
$link = mysql_connect('Host or IP', 'User', 'Pass');
$db_selected = mysql_select_db('DBName', $link);

:arrow_down:

mysqli
// オブジェクト型:mysqliクラスをオブジェクト化して使う
$mysqli = new mysqli('Host or IP', 'User', 'Pass', 'DBName');

#使用例
##SELECT文

mysql

//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";
}

:arrow_down:

mysqli

//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

//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 * が使える
 ・パラメータをバインドする必要があるが、変数は参照でなくても良い
 ・結果変数をこれまでのように連想配列で取得できる

7
8
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
7
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?