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

Php bindValue()和bindParam()之间的混淆?,php,pdo,bindvalue,bindparam,Php,Pdo,Bindvalue,Bindparam,我混淆了这两个函数Bindvalue()和BindParam() 我在php.net上读到它不会逃逸%和,所以在使用类似的时要小心。因此,我认为当我们使用LIKE查询时,不使用BindValue() 当我们使用时,比如使用查询BindParam()。因为据我所知,BindParam可以转义这些%和\ BindValue()不提供针对sql注入的保护。我不确定这是真的吗 朋友们告诉我这三点中提到的是对还是错。 我是PDO的初学者,所以请解释清楚。值转义与不转义的方式应该没有区别bindParam与

我混淆了这两个函数
Bindvalue()
BindParam()

  • 我在php.net上读到它不会逃逸
    %
    ,所以在使用类似
    时要小心。因此,我认为当我们使用LIKE查询时,不使用
    BindValue()
  • 当我们使用
    时,比如使用
    查询
    BindParam()
    。因为据我所知,BindParam可以转义这些
    %
    \
  • BindValue()
    不提供针对sql注入的保护。我不确定这是真的吗
  • 朋友们告诉我这三点中提到的是对还是错。
    我是PDO的初学者,所以请解释清楚。

    值转义与不转义的方式应该没有区别
    bindParam
    bindValue
    的不同之处在于它引用变量,仅在执行语句时绑定值<代码>绑定值
    立即获取值。举例说明:

    $stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');
    
    $foo = 'foo';
    $stmt->bindValue(':foo', $foo);
    $foo = 'bar';
    
    $stmt->execute();
    
    上面的执行方式类似于
    SELECT*FROM表,其中foo='foo'

    $stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');
    
    $foo = 'foo';
    $stmt->bindParam(':foo', $foo);
    $foo = 'bar';
    
    $stmt->execute()
    
    上面的执行类似于
    SELECT*FROM table,其中foo='bar'

    确实,两者都不关心将
    \
    %
    作为特殊字符,因为一般来说,就语法而言,它们不是特殊字符,数据库驱动程序无法分析上下文以确定
    %
    是通配符还是实际字符“%”在类似
    查询的
    上下文中


    两者都可以防止SQL注入。

    好吧,你完全错了

    Bindvalue()
    BindParam()
    在任何一种情况下都相等,参数类型除外

    • Bindvalue()只绑定一个值,就像硬拷贝一样
    • BindParam()绑定一个变量,当变量被更改时,绑定的值也将被更改

    它们都不会逃逸%和ux,这并不重要。这种转义只影响返回结果的可靠性,而不影响任何“注入”。

    我想知道的是,bindValue()和bindParam()都提供了防止sql注入的保护。我知道它在问一个愚蠢的问题,但我不确定这就是为什么我要问的原因。是的,他们问了。我就是这么说的。关于什么是SQL注入以及为什么预处理语句避免SQL注入的详细信息,请阅读。@deceze
    +1
    ,以获得良好的解释。但是,在什么情况下,或者在什么时候使用其中一种而不是另一种变得重要?我只知道为什么一个变量比另一个更适合某些条件。@Simon通过引用绑定变量,您可以绑定它一次,然后遍历数据,为变量赋值,并反复执行查询,而无需重复绑定。可能效率稍高一些,但对性能几乎没有任何影响。不过,这可能会使代码稍微干净一些。