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

Joh*_* M. 8 php mysql pdo

好的,所以我一直在为我正在研究的项目使用PDO包装器,而我正试图找出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;
Run Code Online (Sandbox Code Playgroud)

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

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

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

任何帮助将不胜感激.

编辑:基于这个问题,我正在做的一切......我不明白为什么这不起作用.

dmi*_*g01 8

$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;
Run Code Online (Sandbox Code Playgroud)


TML*_*TML 2

它无法按您的预期工作,因为您使用的“包装器”从未使用过 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 );
Run Code Online (Sandbox Code Playgroud)

因此,假设您$this->database->query()正在调用此数据库类的query方法,您应该能够执行以下操作$result[0]->rowCount()

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

  • 我的意思是它不使用 PDO::exec(),而是使用 PDOStatement::execute(),这是完全不同的事情。访问 php.net/pdo 并了解 PDO 对象(及其“exec()”方法)和 PDOStatement 对象(及其“execute()”方法)之间的区别可能会很有用。其中存在一些非常关键的差异。 (2认同)