【问题标题】:How can I retrieve the number of rows deleted with PDO?如何检索使用 PDO 删除的行数?
【发布时间】:2010-01-03 21:37:37
【问题描述】:

好的,所以我一直在为我正在进行的项目使用PDO wrapper,并且我正在尝试确定 DELETE 查询是否成功。这是我正在使用的代码:

/**
* 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;

问题是,无论DELETE查询是否真的删除了一行,$this->database->getNumAffected($result)总是返回'0'。

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

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

任何帮助将不胜感激。

编辑:基于this SO 问题,我做的一切都是正确的......我不明白为什么这不起作用。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:
    $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;
    

    【讨论】:

    • 嗯,由于 rowCount() 函数存在错误,我正在使用的包装器使用不同版本的 rowCount()。包装器中的 numRows() 只是执行 SELECT COUNT(*) 查询,因此这不适用于包装器。
    【解决方案2】:

    它不会像您期望的那样工作,因为您使用的“包装器”从未使用 PDO::exec() - 它在 PDO 语句中包装 everything。根据您提供的 URL 中“数据库”类 2.2.6 版源代码的快速阅读,“查询”方法应返回一个包含语句句柄的数组:

    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() 不同,PDOStatement::rowCount() 在从database::query() 返回的语句句柄内部是完整的。

    【讨论】:

    • 我不确定您的意思是它不使用 exec(),按 Ctrl + F 并输入 execute (。不过,谢谢您的回答。
    • 我的意思是它不使用 PDO::exec(),而是使用 PDOStatement::execute(),这是完全不同的事情。访问 php.net/pdo 并了解 PDO 对象(及其 'exec()' 方法)和 PDOStatement 对象(及其 'execute()' 方法)之间的区别可能会很有用。那里有一些非常关键的区别。
    • 啊,好吧,这很有道理。非常感谢您的回答,我会调查的。我对 PDO 了解不多,因为当我开始学习它时(这是由制作这个包装器的人提示的),我立即得到了一个包装器来代替。我看到的包装器的唯一优点是你必须输入变量,所以如果它是错误的类型(例如,当它应该是一个整数时是一个字符串)它会返回一个错误。哦,我的第一条评论的意思是:我知道 numRows() 与 rowCount() 非常不同,并且由于 numRows() 的工作方式,我不使用它。
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多