【问题标题】:Sql queries binding variables vs specifying them [duplicate]Sql查询绑定变量与指定它们[重复]
【发布时间】:2013-04-11 14:33:15
【问题描述】:

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

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

谢谢!

【问题讨论】:

标签: php mysql pdo bind


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 分享你的智慧,而不是非建设性的 cmets:) 我被告知你不能在准备好的语句中使用常量,例如,如果它是真的,你不能通过从你的代码中绑定一个常量来进行查询,这除了你,没有人会操纵。然后您将需要进行查询的标准方式
    【解决方案3】:

    因为它更安全。

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

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

    【讨论】:

    • 调试起来实际上更难,因为您不能只是将查询回显并粘贴到控制台中
    • 正确,如果您的调试基于将查询粘贴到屏幕上。 ^^
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 2011-08-24
    • 2014-01-03
    • 2010-10-04
    • 2011-06-28
    • 2011-06-09
    • 2014-04-29
    • 2021-03-14
    相关资源
    最近更新 更多