Вызов неопределенной функции mysqli_result :: num_rows () - PullRequest
7 голосов
/ 22 декабря 2011

Я пытаюсь посчитать количество строк в результате, и я продолжаю получать вышеуказанную ошибку.Я проверил руководство, и я использую mysqli_result :: num_rows (), как и должно быть (я использую объектно-ориентированный стиль.) У меня здесь работают три класса.

Class (Connection):

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;
    }
}

Класс (Результат обработки):

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();
    }
}

Функция класса:

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;
    } 
}

Тестовая страница, которую я использую для вызова всего этого,(оператор включения - это просто функция __autoload (), которая работает нормально):

$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;
}

1 Ответ

8 голосов
/ 22 декабря 2011

Из руководства кажется, что mysqli_result :: num_rows не функция, а переменная, содержащая количество строк.

Может использоваться следующим образом:

$num_rows = $mysqli_result->num_rows;

Эквивалентом функции является mysqli_num_rows($result), где вы передаете объект mysqli_result, но это если вы используете процедурный стиль, а не объектно-ориентированный стиль.

В вашем коде вы должны изменить функцию count() в классе utils_MysqlImprovedResult, чтобы она была такой (я предполагаю, что это функция, в которой вы получаете сообщение об ошибке),

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

или, если вы хотите смешать ОО и процедурные стили (вероятно, плохая идея),

public function count()
{
    // Any other processing you want
    // ...
    return mysqli_num_rows($this->_result);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...