我混淆了这两个函数Bindvalue()
和BindParam()
- 我在php.net上读到它不逃避
%
和_
,所以在使用LIKE
时要小心。所以我认为BindValue()
是不使用时,我们使用LIKE查询。 当我们使用 -
BindValue()
不提供针对sql注入的保护。我不确定,这是真的吗?
LIKE
查询时,使用BindParam()
。因为我知道BindParam可以逃避这些%
和_
。值的转义方式和不转义方式应该没有区别。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
查询上下文中的实际字符"%"。
好吧,你完全搞错了。
除了参数类型不同, Bindvalue()
和BindParam()
在任何方面都是相等的。
- Bindvalue()只是绑定一个值,它就像一个硬拷贝。
- BindParam()绑定一个变量,当变量被改变时,绑定的值也会被改变。
它们都没有转义%和_,这无关紧要。这种转义只影响返回结果的可靠性,而不影响任何"注射剂"。