メソッドbindParam()とbindValue()は非常に似ています。
唯一の違いは、前者はパラメータのバインドに PHP 変数を使用するのに対し、後者は値を使用することです。
したがって、bindParam を使用する場合、2 番目のパラメーターは変数値ではなく変数名のみを使用できますが、bindValue は特定の値のみを使用できます。
コードをコピー コードは次のとおりです:
$stm = $pdo->prepare("select * from usersここで user = :user");
$user = "jack";
//正しい
$stm->bindParam(":user",$user);
//間違った
/ /$stm->bindParam(":user","jack");
//修正
$stm->bindValue(":user",$user); /Correct
$stm->bindValue(":user","jack");
コードをコピー コードは次のとおりです:
$stm = $pdo->prepare(" call func(:param1)");
$param1 = "abcd";
$stm->bindParam(":param1",$param1); //修正
$stm->実行();
ストアドプロシージャ実行後の結果を変数に直接反映できます。
メモリ内の大きなデータ ブロック パラメータの場合、パフォーマンス上の理由から、前者を最初に使用する必要があります。
----------------------------------------------- --- ---
http://zh.wikipedia.org/wiki/パラメータ化されたクエリ
パラメータ化されたクエリ
パラメータ化されたクエリ (パラメータ化されたクエリまたはパラメータ化されたステートメント) は、設計をデータベースに接続し、データを入力する必要がある場合、パラメーター (パラメーター) を使用して値を指定します。この方法は、現在、SQL インジェクション攻撃 (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 は名前付きパラメータをサポートしておらず、匿名パラメータ "?" のみをサポートしています。
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
[編集] クライアントプログラムの書き込みメソッド
in Writeクライアント コードでパラメーターを使用するコード。例:
[編集] ADO.NET
ADO.NET は ASP.NET 内で使用されます。
SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)", sqlconn); "@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" =
// Bindingパラメータ
$stmt->bindValue(':id', $id);
$stmt->bindValue(':is_valid', true);
// クエリ
$stmt- >execute();
//Get data
foreach($stmt as $row) {
var_dump($row);
[code]
MySQL 固有ドライバーは次のように使用することもできます。
$db = new mysqli("localhost", "user", "pass", "database");
$stmt = $mysqli -> FROM testUsers WHERE ユーザー名=? AND パスワード=?");
$stmt -> binding_param("ss", $user, $pass);
$stmt ->execute();
価値次の方法は (mysql_real_escape_string 関数のエスケープのおかげで) SQL インジェクションを効果的に防ぐことができますが、これは真のパラメータ化されたクエリではないことに注意してください。その本質は依然として文字列を連結する SQL ステートメントです。
[code]
$query = sprintf("SELECT * FROM Users where UserName='%s' and Password='%s'",
mysql_real_escape_string($Username),
mysql_real_escape_string($パスワード));
mysql_query($query);
JDBC は Java で使用されます。
java.sql.PreparedStatement prep = connection.prepareStatement(
"SELECT * FROM `users` WHERE USERNAME = ? AND PASSWORD = ?");
prep.setString(1, username); prep.setString(2, パスワード);
prep.executeQuery();
[編集] Cold Fusion
WHERE COMMENT_ID =