PHP致命错误:在布尔值中调用成员函数num_rows()

时间:2019-05-09 01:28:37

标签: php codeigniter

我已经将网站从服务器移到另一个服务器,尝试访问测验结果页面时出现错误。 错误提示:

无法处理此请求。

查看我的php错误日志后,发现以下行:

[09-May-2019 08:19:13 Asia/Kolkata] PHP Fatal error:  Call to a member 
function num_rows() on boolean in
/home/USER/public_html/PATH/PATH/models/Result_model.php on line 
143

这是文件内容的主要部分,请注意,我在143的引用行中将注释为:

function get_result($rid){
$logged_in=$this->session->userdata('logged_in');
$uid=$logged_in['uid'];
if($logged_in['su']=='0'){
$this->db->where('savsoft_result.uid',$uid);
}
$this->db->where('savsoft_result.rid',$rid);
 $this->db->join('savsoft_users','savsoft_users.uid=savsoft_result.uid');
$this->db->join('savsoft_group','savsoft_group.gid=savsoft_users.gid');
$this->db->join('savsoft_quiz','savsoft_quiz.quid=savsoft_result.quid');
$query=$this->db->get('savsoft_result');
return $query->row_array();


}


function last_ten_result($quid){
    $this->db->order_by('percentage_obtained','desc');
    $this->db->limit(10);       
    $this->db->where('savsoft_result.quid',$quid);
    $this->db->join('savsoft_users','savsoft_users.uid=savsoft_result.uid'); 
    $this->db->join('savsoft_quiz','savsoft_quiz.quid=savsoft_result.quid');
    $query=$this->db->get('savsoft_result');
    return $query->result_array();
}



function get_percentile($quid,$uid,$score){
$logged_in =$this->session->userdata('logged_in');
$gid= $logged_in['gid'];
$res=array();
$this->db->where("savsoft_result.quid",$quid);
$this->db->group_by("savsoft_result.uid");
$this->db->order_by("savsoft_result.score_obtained",'DESC');
$query = $this -> db -> get('savsoft_result');
$res[0]=$query -> num_rows();    // THIS IS LINE 143


$this->db->where("savsoft_result.quid",$quid);
$this->db->where("savsoft_result.uid !=",$uid);
$this->db->where("savsoft_result.score_obtained <=",$score);
$this->db->group_by("savsoft_result.uid");
$this->db->order_by("savsoft_result.score_obtained",'DESC');
$querys = $this -> db -> get('savsoft_result');
$res[1]=$querys -> num_rows();

return $res;

试图根据StackOverFlow中的其他问题解决此问题,但无法提交所有尝试。

有人解决了这个问题吗?

1 个答案:

答案 0 :(得分:0)

正如我们在聊天中所讨论的,问题是由服务器迁移和使用MySQL 5.7+的新服务器(默认启用only_full_group_by)引起的。

原因是MySQL无法选择与分组和错误相关的行列式值,而不是像先前版本的SELECT中那样默默地忽略SELECT customer, SUM(order_total) FROM orders GROUP BY purchase_date语句中可能不需要的值。 MySQL的。
例如:purchase_date
如果两个或两个以上的客户具有相同的SELECT *,则只能显示一个,而MySQL需要确定您想要的那个。

由于CodeIgniter在使用$this->db->get()时默认使用GROUP BY作为语句,因此会遇到错误。

为解决该问题,强烈建议在整个应用程序中将与您的GROUP BY相关的查询的所有所有更新为与MySQL 5.7兼容。这样可以确保您从$query->num_rows()语句中检索正确的值。

您可以使用一些选项,以最简单和最有益的顺序进行。

1)使用$this->db->count_all_results()代替SELECT COUNT(*)
(aka:$this->db->where("savsoft_result.quid",$quid); $this->db->group_by("savsoft_result.uid"); $res[0] = $this->db->count_all_results('savsoft_result'); $this->db->where("savsoft_result.quid",$quid); $this->db->where("savsoft_result.uid !=",$uid); $this->db->where("savsoft_result.score_obtained <=",$score); $this->db->group_by("savsoft_result.uid"); $res[1] = $this->db->count_all_results('savsoft_result');

order_by

请注意删除$this->db->select('savsoft_result.uid'); $this->db->where("savsoft_result.quid",$quid); $this->db->group_by("savsoft_result.uid"); $this->db->order_by("savsoft_result.score_obtained",'DESC'); $query = $this->db->get('savsoft_result'); $res[0] = $query->num_rows(); $this->db->select('savsoft_result.uid'); $this->db->where("savsoft_result.quid",$quid); $this->db->where("savsoft_result.uid !=",$uid); $this->db->where("savsoft_result.score_obtained <=",$score); $this->db->group_by("savsoft_result.uid"); $this->db->order_by("savsoft_result.score_obtained",'DESC'); $querys = $this->db->get('savsoft_result'); $res[1] = $querys->num_rows(); ,因为它不需要计算行数。

2)将值限制为仅分组的值

only_full_group_by

3)为所有未分组的列明确定义ANY_VALUE
(这等同于禁用SELECT ANY_VALUE(customer), SUM(order_total) FROM orders GROUP BY purchase_date

使用我上面提供的查询。

$this->db->select('ANY_VALUE(savsoft_result.quid), ANY_VALUE(savsoft_result.score_obtained), savsoft_result.uid');
$this->db->where("savsoft_result.quid",$quid);
$this->db->group_by("savsoft_result.uid");
$this->db->order_by("savsoft_result.score_obtained",'DESC');
$query = $this -> db -> get('savsoft_result');
$res[0] = $query->num_rows();

$this->db->select('ANY_VALUE(savsoft_result.quid), ANY_VALUE(savsoft_result.score_obtained), savsoft_result.uid');
$this->db->where("savsoft_result.quid",$quid);
$this->db->where("savsoft_result.uid !=",$uid);
$this->db->where("savsoft_result.score_obtained <=",$score);
$this->db->group_by("savsoft_result.uid");
$this->db->order_by("savsoft_result.score_obtained",'DESC');
$querys = $this->db->get('savsoft_result');
$res[1] = $querys->num_rows();

因此,您应该能够使用如下所示的内容,请确保在相关表中添加所有未分组的列。

only_full_group_by

或者,您可以禁用SET GLOBAL sql_mode。

您可以通过执行SET GLOBAL sql_mode=(SELECT TRIM(BOTH ',' FROM REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))); 语句来更新全局变量,从而 临时 将其禁用。

sql_mode

这将检索当前使用的ONLY_FULL_GROUP_BY并删除only_full_group_by部分,然后删除所有剩余的前导或尾随逗号。但是,一旦MySQL服务重新启动,您将需要再次执行该语句。

要确保在重新启动MySQL服务时my.cnf不会恢复为启用状态,请编辑ONLY_FULL_GROUP_BY MySQL配置文件,在sql_mode声明中省略sql_mode

您可以通过执行以下语句来检索当前的SHOW VARIABLES LIKE 'sql_mode';

ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

应该返回以下内容:

sql_mode

复制整个文本,然后在my.cnf文件中声明ONLY_FULL_GROUP_BY,删除[mysqld] sql_mode=ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_VALUE_ON_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 部分。

my.cnf

更改db.contact.aggregate([ { $lookup: { from: "opportunity", localField: "oppID", foreignField: "_id", as: "opportunities" } }, { $project: { _id: 1, oppName: { $reduce: { input: "$opportunities", initialValue: "", in: { $cond: [ { $eq: [ "$$value", "" ] }, "$$this.name", { $concat: [ "$$value", ", ", "$$this.name" ] } ] } } } } } ]) 文件后,重新启动MySQL服务。