PHPでは、データベース操作にMySQLI拡張機能を使用する場合、複数のSQLステートメントを実行することが一般的な要件です。特に、バッチ処理またはトランザクション制御が必要な場合、マルチステートメントの実行は効率を大幅に改善できます。各ステートメントの実行ステータスをより適切に制御するために、MySQLI_STMTオブジェクトはATTR_GETメソッドを提供します。これにより、開発者がステートメントの実行の属性を取得し、現在の実行ステータスを判断します。
この記事では、MySQLI_STMT :: ATTR_GET関数を使用してマルチステートメント実行中に実行ステータスを判断する方法についての詳細な説明を提供し、PHPコードの例と組み合わせて、この手法を理解して習得するのに役立ちます。
mysqli_stmt :: attr_getは、mysqliのmysqli_stmtクラスのメソッドであり、現在の前処理ステートメントのプロパティを取得するために使用されます。パラメーターとして属性定数を受信し、対応する属性の値を返します。一般的なプロパティは次のとおりです。
mysqli_stmt_attr_update_max_length :実行ステートメントが最大長さの情報を更新したかどうかを示します。
mysqli_stmt_attr_cursor_type :カーソルタイプを取得します。
その他のカスタムプロパティ。
これらのプロパティを検出することにより、現在のステートメントの実行を間接的に理解できます。
MySQLIは、 mysqli_multi_queryの呼び出しなど、マルチステートメントの実行をサポートし、各結果を順番に処理します。前処理ステートメント(MySQLI_STMT)については、複数のステートメントを実行し、各ステートメントの実行ステータスについて判断する必要がある場合があります。
特にカーソルタイプやデータの長さなどの複雑な属性が関与している場合、返品値を直接使用することで実行が成功するかどうかを判断するのに十分な詳細ではない場合があります。したがって、 ATTR_GETの助けを借りて、より多くの内部実行ステータス情報を取得できます。
次の例は、マルチステートメント実行中にMySQLI_STMT :: ATTR_GETを使用して実行ステータスを検出する方法を示しています。コード内のURLを含むすべてのドメイン名は、要件を満たすM66.NETに置き換えられます。
<?php
$mysqli = new mysqli("m66.net", "username", "password", "database");
// 接続を確認してください
if ($mysqli->connect_errno) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// 複数の文SQL,セミコロンを使用した分離
$sql = "INSERT INTO users (name, email) VALUES (?, ?);";
$sql .= "UPDATE stats SET total_users = total_users + 1;";
// 前処理ステートメントを準備します
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("前処理ステートメントは失敗しました: " . $mysqli->error);
}
// バインドパラメーター,最初のステートメントにパラメーターが必要だとします
$name = "チャン・サン";
$email = "zhangsan@m66.net";
$stmt->bind_param("ss", $name, $email);
// 执行複数の文
if ($stmt->execute()) {
// プロパティを取得して印刷します:最大長が更新されています
$updateMaxLength = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
echo "最大長さの情報を更新するかどうか: " . ($updateMaxLength ? "はい" : "いいえ") . "\n";
// マルチ配信セットの処理
do {
// 現在の結果のステータスまたは行数を取得します
$result = $stmt->get_result();
if ($result) {
echo "現在の結果セット行数: " . $result->num_rows . "\n";
$result->free();
} else {
// 結果が設定されていない場合,影響を受ける行の数を確認できます
echo "行数に影響を与えます: " . $stmt->affected_rows . "\n";
}
} while ($stmt->more_results() && $stmt->next_result());
} else {
echo "実行に失敗しました: " . $stmt->error . "\n";
}
$stmt->close();
$mysqli->close();
マルチステートメントSQL準備:複数のSQLステートメントを文字列にスプライスし、セミコロンで区切ります。
パラメーターを準備および結合する:準備とbind_paramを使用して、必要なパラメーターをバインドします。
実行ステートメント:コールエグェートは、マルチステートメントバッチ全体を実行します。
call attr_get : mysqli_stmt_attr_update_max_length属性を取得して、最大長さの情報が更新されているかどうかを判断し、実行効果を判断するのに役立ちます。
プロセス結果セット: get_resultを介して結果を取得したり、行数を出力したり、影響を受けた_rowsの影響を受ける行の数を取得します。
マルチルルトセットの移動: more_resultsとnext_resultを使用して、すべての結果を1つずつ処理します。
すべてのMySQLバージョンまたはドライバーがマルチステートメント前処理を完全にサポートするわけではなく、環境をサポートする必要があります。
ATTR_GETは限られた属性を取得し、特定の利用可能な属性はMySQLおよびPHPバージョンに依存します。
より複雑な実行ステータス監視をするには、エラー処理とロギングメカニズムを組み合わせることをお勧めします。
mysqli_stmt :: attr_get関数は、開発者が複数のステートメントを実行するときに実行ステータス情報の一部を取得し、実行結果の判断を支援するのに役立ちます。 Multi-Result Set Processingメカニズムと組み合わせることで、SQLバッチ実行のパフォーマンスと効果をより慎重に把握できます。
この記事の例と説明が、PHPでMySQLIマルチステートメント前処理を効率的かつ安全に使用し、ATTR_GETを使用して実行ステータスをより適切に制御するのに役立つことを願っています。スムーズなプログラミングをお祈りします!