Sql查询绑定变量与指定它们

时间:2013-04-11 14:33:16

标签: php mysql pdo bind

我在mySql中创建一个简单的查询,将表单中的一些值插入到我的数据库中。

我的问题很简单,但是参考绑定变量与将它们指定到sql语句之间的区别。

结合:

$query = "INSERT INTO test (name, lastName, price) VALUES (:name, :lastName, :price)";
$apply = $con -> prepare($query);
$apply -> execute (array(':name'=>$name,':lastName'=>$lastName,':price=>$price'));

典型:

$query = "INSERT INTO test (name, lastName, price) VALUES ($name, $lastName, $price)";
Execute the query....

即使对于上面的简单案例,是否真的建议使用Binding选项?那是为什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

虽然您可以在没有绑定的情况下完全安全地查询(通过手动格式化所有变量),但使用预准备语句在查询中表示您的数据确实是唯一正确的方法。

使用准备好的陈述的重要性经常被误判,因此,我想澄清真正的好处:

  • 预备语句可以正确格式化(或处理)不可避免的
  • 预备语句在正确的位置正确格式化(或处理) - 在查询执行之前,而不是在其他地方,因此,我们的安全不会依赖于像这样不可靠的来源
    • 一些PHP'魔术'功能,它可以破坏数据而不是安全。
    • 一个(或几个)程序员的善意,他们可以决定在程序流程的某个地方格式化(或不格式化)我们的变量。这是非常重要的一点。
  • prepared语句影响查询的非常值,但不会影响源变量,源变量保持不变,可以在其他代码中使用(通过电子邮件发送或在屏幕上显示)。
  • 预备语句可以使应用程序代码显着缩短,在幕后进行所有格式化(*仅在驱动程序允许的情况下)。

答案 1 :(得分:0)

由于您拥有用户定义的值,因此可以由用户轻松操作,以破坏查询结构并执行不需要的命令。

如果数据仅由服务器操纵,则没有必要。但由于它使用来自超级全局的数据,用户可以操作(cookie,会话,发布,获取,请求......),这是必须的。

答案 2 :(得分:0)

因为它更安全。

如果使用用户数据填充了三个变量,则无需清理输入。 此外,如果您需要多次重复该查询,则整体执行应该更快。

我个人认为,在几个月后你需要再次阅读你的查询时,阅读和调试会更容易......