我已经将网站从服务器移到另一个服务器,尝试访问测验结果页面时出现错误。 错误提示:
无法处理此请求。
查看我的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中的其他问题解决此问题,但无法提交所有尝试。
有人解决了这个问题吗?
答案 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服务。