【问题标题】:pdo prepared statement doesnt updatepdo 准备好的语句不更新
【发布时间】:2011-08-01 12:12:39
【问题描述】:

这似乎没有更新记录。有谁知道为什么?

    try {
        $status = 'OK';
        $messId = 179981;
        #die(var_dump($messId, $this->campaignId, $this->userId, $status));
        $stmt = $this->dbh->prepare("UPDATE tbl_inbound_responses SET status = :status, sent = '1' WHERE fk_userId = :userId AND fk_campaignId = :campId AND pk_messageId = :messId") or die("Prepare Error");
        $stmt->bindParam(':userId', $this->userId);
        $stmt->bindParam(':campId', $this->campaignId);
        $stmt->bindParam(':messId', $messId);
        $stmt->bindParam(':status', $status);
        $stmt->execute();

        #var_dump($stmt->debugDumpParams(), $stmt->errorInfo());

        if($err = $stmt->errorInfo()) {
            if($err[0] != '00000') {
                var_dump($stmt->debugDumpParams());
            }
        }               

    }
    catch(PDOException $e) {
        die($e->getMessage());
    }

脚本也有

$this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

设置和

$stmt->debugDumpParams();

报告:

SQL: [120] UPDATE tbl_inbound_responses SET status = :status, sent = '1' WHERE fk_userId = :userId AND fk_campaignId = :campId AND pk_messageId = :messId
Params: 4
Key: Name: [7] :userId paramno=-1 name=[7] ":userId" is_param=1 param_type=2
Key: Name: [7] :campId paramno=-1 name=[7] ":campId" is_param=1 param_type=2
Key: Name: [7] :messId paramno=-1 name=[7] ":messId" is_param=1 param_type=2
Key: Name: [7] :status paramno=-1 name=[7] ":status" is_param=1 param_type=2
NULL array(3) { [0]=> string(5) "00000" [1]=> NULL [2]=> NULL } 

干杯。

编辑:

我不相信它与:

PHP PDO Update prepared statement problemPHP PDO Prepared statement query not updating record

【问题讨论】:

  • @mario,感谢您的格式化:D

标签: php mysql pdo prepared-statement


【解决方案1】:

如果您没有收到异常,则说明 SQL 查询或 PDO 破坏它的方式没有任何问题。最可能的原因是参数问题。所以尝试调试它。将您的 ->bindParam 电话替换为:

    $params = array(
         ':userId' => $this->userId,
         ':campId' => $this->campaignId,
         ':messId' => $messId,
         ':status' => $status,
    );
    var_dump($params);
    $stmt->execute($params);

这可能会给出提示。如果失败,请尝试? 枚举参数。在任何情况下,使用 SQL 中的原始“字符串值”重新运行相同的查询以进行测试(在您选择的任何查询工具中)。

【讨论】:

  • 谢谢@Mario,这一定是与绑定参数有关。
  • 只能是参数。你的代码没有问题。所以:}
【解决方案2】:

您的查询有问题!使用“,”而不是“AND”:

$stmt = $this->dbh->prepare("UPDATE tbl_inbound_responses SET status = :status, sent = 1 WHERE fk_userId = :userId, fk_campaignId = :campId, pk_messageId = :messId") or die("Prepare Error");

【讨论】:

  • 这个问题和解决方案已经超过 3 年了。感谢您的意见,但很久以前就已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2011-01-08
  • 2010-11-30
相关资源
最近更新 更多