代码之家  ›  专栏  ›  技术社区  ›  John M.

如何检索使用PDO删除的行数?

  •  8
  • John M.  · 技术社区  · 16 年前

    好吧,所以我一直在用 PDO wrapper 对于我正在处理的一个项目,我正在尝试找出删除查询是否成功。下面是我使用的代码:

    /**
    * A pretty straight-forward query to delete a row from the verification
    * table where user_id is $user_id and code is $code
    */
    $result = $this->database->query("DELETE FROM verification " .
                                     "WHERE user_id = %u AND code = %s",
                                     $user_id,
                                     $code);
    
    /**
     * This function will grab the PDO's exec() return, which should
     * return the number of rows modified.
     */
    if($this->database->getNumAffected($result) > 0)
        return true;
    else
        return false;
    

    问题是,无论删除查询是否实际删除行,$this->database->getNumAffected($result)始终返回“0”。

    您可以检查包装器,但基本上$this->database->getNumAffected($result)只返回与pdo::exec()返回的值完全相同的值。

    我在没有包装器的情况下尝试了这段代码(直接进入PDO),但我遇到了同样的问题:它总是返回“1”(无论是否删除了一行)。

    任何帮助都将不胜感激。

    编辑 基于 this 所以问题是,我做的一切都很好…我不明白为什么这样不行。

    2 回复  |  直到 16 年前
        1
  •  2
  •   TML    16 年前

    它不能像您期望的那样工作,因为您使用的“包装器”从来没有使用过pdo::exec()—它包装 一切 在PDO声明中。根据从您提供的URL快速读取'database'类2.2.6版的源代码,“query”方法应返回包含语句句柄的数组:

    502 $statement = $this -> getDatabaseConnection () -> prepare ( $query );
    ...
    587 $ret = array ( $statement, func_get_args (), $lastIndex );
    588     
    589 return ( $ret );
    

    所以,假设你 $this->database->query() 正在调用此数据库类' query 方法,您应该能够 $result[0]->rowCount() .

    请注意,您对早期响应的断言“由于rowcount()函数存在错误,[您]正在使用的包装器使用了不同版本的rowcount()不是真的-包装器实现了numRows,但这与 PDOStatement::rowCount() ,它在从返回的语句句柄内是完整的 database::query() .

        2
  •  8
  •   dmitrig01    16 年前
    $query = $this->database->prepare("DELETE FROM verification WHERE user_id = :user_id AND code = :code", array('user_id' => $user_id, 'code' => $code));
    $query->execute();
    
    if ($query->rowCount() > 0) {
      return TRUE;
    }
    return FALSE;