2

MySQLi、PDO、またはPHPに、パラメーター化されたクエリを使用するが、後で呼び出す準備をしていないAPIはありますか?SQLParameterの.Prepare()メソッドを呼び出さないときにADO.NETで見つけましたが、PHPでは見つかりませんでした。

4

1 に答える 1

0

プリペアドステートメントは、クエリから分離された値とともにデータベースサーバーに送信されます。ID 1337のユーザーを取得したい場合は、PDOを使用してこれを行います。

$sql = 'SELECT u.id, u.username FROM users u WHERE u.id = :theUserIdToGet LIMIT 1';
$stmt = $db->prepare($sql);
$stmt->bindValue(':theUserIdToGet', 1337);
$result = $stmt->fetch();

従来のクエリでは、これは次のようになります。

$sql = 'SELECT u.id, u.username FROM users u WHERE u.id = ' . 1337 . ' LIMIT 1';
$stmt = $db->query($sql);
$result = $stmt->fetch();

最初の例は明らかにより多くのコードを必要としますが、次の利点があります。

  • セキュリティ-値(この場合は1つだけ、1337)はデータベースサーバーに個別に送信されます。データベースサーバーは、これらの値に不正な文字がないか安全にチェックし、実行前にクエリに挿入します。一部のクエリAPIはこれをエミュレートしますが、それでもかなりの安全性を提供することに注意してください。
  • 読みやすさ-クエリに2つ以上のパラメータを追加する場合、文字列を連結すると非常に面倒になります( "WHEREid="。$var1。"AND"。$var2。"=1"など)。
  • パフォーマンス(ときどき)-プリペアドステートメントは、何度も実行すると非常に高速になることは事実ですが、実際には、これは非常にまれです。query()を介してクエリを準備することによるパフォーマンスのオーバーヘッドはごくわずかです。

読みやすさとセキュリティのため、変数をクエリに挿入するときは常にプリペアドステートメントを使用する必要があります。

PDOは一般的に非常に優れていると考えられており、私はいつもそれを使用しています。学習曲線は穏やかで、多くのチュートリアルがインターネットで利用できます。ドキュメントはこちらです

于 2011-04-30T11:35:40.017 に答える