Llamada a la función indefinida mysqli_result :: num_rows ()

Estoy tratando de contar el número de filas en un resultado, y sigo obteniendo el error anterior. He revisado el manual y estoy usando mysqli_result :: num_rows () como debería (estoy usando el estilo orientado a objetos). Tengo tres clases trabajando aquí.

Clase (Conexión):

class utils_MysqlImprovedConnection { protected $_connection; public function __construct($host, $user, $pwd, $db) { $this->_connection = @new mysqli($host, $user, $pwd, $db); if(mysqli_connect_errno ()) { throw new RuntimeException('Cannot access database:' . mysqli_connect_error()); } } public function getResultSet($sql) { $results = new utils_MysqlImprovedResult($sql, $this->_connection); return $results; } public function __destruct() { $this->_connection; } } 

Clase (maneja el resultado):

 class utils_MysqlImprovedResult implements Iterator, Countable { protected $_key; protected $_current; protected $_valid; protected $_result; public function __construct($sql, $connection) { if (!$this->_result = $connection->query($sql)){ throw new RuntimeException($connection->error . '. The actual query submitted was: '. $sql); } } public function rewind() { if (!is_null($this->_key)){ $this->_result->data_seek(0); } $this->_current = $this->_result->fetch_assoc(); $this->_valid = is_null($this->_current) ? false : true; } public function valid() { return $this->_valid; } public function current() { return $this->_current; } public function key() { return $this->_key; } public function next() { $this->_current = $this->_result->fetch_assoc(); $this->_valid = is_null($this->_current) ? false : true; $this->_key++; } public function count() { $this->_result->store_result(); $this->_result->num_rows(); } } 

Función de clase:

 public function resetPassword($email, $pass){ //check if email exists, update authkey and password, send email $sql = "SELECT * FROM table WHERE column = '$email'"; $results = $this->_db->getResultSet($sql); if($results->count() == 1){ // Process $this->_message = "Success!"; return $this->_message; } else { // Not unique $this->_error = "Try again"; return $this->_error; } } 

La página de prueba que estoy usando para llamar a todo esto es (la instrucción include es solo la función __autoload () que funciona bien):

 $columnvar = 'emailaddress@test.com'; $pass = 'blah'; require_once 'inc.init.php'; $user = new utils_User(); try{ $string = $user->resetPassword($email, $pass); echo $string; } catch(Exception $e) { echo $e; } 

Del manual, parece que mysqli_result :: num_rows no es una función, sino una variable que contiene el número de filas.

Se puede usar así:

 $num_rows = $mysqli_result->num_rows; 

La función equivalente es mysqli_num_rows($result) , donde pasa el objeto mysqli_result , pero eso es si está utilizando el estilo de procedimiento en lugar del estilo orientado a objetos.

En tu código, debes cambiar tu función count() en la clase utils_MysqlImprovedResult para que sea así (supongo que esa es la función donde utils_MysqlImprovedResult el mensaje de error),

 public function count() { // Any other processing you want // ... return $this->_result->num_rows; } 

o alternativamente, si desea mezclar OO y estilos de procedimiento (probablemente una mala idea),

 public function count() { // Any other processing you want // ... return mysqli_num_rows($this->_result); }