ホームページ > バックエンド開発 > PHPチュートリアル > PDO でパラメータ化されたクエリ SQL を使用したパラメータ化された設計

PDO でパラメータ化されたクエリ SQL を使用したパラメータ化された設計

WBOY
リリース: 2016-07-29 08:46:28
オリジナル
925 人が閲覧しました

メソッドbindParam()とbindValue()は非常に似ています。
唯一の違いは、前者はパラメータのバインドに PHP 変数を使用するのに対し、後者は値を使用することです。
したがって、bindParam を使用する場合、2 番目のパラメーターは変数値ではなく変数名のみを使用できますが、bindValue は特定の値のみを使用できます。

コードをコピーします コードは次のとおりです:


$stm = $pdo->prepare("select * from users where user = :user"); //正しい
$stm->bindParam(":user",$user);
//不正解
//$stm->bindParam(":user","jack");
//正しい
$ stm->bindValue(":user",$user);
//Correct
$stm->bindValue(":user","jack"); さらに、ストアド プロシージャでは、bindParam を使用できます。以下のように入力/出力変数にバインドします:


コードをコピー

コードは次のとおりです:

$stm = $pdo->prepare("call func(:param1)"); param1 = "abcd"; $stm ->bindParam(":param1",$param1); //Correct$stm->execute();


変数に反映されます。
メモリ内の大きなデータ ブロック パラメーターの場合、パフォーマンス上の理由から、前者を最初に使用する必要があります。
------------------------------------------------- -
http://zh.wikipedia.org/wiki/%E5%8F%83%E6%95%B8%E5%8C%96%E6%9F%A5%E8%A9%A2
パラメータ化されたクエリ

パラメータ パラメータ化クエリ(パラメータ化されたクエリまたはパラメータ化されたステートメント)とは、データベースに接続してデータにアクセスするための設計時に、値またはデータを入力する必要がある場所にパラメータ(Parameter)を使用して値を与えることを指します。 SQL インジェクション攻撃を防ぐための効果的かつ実行可能な防御方法。一部の開発者は、パラメータ化されたクエリを使用すると、プログラムの保守がより困難になる、または一部の機能を実装するのが非常に不便になると考えるかもしれません [ソース要求]。しかし、パラメータ化されたクエリを使用することによって発生する追加の開発コストは、通常、パラメータ化されたクエリよりもはるかに少なくなります。 SQLインジェクション攻撃の脆弱性発見による攻撃による多大な損失。
セキュリティ要素に加えて、パラメータ化されたクエリには、文字列を連結する SQL ステートメントと比較してパフォーマンス上の利点があることがよくあります。パラメーター化されたクエリでは、パラメーターを通じてさまざまなデータがデータベースに到達できるため、同じ SQL ステートメントを共有できるからです。ほとんどのデータベースは、繰り返しの解析によるオーバーヘッドを節約するために、SQL ステートメントの解釈によって生成されたバイトコードをキャッシュします。文字列を連結するSQL文を採用した場合、操作データはパラメータではなくSQL文の一部となり、SQL文の解釈を繰り返すことにより不要なオーバーヘッドが発生します。
目次
* 1 原則
* 2 SQL 命令の書き方
o 2.1 Microsoft SQL Server
o 2.2 Microsoft Access
o 2.3 MySQL
o 2.4 PostgreSQL/SQLite
* 3 クライアントプログラムの書き方
o 3.1 ADO。 NET
o 3.2 PDO
o 3.3 JDBC
o 3.4 Cold Fusion
[編集] 原則
パラメータ化されたクエリを使用する場合、データベース サーバーはパラメータの内容を処理用の SQL 命令の一部として扱いませんが、データベース SQL コマンドはコンパイルされ、パラメータを指定して実行されるため、パラメータに破壊的なコマンドが含まれている場合でも、データベースによって実行されることはありません。
[編集] SQL コマンドの記述方法
SQL コマンドを記述するときは、パラメータを使用して入力する必要がある値を表します。例:
[編集] Microsoft SQL Server
Microsoft SQL Server のパラメータ形式は次のとおりです。 "@" 文字とパラメータという名前の SQL Server は、匿名パラメータ "?" もサポートしています。
SELECT * FROM myTable WHERE myID = @myID
INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
[編集] Microsoft Access
Microsoft Access はnamedをサポートしていませんパラメータでは、匿名パラメータ「?」のみがサポートされます。
UPDATE myTable SET c1 = ?, c2 = ?, c3 = ? WHERE c4 = ?
[編集] MySQL
MySQL のパラメータ形式は、「?」文字とパラメータ名で構成されます。
UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4
[編集] PostgreSQL/SQLite
PostgreSQL と SQLite のパラメータ形式は、「:」とパラメータ名で形成されます。もちろん、Access のような匿名パラメータもサポートされています。
UPDATE "myTable" SET "c1" = :c1, "c2" = :c2, "c3" = :c3 WHERE "c4" = :c4
[編集]クライアントプログラムの書き方
クライアントコードに記述して使用する パラメータコード例:
[編集] ADO.NET
ADO.NET は ASP.NET 内で使用されます。
SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)", sqlconn);
sqlcmd.Parameters.AddWithValue("@c1") , 1); // パラメータ @c1 の値を設定します。
sqlcmd.Parameters.AddWithValue("@c2", 2); // パラメーター @c2 の値を設定します。
sqlcmd.Parameters.AddWithValue("@c3", 3); // パラメーター @c3 の値を設定します。
sqlcmd.Parameters.AddWithValue("@c4", 4); // パラメーター @c4 の値を設定します。
sqlconn.Open();
sqlcmd.ExecuteNonQuery();
[編集] PDO
PDO は PHP 内で使用されます。 PDO ドライバーを使用する場合、パラメーター クエリを使用する一般的な方法は次のとおりです:



コードをコピーします

コードは次のとおりです:


// データ抽象化層オブジェクトをインスタンス化します
$db = new PDO('pgsql:host=127.0.0.1;port=5432;dbname=testdb');
// SQL ステートメントで prepare を実行し、PDOStatement オブジェクトを取得します
$ stmt = $db->prepare('SELECT * FROM "myTable" WHERE "id" = :id AND "is_valid" = :is_valid');
// バインドパラメータ
$stmt->bindValue(': id ', $id);
$stmt->bindValue(':is_valid', true);
// クエリ
$stmt->execute(); // データを取得
foreach($stmt as $row) ) {
var_dump($row);
}
[code]
MySQL の特定のドライバーの場合は、次のように使用することもできます:
$db = new mysqli("localhost", "user", "pass", "データベース");
$stmt = $mysqli -> prepare("SELECT priv FROM testUsers WHERE ユーザー名=? AND パスワード=?"); ;
$stmt - >execute();
次のメソッドは (mysql_real_escape_string 関数のエスケープのおかげで) SQL インジェクションを効果的に防ぐことができますが、これは真のパラメータ化されたクエリではないことに注意してください。その本質は依然として文字列を連結する SQL ステートメントです。
[コード]
$query = sprintf("SELECT * FROM Users where UserName='%s' and Password='%s'",
mysql_real_escape_string($Username),
mysql_real_escape_string($Password));クエリ);


[編集] JDBC
JDBC は Java で使用されます。

java.sql.PreparedStatement prep = connection.prepareStatement(
"SELECT * FROM `users` WHERE USERNAME = ? AND PASSWORD = ?");
prep.setString(1, ユーザー名); ;
prep.executeQuery();
[編集] コールドフュージョン

コメントから
WHERE COMMENT_ID =

上記では、パラメータ化設計の内容を含め、パラメータ化設計 PDO でのパラメータ化クエリ SQL の使用方法を紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート