【问题标题】:Call to undefined function mysqli_result::num_rows()调用未定义函数 mysqli_result::num_rows()
【发布时间】:2011-12-22 17:57:22
【问题描述】:

我正在尝试计算结果中的行数,并且不断收到上述返回的错误。我已经检查了手册,并且我应该使用 mysqli_result::num_rows() (我使用的是面向对象的样式。)我有三个类在这里工作。

类(连接):

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

【问题讨论】:

  • 注意:我原来没有:
  • 注意:我原来没有'code' $this->store_result();函数中的“代码”,经过一些研究后才添加,认为它可能会有所帮助。
  • 去掉括号。 $this->_result->num_rows();到 $this->_result->num_rows;它对我有用

标签: php mysqli


【解决方案1】:

从手册来看,mysqli_result::num_rows 似乎不是一个函数,而是一个包含行数的变量。

可以这样使用:

$num_rows = $mysqli_result->num_rows;

等效的函数是mysqli_num_rows($result),您在其中传入mysqli_result 对象,但前提是您使用的是过程风格而不是面向对象的风格。

在您的代码中,您应该将 utils_MysqlImprovedResult 类中的 count() 函数更改为这样(我假设这是您收到错误消息的函数),

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

或者,如果您想混合使用 OO 和程序样式(可能是个坏主意),

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

【讨论】:

  • 这里不就是这样使用的吗?我查了手册,这也是手册中的用法。
  • 在你的代码中你有“$this->_result->num_rows();”,这不是它在手册中的使用方式。在手册中它被描述为“int $mysqli_result->num_rows;” (注意缺少函数大括号“()”)。将其更改为“返回 $this->_result->num_rows;”在您的代码中,它应该可以工作。
  • 谢谢...这是我在这里的第一个问题。很高兴和你做生意。
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 2015-10-16
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-24
相关资源
最近更新 更多