データベース操作にPHPを使用する場合、 mysqli_stmt :: bind_param()関数は、パラメーターをSQLクエリステートメントに結合し、SQLインジェクション攻撃を回避できる非常に重要なツールです。この関数は、前処理ステートメントに特に適しており、そのパラメータータイプは、クエリに渡された値を処理する方法を指定します。この記事では、mysqli_stmt :: bind_param()関数の一般的なパラメータータイプの詳細な説明を提供し、例を使用して実際の開発で使用する方法を理解するのに役立ちます。
まず、 bind_param()関数の基本的な構文を確認しましょう。
<span><span><span class="hljs-keyword">bool</span></span><span> mysqli_stmt::</span><span><span class="hljs-variable constant_">bind_param</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$types</span></span><span> , </span><span><span class="hljs-keyword">mixed</span></span><span> &</span><span><span class="hljs-variable">$var</span></span><span> , </span><span><span class="hljs-keyword">mixed</span></span><span> &$... )
</span></span>
$タイプ:バウンド変数のタイプを表す1つ以上の文字を含む文字列。各文字は、パラメーターのタイプを表します。
$ var、$ ... :これらはバインドする変数であり、 $型で指定された順序でバインドされます。
$型文字列の各文字はデータ型を表します。文字の一般的なタイプは次のとおりです。
I :整数を表します。
D :二重精度の浮動数(二重)を表します。
S :文字列を表します。
B :BLOB(バイナリ大きなオブジェクト)タイプを表すデータ。
整数パラメーターにバインドするために使用されます。これは最も一般的なタイプの1つであり、すべての整数データに適しています。
例:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE id = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"i"</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>); </span><span><span class="hljs-comment">// $idそれは整数です</span></span><span>
</span><span><span class="hljs-variable">$id</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
この例では、 $ IDはクエリステートメントのプレースホルダーに整数タイプとしてバインドされていますか? 。
Dは、通常、小数点または浮動小数点数を含むクエリで使用される二重精度の浮動数タイプのパラメーターをバインドするために使用されます。
例:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO products (price) VALUES (?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"d"</span></span><span>, </span><span><span class="hljs-variable">$price</span></span><span>); </span><span><span class="hljs-comment">// $priceこれは、二重精度の浮動数です</span></span><span>
</span><span><span class="hljs-variable">$price</span></span><span> = </span><span><span class="hljs-number">199.99</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
この例では、 $価格は、 Double Precision Floating Number TypeとしてSQLステートメントのプレースホルダーにバインドされています。
Sは、弦パラメーターを結合するための最も一般的なタイプの1つです。テキストデータであろうと数値形式の文字列であろうと、 Sが必要です。
例:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>); </span><span><span class="hljs-comment">// $usernameそれは文字列です</span></span><span>
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">"john_doe"</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
この例では、 $ usernameは文字列タイプにバインドされ、クエリはユーザー名を介して対応するユーザーを検索します。
Bは、画像やファイルなどのBLOBタイプデータなどのバイナリデータをバインドするために使用されます。このタイプは、多くの場合、大規模なデータボリュームまたはバイナリファイルを処理するために使用されます。
例:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO images (image_data) VALUES (?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"b"</span></span><span>, </span><span><span class="hljs-variable">$imageData</span></span><span>); </span><span><span class="hljs-comment">// $imageDataそれはバイナリデータです</span></span><span>
</span><span><span class="hljs-variable">$imageData</span></span><span> = </span><span><span class="hljs-title function_ invoke__">file_get_contents</span></span><span>(</span><span><span class="hljs-string">"path/to/image.jpg"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
この例では、 $ Imagedataは、通常、ファイルデータを挿入するために使用されるバイナリデータとしてクエリステートメントにバインドされています。
SQLステートメントに複数のプレースホルダーがいる場合、 bind_param()は複数の変数をバインドでき、各変数のタイプは$型の文字で表され、注文はプレースホルダーと一致する必要があります。
例:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"UPDATE users SET name = ?, age = ? WHERE id = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"ssi"</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>, </span><span><span class="hljs-variable">$id</span></span><span>);
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"Alice"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">30</span></span><span>;
</span><span><span class="hljs-variable">$id</span></span><span> = </span><span><span class="hljs-number">1</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span></span>
この例では、 $ nameは文字列にバインドされ、 $ ageは整数( i )にバインドされ、 $ idは整数( i )にバインドされます。 $タイプパラメーターは「SSI」であり、3つのプレースホルダーの型順序と一致しています。
タイプの厳格マッチ: bind_param()を呼び出す場合、境界型タイプが$型文字列で指定されたタイプと厳密に一致することを確認する必要があります。そうしないと、エラーまたは予期しない結果が得られます。
値への参照を渡す: bind_param()には、値ではなくパラメーターへの参照を渡す必要があります。参照の代わりに値を直接渡す場合、関数はこれらのパラメーターを正しく処理しません。
パラメータータイプとデータベースタイプの相関:実際の使用では、データベーステーブルのフィールドのデータ型に基づいて、バインドされたパラメータータイプを決定する必要があります。データベースフィールドがフローティング番号タイプの場合は、 Dを使用します。文字列タイプの場合は、 sを使用します。
mysqli_stmt :: bind_param()は、 SQLインジェクションとプロセスSQLクエリパラメーターを防ぐための非常に重要な機能です。パラメータータイプを正しく使用することにより、データベース操作がより安全で効率的であることを確認できます。実際の開発では、これらのタイプの文字を理解し、正しく使用すると、コードの保守性とセキュリティが大幅に向上します。
一般的なタイプには、整数( i )、二重精度の浮動数( d )、文字列( s )、およびバイナリデータ( b )が含まれます。複雑なデータベース操作を処理する場合、各パラメーターのタイプを正しくバインドすると、クエリステートメントが期待どおりに実行され、潜在的なSQLインジェクション攻撃からデータを保護します。