[PHP] MoguraPlusXがMySQL5.7でエラーになる場合の対処法

自分は以前からずっと、アクセス集計・解析用にMoguraPlusXを導入しています。

導入が楽なことと、集計画面が自分にとってとても見やすくて使いやすいから、というのが理由で、会社のサイト管理でも、GoogleAnalyticsとMoguraPlusXを併用しています。

そんな使いやすいMoguraPlusXですが、MySQL5.7の環境に導入したところ、そのままではアクセス解析画面でエラーになってしまい、使うことができませんでした。

どうやら、MySQL5.7からデフォルトで sql_modeにONLY_FULL_GROUP_BYが設定されるようになったため、SQLを厳密に書かなければならず、今までのあいまいなSQLではエラーになってしまうようです。

今回はONLY_FULL_GROUP_BYを無効にすることで動くようになりましたので、あまりおすすめできる方法ではありませんがご紹介します。

動作確認環境は、PHP7.1、MySQL5.7です。

MoguraPlusXの初期セットアップでエラーになってしまう方は、こちらの記事をどうぞ。

[PHP] MoguraPlusXの初期セットアップでエラーになる場合の対処法
自分は以前からずっと、アクセス集計・解析用にMoguraPlusXを導入しています。 導入が楽なことと、集計画面が自分にとってとても見やすくて使いやすいから、というのが理由で、会社のサイト管理でも、GoogleAnalyticsとMogur...

今回発生するエラーの内容

MySQL5.7で発生するエラーは、下記のようなものになります。

DB Error: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'DBカラム名' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Warning: mysqli_real_query(): Couldn't fetch mysqli in /home/***/www/mogplusx/inc/mysqli.php on line 95
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /home/***/www/mogplusx/inc/mysqli.php on line 118
Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in /home/***/www/mogplusx/inc/mysqli.php on line 125
Warning: mysqli_real_query(): Couldn't fetch mysqli in /home/***/www/mogplusx/inc/mysqli.php on line 95
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /home/***/www/mogplusx/inc/mysqli.php on line 118
Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in /home/***/www/mogplusx/inc/mysqli.php on line 125
Warning: mysqli_real_query(): Couldn't fetch mysqli in /home/***/www/mogplusx/inc/mysqli.php on line 95
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /home/***/www/mogplusx/inc/mysqli.php on line 118
Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in /home/***/www/mogplusx/inc/mysqli.php on line 125
Warning: mysqli_real_query(): Couldn't fetch mysqli in /home/***/www/mogplusx/inc/mysqli.php on line 95
Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /home/***/www/mogplusx/inc/mysqli.php on line 118
Warning: mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given in /home/***/www/mogplusx/inc/mysqli.php on line 125


mysqli.phpの修正

40行目と41行目の間に、以下の行を挿入します。

if($this->getServerInfo() < "4.1") return true;
if(function_exists('mysqli_set_charset')){

          ↓

if($this->getServerInfo() < "4.1") return true;
$sqlresult = $this->query('SET SESSION sql_mode = \'STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION\';');
if(function_exists('mysqli_set_charset')){

レンタルサーバのほとんどはmy.cnfを書き換えることができないため、一時的にONLY_FULL_GROUP_BYを無効化する処理を入れます。念のため、それ以外のチェックモードは有効にしておきます。

全てのモードを無効にしてもいいのであれば、SET SESSION sql_mode = \'\' としても動きます。


本来はSQLを修正するのが筋

今回発生するエラーはそもそもSQLの記述が曖昧なのが問題であり、本来はSQLをきちんと修正する必要があります。

ですが、そこまで手間がかけられない!という私のような方向けに、とりあえず動くようにするための修正方法をご紹介しました!


初稿:2018年12月13日

コメント

タイトルとURLをコピーしました