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

Php bindValue()和bindParam()之间的混淆?,php,pdo,bindvalue,bindparam,Php,Pdo,Bindvalue,Bindparam,我混淆了这两个函数Bindvalue和BindParam 我在php.net上读到它不会逃逸%和389;,所以使用LIKE时要小心。因此,我认为在使用LIKE查询时不使用BindValue。 当我们使用LIKE查询时,使用BindParam。因为据我所知,BindParam可以转义这些%and x。 BindValue不提供针对sql注入的保护。我不确定这是真的吗? 朋友们告诉我这三点中提到的是对还是错。 我是PDO的初学者,所以请解释清楚。值转义与不转义的方式应该没有区别。bindParam与

我混淆了这两个函数Bindvalue和BindParam

我在php.net上读到它不会逃逸%和389;,所以使用LIKE时要小心。因此,我认为在使用LIKE查询时不使用BindValue。 当我们使用LIKE查询时,使用BindParam。因为据我所知,BindParam可以转义这些%and x。 BindValue不提供针对sql注入的保护。我不确定这是真的吗? 朋友们告诉我这三点中提到的是对还是错。
我是PDO的初学者,所以请解释清楚。

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

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

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

$stmt->execute();
上面的执行类似于SELECT*FROM表,其中foo='foo'

上面的执行类似于SELECT*FROM表,其中foo='bar'

确实,两者都不关心将u或%作为特殊字符,因为一般来说,就语法而言,它们不是特殊字符,数据库驱动程序无法分析上下文以确定在类似查询的上下文中,您是指%是通配符还是实际字符%


两者都可以防止SQL注入。

好吧,你完全错了

除参数类型外,Bindvalue和BindParam在任何一种方式下都相等

Bindvalue只绑定一个值,就像硬拷贝一样。 BindParam绑定一个变量,当一个变量被更改时,绑定的值也将被更改。
它们都不会逃逸%和ux,这并不重要。这种转义只会影响返回结果的可靠性,而不会影响任何注入。

我想知道bindValue和bindParam的可能重复项都可以防止sql注入。我知道它在问一个愚蠢的问题,但我不确定这就是为什么我要问的原因。是的,他们问了。我就是这么说的。关于什么是SQL注入以及为什么预处理语句避免SQL注入的详细信息,请阅读。@deceze+1。但是,在什么情况下,或者在什么时候使用其中一种而不是另一种变得重要?我只知道为什么一个变量比另一个更适合某些条件。@Simon通过引用绑定变量,您可以绑定它一次,然后遍历数据,为变量赋值,并反复执行查询,而无需重复绑定。可能效率稍高一些,但对性能几乎没有任何影响。不过,这可能会使代码稍微干净一些。
$stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');

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

$stmt->execute()