在PHP中对布尔值的成员函数num_rows()进行调用


Call to a member function num_rows() on boolean in PHP

我的代码出现以下错误

Call to a member function num_rows() on boolean in C:'xampp'htdocs'codeigniter'application'controllers'go.php on line 15

代码:

<?php if (!defined('BASEPATH')) {
    exit('No direct script access
    allowed');
}
class Go extends MY_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->load->helper('string');
    }
    public function index()
    {
        if (!$this->uri->segment(1)) {
            redirect(base_url());
        } else {
            $url_code = $this->uri->segment(1);
            $this->load->model('Urls_model');
            $query = $this->Urls_model->fetch_url($url_code);
            if ($query->num_rows() == 1) {
                foreach ($query->result() as $row) {
                    $url_address = $row->url_address;
                }
                redirect(prep_url($url_address));
            } else {
                $page_data = array(
                    'success_fail' => NULL,
                    'encoded_url'  => FALSE,
                );
                $this->load->view('common/header');
                $this->load->view('nav/top_nav');
                $this->load->view('create/create', $page_data);
                $this->load->view('common/footer');
            }
        }
    }
}

@ahmed认为数据库代码属于模型是正确的,但您遇到的问题很可能是数据库错误。

除了解决问题,解决方法是这样的。

if ($query->num_rows() == 1) {

应该改为

if ($query && $query->num_rows() == 1) {

我会在那里放一个其他的来将$this db->error()转储到error_log,这样你就可以看到问题所在

您应该在Model内部调用'num_rows()',而不是Controller,因为此函数经常在get()方法之后使用:

//Model function:
$query = $this->db->get();
$data = Array();
if($query->num_rows()){
    //Work with data:
    foreach($query->result_array() AS $row){
        $data[] = $row;
    }
}
return $data;

我想如果你想在控制器中使用num_rows,你应该返回查询结果如下:

$query = $this->db->get();
return $query;
    $data = [];
    $this->db->where('', 0);
    $query = $this->db->get('');
    if ($query->num_rows()>0)
    {
        foreach ($query->result_array() as $row)
        {
            $data[] = $row;
        }
    }
    $query->free_result();
    return $data;

首先检查值是否来自数据库。若值来自表,则放入大于0的值。如果您的值存在,则查询run forward。我感谢这对你的帮助

这是由CI中的Active Records错误引起的,该错误添加了一个额外的WHERE子句,导致列名不明确等。尝试使用$this->db->last_query();获取实际查询,就会立即清楚为什么$query不是对象。