MySQLi
MySQL関数を改良した形式のものでオブジェクト指向型と手続き型の2つの記述方法がある。
プリペアドステートメントやトランザクション処理が組み込まれている
サンプル(オブジェクト指向型)
プリペアド:ケース1
<?php
// 接続
$mysqli = new mysqli('localhost', 'root', '', 'testdb');
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
echo "<pre>";var_dump($mysqli);echo "</pre>";
/* プリペアドステートメントを作成します */
$sql = "
SELECT
col1
, col2
FROM
testtable1
WHERE
col1 = ?
";
// バインドデータ設定
$key = 1;
if ($stmt = $mysqli->prepare($sql)) {
/* マーカにパラメータをバインドします */
$stmt->bind_param("i", $key); // バインドする変数に設定して送る
/* クエリを実行します */
$stmt->execute();
/* 結果変数をバインドします */
$stmt->bind_result($col1, $col2); // バインドする変数分設定
/* 値を取得します */
$stmt->fetch();
printf("%s : %s\n", $col1, $col2);
/* ステートメントを閉じます */
$stmt->close();
}
// 切断
$mysqli->close();
?>
プリペアド:ケース2(SQLのバインドパラメータが可変になる場合)
<?php
// 接続
$mysqli = new mysqli('localhost', 'root', '', 'testdb');
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
echo "<pre>";var_dump($mysqli);echo "</pre>";
/* プリペアドステートメントを作成します */
$sql = "
SELECT
col1
, col2
FROM
testtable1
WHERE
col1 in( ? , ? )
";
// バインドデータ設定
$keyList = array('ii', 1, 2); // データ型で第1引数に設定する文字に注意
if ($stmt = $mysqli->prepare($sql)) {
/* マーカにパラメータをバインドします */
call_user_func_array(array($stmt, 'bind_param'), refValues($keyList)); // 引数内容が可変の場合はcall_user_func_arrayを使用
/* クエリを実行します */
$stmt->execute();
/* 結果変数をバインドします */
$meta = $stmt->result_metadata();
$parameters = array();
// result_metadataで取得したフィールド名の配列エリアを取得してバインドすることに使用
while ( $field = $meta->fetch_field() ) {
$parameters[] = &$row[$field->name];
}
call_user_func_array(array($stmt, 'bind_result'), refValues($parameters)); // 引数内容が可変の場合はcall_user_func_arrayを使用
/* 値を取得します */
while ( $stmt->fetch() ) {
$x = array();
foreach( $row as $key => $val ) {
$x[$key] = $val;
}
echo "<hr />";
var_dump($x);
}
printf("%s : %s\n", $col1, $col2);
/* ステートメントを閉じます */
$stmt->close();
}
// 切断
$mysqli->close();
?>
<?php
/**
* 配列の内容を参照形式で設定する
*/
function refValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
{
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
return $arr;
}
?>
トランザクション
<?php
// 接続
$mysqli = new mysqli('localhost', 'root', '', 'testdb');
if ($mysqli->connect_error) {
die('Connect Error (' . $mysqli->connect_errno . ') '
. $mysqli->connect_error);
}
echo "<pre>";var_dump($mysqli);echo "</pre>";
// 自動コミットをFALSEに設定
$mysqli->autocommit(FALSE);
/* プリペアドステートメントを作成します */
$sql = "
INSERT INTO testtable1(
col1
, col2
) values (
?
, ?
)
";
// バインドデータ設定
$keyList = array('is', 10, "xxxx"); // データ型で第1引数に設定する文字に注意
if ($stmt = $mysqli->prepare($sql)) {
/* マーカにパラメータをバインドします */
call_user_func_array(array($stmt, 'bind_param'), refValues($keyList)); // 引数内容が可変の場合はcall_user_func_arrayを使用
/* クエリを実行します */
$stmt->execute();
// 更新件数を表示
printf("%d Row inserted.\n", $stmt->affected_rows);
// ロールバック
$mysqli->rollback();
/* ステートメントを閉じます */
$stmt->close();
}
// バインドデータ設定
$keyList = array('is', 11, "vvvv"); // データ型で第1引数に設定する文字に注意
if ($stmt = $mysqli->prepare($sql)) {
/* マーカにパラメータをバインドします */
call_user_func_array(array($stmt, 'bind_param'), refValues($keyList)); // 引数内容が可変の場合はcall_user_func_arrayを使用
/* クエリを実行します */
$stmt->execute();
// 更新件数を表示
printf("%d Row inserted.\n", $stmt->affected_rows);
// コミット
$mysqli->commit();
/* ステートメントを閉じます */
$stmt->close();
}
// 切断
$mysqli->close();
?>
<?php
/**
* 配列の内容を参照形式で設定する
*/
function refValues($arr){
if (strnatcmp(phpversion(),'5.3') >= 0) //Reference is required for PHP 5.3+
{
$refs = array();
foreach($arr as $key => $value)
$refs[$key] = &$arr[$key];
return $refs;
}
return $arr;
}
?>
サンプル(手続き型)
最終更新:2011年04月06日 16:23