ホームページ  >  記事  >  バックエンド開発  >  PHP MySQL プリペアド ステートメントに関する関連知識

PHP MySQL プリペアド ステートメントに関する関連知識

jacklove
jackloveオリジナル
2018-05-07 14:08:201594ブラウズ

PHP MySQL プリペアド ステートメントは php において非常に重要です。この記事では、PHP MySQL プリペアド ステートメントについて詳しく説明します。

プリペアド ステートメントとバインド パラメーター

プリペアド ステートメントは、複数の同一の SQL ステートメントをより高い実行効率で実行するために使用されます。

前処理されたステートメントは次のように機能します:

前処理: SQL ステートメントのテンプレートを作成し、データベースに送信します。予約された値にはパラメータ「?」が付けられます。例:

INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)

データベースの解析、コンパイル、SQL ステートメント テンプレートでのクエリの最適化、および出力なしの結果の保存。

実行: 最後に、アプリケーションにバインドされた値がパラメータ (「?」マーク) に渡され、データベースがステートメントを実行します。パラメータ値が異なる場合、アプリケーションはステートメントを複数回実行できます。

SQL ステートメントを直接実行する場合と比較して、プリペアド ステートメントには 2 つの主な利点があります:

プリプロセスされたステートメントにより、分析時間が大幅に短縮され、(ステートメントは複数回実行されますが) クエリが 1 つだけ作成されます。

パラメータをバインドするとサーバーの帯域幅が削減され、ステートメント全体ではなくクエリのパラメータのみを送信する必要があります。

プリペアドステートメントは、パラメーター値が送信された後に異なるプロトコルが使用され、データの合法性が保証されるため、SQL インジェクションに非常に役立ちます。

MySQLi プリペアド ステートメント

次の例では、MySQLi でプリペアド ステートメントを使用し、対応するパラメーターをバインドします:

例 (MySQLi はプリペアド ステートメントを使用します)

<?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDB"; 
// 创建连接$conn = new mysqli($servername, $username, $password, $dbname); 
// 检测连接if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);}
 // 预处理及绑定$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");$stmt->bind_param("sss", $firstname, $lastname, $email); 
// 设置参数并执行$firstname = "John";$lastname = "Doe";$email = "john@example.com";$stmt->execute(); 
$firstname = "Mary";$lastname = "Moe";$email = "mary@example.com";$stmt->execute(); 
$firstname = "Julie";$lastname = "Dooley";$email = "julie@example.com";$stmt->execute(); 
echo "新记录插入成功"; 
$stmt->close();$conn->close();?>

次の例のコードの各行を解析します:

"INSERT INTO MyGuests (firstname 、姓、電子メール) VALUES(?, ?, ?)"

SQL ステートメントでは疑問符 (?) を使用します。ここで疑問符を整数、String、double float 、およびブール値。

次に、bind_param() 関数を見てみましょう:

$stmt->bind_param("sss", $firstname, $lastname, $email);

この関数は SQL パラメーターをバインドし、データベースに通知します。パラメータの値。 「sss」パラメータ列は、残りのパラメータのデータ型を処理します。 s 文字は、パラメータが文字列であることをデータベースに伝えます。

パラメータには以下の4種類があります。

i - integer(整数型)

d - double(倍精度浮動小数点型)

s - string(文字列)

b - BLOB(バイナリラージオブジェクト:binary Large) object)

各パラメータには型を指定する必要があります。

データベースにパラメータのデータ型を伝えることで、SQL インジェクションのリスクを軽減できます。



注: 他のデータ (ユーザー入力) を挿入する場合は、データの検証が非常に重要です。

PDO のプリペアド ステートメント

次の例では、PDO でプリペアド ステートメントを使用し、パラメーターをバインドします:

例 (PDO はプリペアド ステートメントを使用します)

<?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDBPDO"; 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);    // 设置 PDO 错误模式为异常
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    // 预处理 SQL 并绑定参数
    $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES (:firstname, :lastname, :email)");    $stmt->bindParam(&#39;:firstname&#39;, $firstname);    $stmt->bindParam(&#39;:lastname&#39;, $lastname);    $stmt->bindParam(&#39;:email&#39;, $email); 
    // 插入行
    $firstname = "John";    $lastname = "Doe";    $email = "john@example.com";    $stmt->execute(); 
    // 插入其他行
    $firstname = "Mary";    $lastname = "Moe";    $email = "mary@example.com";    $stmt->execute(); 
    // 插入其他行
    $firstname = "Julie";    $lastname = "Dooley";    $email = "julie@example.com";    $stmt->execute(); 
    echo "新记录插入成功";}catch(PDOException $e){
    echo "Error: " . $e->getMessage();}$conn = null;?>

この記事では、関連する php mysql プリペアド ステートメントについて詳しく説明します。学習教材をご覧になるには、php 中国語 Web サイトに注意してください。

関連する推奨事項:

PHP MySQL を使用して複数のデータを挿入する方法

PHP MySQL を使用してデータを挿入する方法

PHP を使用して MySQL テーブルを作成する方法

以上がPHP MySQL プリペアド ステートメントに関する関連知識の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。