2

我正在 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....

即使对于上述简单情况,是否真的推荐使用绑定选项?这是为什么?

谢谢!

4

3 回答 3

3

尽管无需绑定(通过手动格式化所有变量)就可以使查询完全安全,但使用准备好的语句来表示查询中的数据确实是唯一正确的方法。

使用准备好的语句的重要性经常被误判,所以,我想澄清一下真正的好处:

  • 准备好的语句使正确的格式化(或处理)不可避免
  • 准备好的语句在唯一合适的地方进行正确的格式化(或处理)——就在查询执行之前,而不是其他地方,所以,我们的安全不会依赖于像这样不可靠的来源
    • 一些 PHP 的“魔法”功能,它会破坏数据而不是使其安全。
    • 一个(或几个)程序员的好意,他们可以决定在程序流的某个地方格式化(或不格式化)我们的变量。这是非常重要的一点。
  • 准备好的语句影响进入查询的值,但不影响源变量,源变量保持不变,可以在进一步的代码中使用(通过电子邮件发送或显示在屏幕上)。
  • 准备好的语句可以显着缩短应用程序代码,在后台进行所有格式化(*仅在驱动程序允许的情况下)。
于 2013-04-11T14:52:13.473 回答
0

这是必要的,因为您有用户定义的值,并且用户可以轻松地操纵它们,以破坏您的查询结构并执行不需要的命令。

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

于 2013-04-11T14:35:58.870 回答
0

因为它更安全。

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

而且我个人认为,当您必须在几个月后再次阅读查询时,阅读和调试会更容易......

于 2013-04-11T14:36:15.937 回答