【问题标题】:Confusion between bindValue() and bindParam()?bindValue() 和 bindParam() 之间的混淆?
【发布时间】:2013-01-03 00:19:30
【问题描述】:

我对@9​​87654323@和BindParam()这两个函数感到困惑

  1. 我在 php.net 上看到它不会转义 %_,所以在使用 LIKE 时要小心。所以我认为BindValue() 在我们使用 LIKE 查询时没有被使用。
  2. 当我们使用LIKE 查询BindParam() 时使用。因为据我所知 BindParam 可以逃脱这些 %_
  3. BindValue() 不提供针对 sql 注入的保护。我不确定,这是真的吗?

朋友告诉我这三点是对还是错。 我是 PDO 的初学者,所以请解释清楚..

【问题讨论】:

标签: php pdo bindvalue bindparam


【解决方案1】:

值如何转义或不转义应该没有区别。 bindParambindValue 的不同之处在于它引用变量,仅在执行语句时绑定值。 bindValue 立即获取 。举例说明:

$stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');

$foo = 'foo';
$stmt->bindValue(':foo', $foo);
$foo = 'bar';

$stmt->execute();

上面的执行类似于SELECT * FROM table WHERE foo = 'foo';

$stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');

$foo = 'foo';
$stmt->bindParam(':foo', $foo);
$foo = 'bar';

$stmt->execute()

上面的执行类似于SELECT * FROM table WHERE foo = 'bar'

确实不关心_%作为特殊字符,因为一般来说它们就语法而言不是特殊字符,并且数据库驱动程序无法分析上下文来计算在LIKE 查询的上下文中,您意思是 % 是通配符还是实际字符“%”。

两者都可以防止 SQL 注入。

【讨论】:

  • 我想知道 bindValue() 和 bindParam() 都可以防止 sql 注入。我知道这是在问愚蠢的问题,但我不确定这就是我问的原因
  • 是的,他们有。这就是我要说的。您应该阅读The Great Escapism 以了解有关什么是 SQL 注入以及为什么准备好的语句避免它的详细信息。
  • @deceze +1 很好的解释。但是,在什么情况下或在什么时候使用一种代替另一种变得重要?我只能看到为什么一个应该适合某些条件,而不是另一个。
  • @Simon 通过引用绑定一个变量,可以绑定一次,然后循环遍历数据,给变量赋值,一遍遍地执行查询,不需要反复绑定。可能效率稍高一些,但对性能几乎没有任何影响。不过,它可能会使代码稍微干净一些。
【解决方案2】:

好吧,你完全错了。

Bindvalue()BindParam() 在任何一种方式上都相等,但参数类型除外。

  • Bindvalue() 只绑定一个值,它就像一个硬拷贝
  • BindParam() 绑定一个变量,当变量发生变化时,绑定的值也会随之变化。

它们都没有逃脱 % 和 _,这并没有太大关系。这种转义只影响返回结果的可靠性,而不影响任何“注入”。

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 2011-04-13
    • 2015-06-23
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多