現在の位置: ホーム> 最新記事一覧> Zero Foundationの開始:mysqli_stmt :: __ constructを介して前処理ステートメントを作成する方法

Zero Foundationの開始:mysqli_stmt :: __ constructを介して前処理ステートメントを作成する方法

gitbox 2025-09-16

1.前処理ステートメントとは何ですか?

前処理ステートメントは、SQLクエリの実行方法です。 SQLクエリを2つの部分に分割します。

  • プリプロセシング段階:SQLステートメントのテンプレートをデータベースに送信し、データベースはSQLステートメントを解析およびコンパイルしますが、クエリを実行しません。この時点で、クエリの変数部分(ユーザー入力など)はすぐにSQLに挿入されませんが、プレースホルダー(通常は )として表されます。

  • 実行フェーズ:実行中、実際のパラメーター値はプレースホルダーを置き換えることになり、データベースはステートメントを実行します。

このアプローチの利点は、データベースが事前にクエリを準備し、各クエリのパラメーターを安全に検証できるため、SQL注入のリスクを回避できることです。


2。mysqli_stmt :: __ constructを使用して、前処理ステートメントを作成します

PHPでは、 MySQLI拡張機能を介してMySQLデータベースを操作し、 MySQLI_STMT :: __ ConstructはMySQLI_STMTクラスのコンストラクターであり、前処理ステートメントを作成するために使用されます。

ステップの概要:

  1. データベース接続を確立する:まず、 MySqli_Connectまたはnew MySqli()を使用してデータベース接続を作成する必要があります。

  2. SQLステートメントの準備:SQLステートメントをプレースホルダーで定義します。

  3. 前処理ステートメントの初期化mysqli_prepareまたはmysqli_stmt :: __ construmtを使用して前処理ステートメントを作成します。

  4. バインドパラメーターbind_paramメソッドを使用して、可変値をプレシングステートメントのプレースホルダーにバインドします。

  5. 実行ステートメント実行メソッドを使用して、プリプロセシングステートメントを実行します。


3。サンプルコード

名前、電子メール、年齢など、ユーザーデータをユーザーテーブルに挿入すると、 mysqli_stmt :: __コンストラクトを使用して、プリプロセシングステートメントを作成します。これが特定のコードの例です。

 <span><span><span class="hljs-meta">&lt;?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>-&gt;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>-&gt;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>-&gt;</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>-&gt;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>-&gt;</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>-&gt;</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>-&gt;error;
}

</span><span><span class="hljs-comment">// 关闭声明和连接</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$conn</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

4。コードの解析

  • データベース接続の作成新しいmysqli()メソッドを使用して、データベースに接続します。接続が失敗した場合、プログラムは停止し、エラーメッセージが表示されます。

  • SQLステートメントユーザー(名前、電子メール、年齢)値(?、?、?)にプレースホルダーを挿入するSQLステートメントを定義します。ここにプレースホルダーがあります。つまり、後続の手順でデータを動的に挿入します。

  • 準備ステートメント$ conn-> prepare($ sql)メソッドを使用して、プリプロセシングステートメントを作成します。作成が失敗した場合、エラーメッセージが出力されます。

  • バインドパラメーター$ stmt-> bind_param( "ssi"、$ name、$ email、$ age)メソッドは、変数$ name$ email$ age to the SQLステートメントのプレースホルダー。 「SSI」はパラメーターのデータ型を表し、 Sは文字列であり、私は整数です。

  • 実行ステートメント$ stmt-> execute()を介してプリプロセシングステートメントを実行します。実行が成功した場合、成功メッセージが返されます。そうしないと、エラーが出力されます。

  • 閉じるリソース:実行後、プリプロセシングステートメントとデータベース接続を閉じてリソースを解放する必要があります。


5。前処理ステートメントの利点

  • SQLインジェクションを防ぐ:SQLステートメントを直接スプライズする代わりにプレースホルダーを使用することにより、悪意のあるユーザーは特殊文字を入力することにより、SQLインジェクション攻撃を効果的に防ぐことができます。

  • パフォーマンスの向上:同じクエリを複数回実行している場合(データのバッチ挿入など)、前処理ステートメントを使用することは、毎回SQLステートメントを再格付けするよりもはるかに効率的です。

  • より明確なコード:前処理ステートメントを使用すると、特にユーザー入力と複数のクエリが含まれ、SQLスプライシングエラーの可能性が減少する場合、コード構造をより明確にすることができます。