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

Aru*_*ngh 11 php pdo bindvalue bindparam

我这两个功能之间的混淆Bindvalue()BindParam()

  1. 我在php.net看它不逃避%_,所以使用时要小心LIKE.所以我认为BindValue()在使用LIKE查询时不会使用.
  2. 当我们使用LIKE查询时BindParam().因为我知道BindParam可以逃避这些%_.
  3. BindValue()没有防止sql注入.我不确定这个,是真的吗?

朋友告诉我在这3点中提到的是对还是错.我是PDO的初学者所以请清楚解释一下..

dec*_*eze 52

值的转义或转义方式应该没有区别.bindParam不同之处bindValue在于它引用变量,仅在执行语句时绑定值.立即bindValue获取价值.为了显示:

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

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

$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

以上执行如下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()
Run Code Online (Sandbox Code Playgroud)

以上执行如下SELECT * FROM table WHERE foo = 'bar'.

确实,无论是关心_还是%作为特殊字符,因为一般来说,就语法而言,它们不是特殊字符,并且数据库驱动程序无法分析上下文以确定您是否 %通配符或LIKE查询上下文中的实际字符"%" .

两者都可以防止SQL注入.

  • 是的,他们这样做.这就是我所说的.您应该阅读[The Great Escapism](http://kunststube.net/escapism),了解有关SQL注入的详细信息以及为什么预处理语句可以避免它. (2认同)

You*_*nse 5

好吧,你把它弄错了.

Bindvalue()并且BindParam()除了参数类型之外,它们都是相同的.

  • Bindvalue()只绑定一个值,就像一个硬拷贝.
  • BindParam()绑定变量,当变量发生变化时,绑定值也会发生变化.

它们都没有逃脱%和_,这无关紧要.这种逃逸只影响返回结果的可靠性,而不影响"注射".