mysqli_prepare()は、 mysqli_stmtステートメントオブジェクトを返すSQLステートメントを準備するために使用されます。例えば:
$mysqli = new mysqli("m66.net", "username", "password", "database");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$sql = "SELECT * FROM users WHERE email = ?";
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("前処理に失敗しました: " . $mysqli->error);
}
ここ、 ?パラメータープレースホルダーであり、特定の値は将来的にはbind_paramにバインドされます。
MySQLI_STMTオブジェクトは、一部のプロパティの取得と設定をサポートし、前処理ステートメントの動作を制御できます。 PHPは2つの関連する方法を提供します。
attr_get($ attr) :指定された属性の現在の値を取得します。
attr_set($ attr、$ value) :指定された属性の値を設定します。
たとえば、mysqliによってサポートされる属性定数は次のとおりです。
mysqli_stmt_attr_update_max_length :最大長を更新するかどうかを制御します。
mysqli_stmt_attr_cursor_type :カーソルタイプを設定します(非輪、読み取り専用カーソルなど)。
mysqli_stmt_attr_prefetch_rows :プリフェッチされた行の数。
カーソルを使用して大量のデータを処理し、すべての結果セットが一度にロードされないようにすると、カーソルプロパティを設定できます。
$sql = "SELECT * FROM large_table WHERE category = ?";
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
die("前処理に失敗しました: " . $mysqli->error);
}
// カーソルタイプをに設定します MYSQLI_CURSOR_TYPE_READ_ONLY
$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_READ_ONLY);
// バインドパラメーター
$category = 'books';
$stmt->bind_param("s", $category);
$stmt->execute();
// 現在のカーソルタイプを取得します
$currentCursorType = $stmt->attr_get(MYSQLI_STMT_ATTR_CURSOR_TYPE);
echo "現在のカーソルタイプはです: " . $currentCursorType . PHP_EOL;
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$stmt->close();
$mysqli->close();
上記の例は、ステートメントを準備した後にカーソルタイプを設定し、 attr_get()を使用して現在の属性を検証する方法を示しています。
execute()を呼び出す前に、カーソルタイプ、プリフェッチされた行数など、必要なすべてのプロパティを可能な限り設定して、実行中に有効にすることができることを確認します。
前処理とプロパティ設定の両方が失敗する可能性があります。ランタイムのクラッシュを避けるために、リターン値とハンドルエラーをよく検出してください。
カーソルタイプはメモリとパフォーマンスに影響し、特に大規模な結果セットを扱う場合、読み取り専用カーソル( mysqli_cursor_type_read_only )を使用することが通常より良い選択です。
一部のプロパティは、MySQLサーバーまたはPHPバージョンの古いバージョンではサポートされていない場合があります。開発中にターゲット環境のサポートを確認する必要があります。
mysqli_prepare()を合理的に組み合わせることで、 mysqli_stmt :: attr_getとattr_setは、コードのセキュリティを維持しながら、データベース操作をより柔軟で効率的にすることができます。適切なプロパティ、特にカーソルとプリフェッチされた行数を設定することにより、大量のデータを扱うときにパフォーマンスとリソースの使用を大幅に最適化できます。