【问题标题】:PDO prepared statement troublePDO 准备好的语句麻烦
【发布时间】:2014-04-05 03:43:32
【问题描述】:

我目前正在尝试运行一个查询,其中 mysql 表列的当前值自身增加 1...让我用 mysql 查询示例来展示这个

$sql = mysql_query("UPDATE `table` SET quantity=quantity+1 WHERE id='$id'");

我无法在 PDO 准备好的语句中执行此操作...

$sql = "UPDATE `table` SET quantity=:quants+1 WHERE id=:userid";
$sql_prep = $db->prepare($sql);
$sql_prep->bindParam(":quants", what will i write here??);
$sql_prep->bindParam(":userid", $id);
$sql_prep->execute();

需要帮助..!谢谢

【问题讨论】:

    标签: php mysql pdo prepared-statement


    【解决方案1】:

    您不需要将其作为参数传递,只需这样做:

    $sql = "UPDATE `table` SET quantity=quantity+1 WHERE id=:userid";
    $sql_prep = $db->prepare($sql);
    $sql_prep->bindParam(":userid", $id);
    $sql_prep->execute();
    

    【讨论】:

    • sql_injection 呢?这个查询会阻止 sql 注入吗...??
    • 无注入,您传递给查询的唯一参数是用户 ID。数量在数据库内部。
    • 在对数据库内部数据进行转置或操作时,一般不用担心SQL注入,MySQL数据库已经在处理原生数据,不需要指导如何处理它。此规则的例外情况是您在存储过程中编写 SQL 查询
    • ok.. 那么用户 ID 绑定参数呢?.. 为了更安全,我是否必须执行类似 PDO::PARAM_INT 之类的操作?
    • 没关系,参数数据类型是可选的。如果您的 id 字段是一个整数,那么您可以添加 PDO::PARAM_INT 只是为了完整性,但这不是必需的。
    【解决方案2】:

    您不需要保护quantity,因为您只是在增加数据库中已有的值。

     $sql = "UPDATE `table` SET quantity=quantity+1 WHERE id=:userid";
    

    您也可以删除:quants 的绑定行

     $sql_prep = $db->prepare($sql);
    
     // NOT NEEEDED --> $sql_prep->bindParam(":quants", what will i write here??);
    
     $sql_prep->bindParam(":userid", $id);
     $sql_prep->execute();
    

    Prepared statements 用于保护通过查询从外部插入数据库的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2011-07-13
      • 2017-09-29
      • 2014-07-20
      相关资源
      最近更新 更多