PHPでは、データベース操作は、開発者の日常業務の不可欠な部分です。効率を改善し、SQL注入攻撃を防ぐために、MySQLIによって拡張された準備されたステートメントを使用することは、強く推奨されるアプローチです。この記事では、PHPでMySQLI Fetch_Fields 、 Prepare and Bind_Resultの使用プロセスを詳細に紹介します。
まず、データベース接続を作成する必要があります。次に、準備方法を使用してSQLステートメントを準備できます。この方法は、SQLクエリをパラメーターとして受け入れ、準備されたステートメントオブジェクトを返します。
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$query = "SELECT id, name, email FROM users WHERE active = ?";
$stmt = $mysqli->prepare($query);
上記のコードでは、準備メソッドはSQLステートメントを事前に処理し、後続のパラメーターバインディングの準備をします。
次に、パラメーターをバインドする必要があります。 bind_paramメソッドは、実際のパラメーター値をSQLステートメントにバインドできます。この例では、クエリはアクティブフィールドを介してデータをフィルターしているため、代わりにパラメーターをバインドする必要がありますか?
$active = 1;
$stmt->bind_param("i", $active); // "i"整数タイプを示します
bind_paramメソッドの最初のパラメーターは、SQLステートメントの各パラメーターのタイプを表す文字列です。一般的なタイプは次のとおりです。
I :整数
D :ダブル精度の浮動ポイント
S :文字列
B :BLOBタイプデータ
この例では、整数型パラメーター( $ active )にバインドします。
パラメーターをバインディングした後、実行方法を使用してSQLステートメントを実行できます。
$stmt->execute();
現時点では、SQLクエリは実行されますが、データはまだ返されていません。 fetch_fieldsを介してクエリ結果の構造を取得し、 bind_resultを介して各列の値をバインドする必要があります。
fetch_fieldsメソッドは、列名、タイプなどを含むクエリ結果のフィールド情報を取得できます。後続の結果処理に使用できるフィールドオブジェクトの配列を返します。
$fields = $stmt->fetch_fields();
foreach ($fields as $field) {
echo "フィールド名: " . $field->name . "<br>";
echo "フィールドタイプ: " . $field->type . "<br>";
}
上記のコードは、各フィールドの名前とタイプを出力します。 FETCH_FIELDSメソッドによって返されたフィールドオブジェクトには、リッチメタデータが含まれています。これにより、開発者がデータベーステーブルの構造情報を取得できるようになります。
クエリを実行した後、クエリ結果の列をBIND_RESULTメソッドを介してPHP変数にバインドする必要があります。 BIND_RESULTメソッドを使用すると、変数を渡すことにより、結果のデータの各行を抽出できます。
$stmt->bind_result($id, $name, $email);
ここでは、クエリの結果のID 、名前、電子メールフィールドを、それぞれ$ ID 、 $ name 、 $ email変数にバインドします。
結果変数をバインディングした後、 fetchメソッドを使用して、rowごとにクエリ結果を抽出できます。
while ($stmt->fetch()) {
echo "ID: $id, Name: $name, Email: $email<br>";
}
Fetchメソッドは、データの行が正常に取得されたかどうかを示すブール値を返します。取得が成功した場合、現在の行のデータにバウンド変数を介してアクセスできます。
すべての操作が完了したら、準備されたステートメントとデータベース接続を閉じてリソースを解放することを忘れないでください。
$stmt->close();
$mysqli->close();
上記の手順を統合すると、最終的な完全なコードは次のとおりです。
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$query = "SELECT id, name, email FROM users WHERE active = ?";
$stmt = $mysqli->prepare($query);
$active = 1;
$stmt->bind_param("i", $active);
$stmt->execute();
$fields = $stmt->fetch_fields();
foreach ($fields as $field) {
echo "フィールド名: " . $field->name . "<br>";
echo "フィールドタイプ: " . $field->type . "<br>";
}
$stmt->bind_result($id, $name, $email);
while ($stmt->fetch()) {
echo "ID: $id, Name: $name, Email: $email<br>";
}
$stmt->close();
$mysqli->close();
?>
関連タグ:
fetch_fields