PHPのPDOは、ステートメントおよびストアドプロシージャを用意しました
多くのより成熟したデータベースは、準備文の概念をサポートしています。
プリペアドステートメントは何ですか? 可変パラメータを使用してカスタマイズすることができますが、SQLを実行したいコンパイル済みのテンプレート、と考えてください。 プリペアドステートメントは、2つの主要な利点があります。
- クエリは、解決さ(又は前処理)を1回、同じまたは異なるパラメータで複数回実行することができます。 クエリの準備が整うと、データベースは、クエリの最適化計画を、分析コンパイルして実行します。 あなたは異なるパラメータ同じクエリで何度も繰り返す必要があれば、複雑なクエリの場合、このプロセスは、長い時間がかかり、処理が大幅にアプリケーションの速度が低下します。 プリペアドステートメントを使用して/最適化サイクルをコンパイル/分析の繰り返しを避けます。 要するに、プリペアドステートメントは、少ないリソースを使用するので、高速に動作します。
- プリペアドステートメントにパラメータを提供し、引用符を使用する必要はありません、ドライバが自動的に処理されます。 アプリケーションは唯一のプリペアドステートメントを使用している場合、我々はありませんSQLインジェクションことを確認することができます。 (クエリの他の部分を構築するために、入力からエスケープされていない場合は、その後、SQLインジェクションのリスクが依然として存在します)。
ドライバーはPDOをサポートしていないとき、彼らは唯一の機能は、アナログ処理であることをとても便利な準備された文。 これは関係なく、データベースの機能を有しているかどうかの、あなたはアプリケーションが同じデータ・アクセス・パターンを使用することができることを確実にすることができるようになります。
PreparedStatementでは繰り返し挿入
INSERTクエリを実行するための名前と値を持つ適切な名前のプレースホルダを置き換えることによって、次の例
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
PreparedStatementでは繰り返し挿入
名前と値を代入?プレースホルダを挿入クエリを実行することによって、次の例。
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
準備されたステートメントを使用してデータを取得します
既に提供されたデータへの鍵ベースのアクセスの形で、次の例。 ユーザ入力は、自動的に引用符で囲まれているので、SQLインジェクション攻撃の危険性はありません。
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
データベースドライバサポートする場合、アプリケーションは、入力および出力パラメータ出力パラメータは、典型的には、ストアドプロシージャから値を得るために使用される結合することができます。 出力パラメータをバインドするとき、あなたが与えられた長さのパラメータを知る必要があるため、出力パラメータは、もう少し複雑であることが入力パラメータよりも使用するように。 パラメータの値が長さの結合勧告よりも大きい場合、それはエラーが発生します。
出力パラメータを持つストアドプロシージャをコールします
<?php $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $return_value\n"; ?>
また、構文は、出力パラメータに似て、パラメータの入力と出力の両方の値を指定することができます。 ストアドプロシージャのリターンは、ハローは、ストアドプロシージャの戻り値に置き換えられたときに次の例では、 "hello"という文字列がストアドプロシージャに渡されます。
入力/出力パラメータは、ストアドプロシージャを呼び出すと
<?php $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $value\n"; ?>
プレースホルダの使用が無効です。
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); $stmt->execute(array($_GET['name'])); // 占位符必须被用在整个值的位置 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?"); $stmt->execute(array("%$_GET[name]%")); ?>