自分は以前からずっと、アクセス集計・解析用に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の初期セットアップでエラーになってしまう方は、こちらの記事をどうぞ。
今回発生するエラーの内容
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日
コメント