我对这两个函数Bindvalue()
和BindParam()
%
和_
,所以在使用LIKE
时要小心。所以我认为在使用LIKE查询时不会使用BindValue()
。LIKE
查询BindParam()
时。因为我知道BindParam可以逃脱这些%
和_
。BindValue()
不提供针对sql注入的保护。我不确定,这是真的吗?朋友告诉我在这3点中提到的是对还是错。 我是PDO的初学者,所以请清楚解释一下......
答案 0 :(得分:52)
值的转义或转义方式应该没有区别。 bindParam
与bindValue
的不同之处在于它引用变量,仅在执行语句时绑定值。 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()
在任何方面都相等。
它们都没有逃脱%和_,这无关紧要。这种逃逸只会影响返回结果的可靠性,而不会影响“注射”。