前処理ステートメントは、SQLクエリの実行方法です。 SQLクエリを2つの部分に分割します。
プリプロセシング段階:SQLステートメントのテンプレートをデータベースに送信し、データベースはSQLステートメントを解析およびコンパイルしますが、クエリを実行しません。この時点で、クエリの変数部分(ユーザー入力など)はすぐにSQLに挿入されませんが、プレースホルダー(通常は? )として表されます。
実行フェーズ:実行中、実際のパラメーター値はプレースホルダーを置き換えることになり、データベースはステートメントを実行します。
このアプローチの利点は、データベースが事前にクエリを準備し、各クエリのパラメーターを安全に検証できるため、SQL注入のリスクを回避できることです。
PHPでは、 MySQLI拡張機能を介してMySQLデータベースを操作し、 MySQLI_STMT :: __ ConstructはMySQLI_STMTクラスのコンストラクターであり、前処理ステートメントを作成するために使用されます。
ステップの概要:
データベース接続を確立する:まず、 MySqli_Connectまたはnew MySqli()を使用してデータベース接続を作成する必要があります。
SQLステートメントの準備:SQLステートメントをプレースホルダーで定義します。
前処理ステートメントの初期化: mysqli_prepareまたはmysqli_stmt :: __ construmtを使用して前処理ステートメントを作成します。
バインドパラメーター: bind_paramメソッドを使用して、可変値をプレシングステートメントのプレースホルダーにバインドします。
実行ステートメント:実行メソッドを使用して、プリプロセシングステートメントを実行します。
名前、電子メール、年齢など、ユーザーデータをユーザーテーブルに挿入すると、 mysqli_stmt :: __コンストラクトを使用して、プリプロセシングステートメントを作成します。これが特定のコードの例です。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 1. データベース接続を作成します</span></span><span>
</span><span><span class="hljs-variable">$servername</span></span><span> = </span><span><span class="hljs-string">"localhost"</span></span><span>;
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">"root"</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$dbname</span></span><span> = </span><span><span class="hljs-string">"test"</span></span><span>;
</span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$servername</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);
</span><span><span class="hljs-comment">// 接続を確認してください</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$conn</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// 2. プレースホルダーを定義します SQL 声明</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (name, email, age) VALUES (?, ?, ?)"</span></span><span>;
</span><span><span class="hljs-comment">// 3. 创建预处理声明</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-comment">// 前処理が成功しているかどうかを確認してください</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">'Error preparing statement: '</span></span><span> . </span><span><span class="hljs-variable">$conn</span></span><span>->error);
}
</span><span><span class="hljs-comment">// 4. バインドパラメーター</span></span><span>
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">"John Doe"</span></span><span>;
</span><span><span class="hljs-variable">$email</span></span><span> = </span><span><span class="hljs-string">"[email protected]"</span></span><span>;
</span><span><span class="hljs-variable">$age</span></span><span> = </span><span><span class="hljs-number">25</span></span><span>;
</span><span><span class="hljs-comment">// "sss" バウンドを表す可変型,文字列に対応します、弦、整数</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">$email</span></span><span>, </span><span><span class="hljs-variable">$age</span></span><span>);
</span><span><span class="hljs-comment">// 5. 执行预处理声明</span></span><span>
</span><span><span class="hljs-keyword">if</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><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"New record created successfully"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Error: "</span></span><span> . </span><span><span class="hljs-variable">$stmt</span></span><span>->error;
}
</span><span><span class="hljs-comment">// 关闭声明和连接</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>データベース接続の作成:新しいmysqli()メソッドを使用して、データベースに接続します。接続が失敗した場合、プログラムは停止し、エラーメッセージが表示されます。
SQLステートメント:ユーザー(名前、電子メール、年齢)値(?、?、?)にプレースホルダーを挿入するSQLステートメントを定義します。ここにプレースホルダーがあります。つまり、後続の手順でデータを動的に挿入します。
準備ステートメント: $ conn-> prepare($ sql)メソッドを使用して、プリプロセシングステートメントを作成します。作成が失敗した場合、エラーメッセージが出力されます。
バインドパラメーター: $ stmt-> bind_param( "ssi"、$ name、$ email、$ age)メソッドは、変数$ name 、 $ email 、 $ age to the ? SQLステートメントのプレースホルダー。 「SSI」はパラメーターのデータ型を表し、 Sは文字列であり、私は整数です。
実行ステートメント: $ stmt-> execute()を介してプリプロセシングステートメントを実行します。実行が成功した場合、成功メッセージが返されます。そうしないと、エラーが出力されます。
閉じるリソース:実行後、プリプロセシングステートメントとデータベース接続を閉じてリソースを解放する必要があります。
SQLインジェクションを防ぐ:SQLステートメントを直接スプライズする代わりにプレースホルダーを使用することにより、悪意のあるユーザーは特殊文字を入力することにより、SQLインジェクション攻撃を効果的に防ぐことができます。
パフォーマンスの向上:同じクエリを複数回実行している場合(データのバッチ挿入など)、前処理ステートメントを使用することは、毎回SQLステートメントを再格付けするよりもはるかに効率的です。
より明確なコード:前処理ステートメントを使用すると、特にユーザー入力と複数のクエリが含まれ、SQLスプライシングエラーの可能性が減少する場合、コード構造をより明確にすることができます。
関連タグ:
mysqli_stmt