Confusion between bindValue() and bindParam()?


Confusion between bindValue() and bindParam()?

我混淆了这两个函数Bindvalue()BindParam()

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

值的转义方式和不转义方式应该没有区别。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查询上下文中的实际字符"%"。

好吧,你完全搞错了。

除了参数类型不同,

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

  • Bindvalue()只是绑定一个值,它就像一个硬拷贝
  • BindParam()绑定一个变量,当变量被改变时,绑定的值也会被改变。

它们都没有转义%和_,这无关紧要。这种转义只影响返回结果的可靠性,而不影响任何"注射剂"。