好的,所以我一直在使用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问题,我正在做的一切......我不明白为什么这不起作用。
答案 0 :(得分: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;
答案 1 :(得分: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 );
因此,假设您的$this->database->query()
正在调用此数据库类“query
方法,那么您应该可以执行$result[0]->rowCount()
。
请注意,您对早期响应的断言“由于rowCount()函数存在错误而导致[您正在使用的包装器使用不同版本的rowCount()”不正确 - 包装器实现了numRows,但这与PDOStatement::rowCount()不同,{{3}}在database::query()
返回的语句句柄内部完好无损。