12

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

  1. 我在 php.net 上看到它不会转义%_所以使用时要小心LIKE。所以我认为BindValue()当我们使用 LIKE 查询时不使用。
  2. 当我们使用LIKE查询时BindParam()。因为据我所知 BindParam 可以逃避这些%_.
  3. BindValue()不提供针对 sql 注入的保护。我不确定这是真的吗?

朋友告诉我这3点是对是错。我是 PDO 的初学者,所以请解释清楚..

4

2 回答 2

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 注入。

于 2013-01-19T10:37:04.930 回答
5

好吧,你把这一切都搞错了。

Bindvalue()并且BindParam()在任何一种方式上都相等,除了参数类型。

  • Bindvalue() 只绑定一个值,它就像一个硬拷贝
  • BindParam() 绑定一个变量,当变量改变时,绑定的值也会改变。

他们两个都没有逃过%和_,这并没有太大的关系。这种转义只影响返回结果的可靠性,而不影响任何“注入”。

于 2013-01-19T10:40:06.033 回答