bindValue()和bindParam()之间的混淆?

时间:2013-01-19 10:24:39

标签: php pdo bindvalue bindparam

我对这两个函数Bindvalue()BindParam()

感到困惑
  1. 我在php.net上看到它没有逃脱%_,所以在使用LIKE时要小心。所以我认为在使用LIKE查询时不会使用BindValue()
  2. 当我们使用LIKE查询BindParam()时。因为我知道BindParam可以逃脱这些%_
  3. BindValue()不提供针对sql注入的保护。我不确定,这是真的吗?
  4. 朋友告诉我在这3点中提到的是对还是错。 我是PDO的初学者,所以请清楚解释一下......

2 个答案:

答案 0 :(得分:52)

值的转义或转义方式应该没有区别。 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注入。

答案 1 :(得分:5)

嗯,你错了。

除了参数类型之外,

Bindvalue()BindParam()在任何方面都相等。

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

它们都没有逃脱%和_,这无关紧要。这种逃逸只会影响返回结果的可靠性,而不会影响“注射”。