我对这两个功能Bindvalue()BindParam()感到困惑


我在php.net上阅读,它不会转义%_,因此在使用LIKE时要小心。所以我认为在使用LIKE查询时不使用BindValue()
当我们使用LIKE查询时,使用BindParam()。因为据我所知BindParam可以逃避这些%_
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查询上下文中的实际字符“%”。

两者都可以防止SQL注入。

08-05 02:11