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

mysql関数はPHP 5.5.0 で非推奨になりました。
オブジェクト指向でのmysqliを用いたDBへの接続、クエリ発行と取得方法をmysql関数と比較しながら記載します。
また、プリペアードステートメントでSELECT * のクエリが使えなくなってしまいましたので、使い勝手を元に戻すためのおまじない関数を紹介します。
なお、エラーチェック、文字コード設定(mysqli_set_charset)等は省略します。

#mysqliを便利に使うためのおまじない
```php:おまじない関数
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への接続
```php:mysql
$link = mysql_connect('Host or IP', 'User', 'Pass');
$db_selected = mysql_select_db('DBName', $link);
```

:arrow_down:

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


#使用例
##SELECT文
```php:mysql

//mysqlパターン１：クエリ直打ち

//クエリの作成
$query=sprintf("SELECT * FROM tbl_name WHERE user = '%s' ", mysql_real_escape_string($user_input_name));
//クエリの実行
$result = mysql_query($query);
//出力
print ("\n mysqlパターン１ \n");
while ($row = mysql_fetch_assoc($result)) {
  print $row['user']."/".$row['address'];
  print "\n";
}


//mysqlパターン２：プリペアードステートメント（PDO）

//クエリの作成
$stmt = $dbh->prepare("SELECT * FROM tbl_name WHERE user = ?");
//変数のバインド
$stmt->bindParam(1, $user_input_name);
//クエリの実行
$stmt->execute();
//出力
print ("\n mysqlパターン２ \n");
while ($row = $stmt->fetch()) {
  print $row['user']."/".$row['address'];
  print "\n";
}

```

:arrow_down:


```php:mysqli

//mysqliパターン１：クエリ直打ち

//クエリの作成
$query = sprintf("SELECT * FROM tbl_name WHERE user = '%s' ", $mysqli->real_escape_string($user_input_name));
//クエリの実行
$result = $mysqli->query($query);
//出力
print ("\n mysqliパターン１ \n");
while ($row = mysqli_fetch_assoc($result)) {
  print $row['user']."/".$row['address'];
  print "\n";
}

//mysqliパターン２：プリペアードステートメント

$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パターン２ \n");
while ($stmt->fetch()) {
  print $col1."/".$col2;
  print "\n";
}

//mysqliパターン３：プリペアードステートメント(旧形式対応版)

$res = mysqli_prepare_bind_execute_fetch_assoc($mysqli, "SELECT * FROM tbl_name WHERE user = ?", array("s",$user_input_name));
print ("\n mysqlパターン３ \n");
foreach ($res as $row) {
  print $row['user']."/".$row['address'];
  print "\n";
}
```

##パラメータが多変数の場合
プレースホルダーの数に対応して、第一引数に型を加え、第二引数以降に変数を列挙する。

```php:mysqli

//mysqliパターン２：プリペアードステートメント
$stmt->bind_param("ss", $user_input_name,$user_input_address);

//mysqliパターン３：プリペアードステートメント(旧形式対応版)
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 *　が使える
　・パラメータをバインドする必要があるが、変数は参照でなくても良い
　・結果変数をこれまでのように連想配列で取得できる