我已经构建了一个类,它利用了 PHP 的内置 MySQLi 类的能力,它旨在简化数据库交互。但是,使用 OOP 方法时,我很难使用 num_rows 实例变量在运行查询后返回正确的行数。看看我班级的快照......
class Database {
//Connect to the database, all goes well ...
//Run a basic query on the database
public function query($query) {
//Run a query on the database an make sure is executed successfully
try {
//$this->connection->query uses MySQLi's built-in query method, not this one
if ($result = $this->connection->query($query, MYSQLI_USE_RESULT)) {
return $result;
} else {
$error = debug_backtrace();
throw new Exception(/* A long error message is thrown here */);
}
} catch (Exception $e) {
$this->connection->close();
die($e->getMessage());
}
}
//More methods, nothing of interest ...
}
这是一个示例用法:
$db = new Database();
$result = $db->query("SELECT * FROM `pages`"); //Contains at least one entry
echo $result->num_rows; //Returns "0"
exit;
这怎么不准确?结果对象的其他值是准确的,例如“field_count”。
此代码取自 PHP 手册条目中的注释(因无关紧要现已删除):
$sql = "valid select statement that yields results";
if($result = $mysqli-connection->query($sql, MYSQLI_USE_RESULT))
{
echo $result->num_rows; //zero
while($row = $result->fetch_row())
{
echo $result->num_rows; //incrementing by one each time
}
echo $result->num_rows; // Finally the total count
}
这里的问题是MYSQLI_USE_RESULT。如果删除它,num_rows 属性将为您提供一个正确的数字,因为 PHP 将预取整个结果集并将其存储在 PHP 进程的内存中——因此将能够计算其中的行数。
如果您需要使用 MYSQLI_USE_RESULT(节省内存),则无法事先获取数字。
我遇到了同样的问题,发现解决方案是:
$result->store_result();
..在 $query 执行之后和之前
echo $result->num_rows;
当您使用 MYSQLI_USE_RESULT
禁用结果行的缓冲时,这可能是正常行为禁用缓冲区意味着由您来获取、存储和COUNT行。 你应该使用默认标志
$this->connection->query($query, MYSQLI_STORE_RESULT);
相当于
$this->connection->query($query)