时间:2011-04-30 09:41:18

标签: php ado.net prepared-statement parameterized-query

在MySQLi,PDO或PHP中是否存在使用参数化查询但未准备好以后再召回的API?当我们不调用SQLParameter的.Prepare()方法时,我在ADO.NET中找到了它,但我没有在PHP中找到它。

1 个答案:

答案 0 :(得分: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();

第一个例子显然需要更多代码,但它具有以下优点;

  • 安全性 - 值(在这种情况下只有一个; 1337)分别发送到数据库服务器。数据库服务器安全地检查这些值是否有坏字符,并在执行前将它们插入查询中。请注意,某些查询API会模拟这一点,但它仍然提供了很大的安全性。
  • 可读性 - 当向查询添加多个参数时,如果连接字符串(“WHERE id =”。$ var1。“AND”。$ var2。“= 1”等),则会非常混乱。 / LI>
  • 表演(偶尔) - 多次执行准备好的陈述确实快得多,但在实践中这很少见。通过query()准备查询的性能开销可以忽略不计。

由于其易读性和安全性,在将变量插入查询时应始终使用预准备语句。

PDO通常被认为是非常好的,我个人经常使用它。它的学习曲线很温和,互联网上有许多教程。它的文档是here