【问题标题】:Reasons to strongly type parameters in PDO?在 PDO 中强类型参数的原因?
【发布时间】:2011-08-13 04:40:42
【问题描述】:

SQL语句绑定参数时,可以提供PDO::PARAM_STR这样的参数类型。如果不这样做,请键入默认值PDO::PARAM_STR。具体设置每个参数的类型的原因是什么? PDO::PARAM_STR 可以与我至少在 MySQL 中所知道的任何参数一起使用。我认为即使使用 PDO::PARAM_STR 也可以使用 BLOB 列。

PDO::PARAM_STR 不会引入任何 SQL 注入,因为您仍然有准备好的查询。

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    使用PARAM_STR 碰巧总是在列值中工作,因为 mySQL implicitly converts values to the correct type where it can,但例如在此查询中它会失败:

    $limit = 1;
    
    $dbh->prepare("SELECT * FROM items LIMIT :limit");
    $dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
         // Will throw "You have an error in your SQL syntax..."
    

    绝对应该在适当的情况下使用PARAM_INT - 对于上述情况,并为 mySQL 以外的数据库引擎做准备,这些引擎可能对他们的期望更严格。

    【讨论】:

    • +1 来自我,很好的例子。应该避免的不仅仅是 SQL 注入,向用户显示原始 MySQL 错误消息既不吸引人也不专业,因此开发人员应该始终强制执行类型安全。
    • @N.B.对我来说太无聊了。我更喜欢简洁的代码而不是一次又一次地重复这个绑定
    • 您在哪个 PHP 版本上测试您的代码?我在 Windows 上安装了 5.3.1,使用 PDO::ATTR_EMULATE_PREPARES 或不使用 @Col 的参数化 LIMIT 子句都不会引发异常。建议。那么其他数据库呢?他们也进行类型转换吗?
    【解决方案2】:

    我个人认为没有理由,只要你设置了这个属性:

    $dbh->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
    

    所以,它会自动检测 LIMIT case

    无论如何,我更愿意在占位符中定义类型,而不是在绑定函数中。

    但是,我在 PDO 方面的经验并不那么丰富。我只是试了一下,决定回到普通的mysql。

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      相关资源
      最近更新 更多