【freo】関連エントリープラグインでエラー【MySQL 5.7】

先日、うちのサイトをMySQL5.5から5.7に変更したんですけど、どうやら一部記事にエラーが出ていたようです。

Expression #21 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'dataBaseName.freo_category_sets.category_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=onry_full_group_by

エラー出現条件はMySQL5.7及び関連エントリープラグイン導入です。

原因

まぁ見ての通り、SQL文のGROUP BY句でエラーってますね。

どうやらMySQL5.7ではデフォルトでsql_modeにonly_full_group_byが入っているようです。

ちなみにうちで使っているさくらインターネット(スタンダード)ではこんな感じになってました。

見ての通りですね。

どうやら一意になるcolumnをGROUP BY句にちゃんと指定しないとだめよってことらしいです(たぶん

解決

その1(安易)

とりあえず安易な解決策としてはsql_modeを5.5のときと同じに設定し直すっていう手段があります(うちの場合は何も設定されてませんでした)

SET GLOBAL sql_mode = '';

……なのですが、前述の通りうちのサーバーはレンタルサーバーなのでmy.cnfとか好きにいじれません(ユーザーディレクトリに置けるようなのを見た気がするけど、再起動できないからね)

その2(正攻法)

仕方ないのでどこが原因のソースなのか調べました。

んでそいつは公式で配布されている『関連エントリープラグイン』でしたね。

display.entry_relate.php:81行(ver1.3.0段階)

$stmt = $freo->pdo->prepare('SELECT id, user_id, created, modified, approved, restriction, password, status, display, comment, trackback, code, title, tag, datetime, close, file, image, memo, text, category_id, entry_id FROM ' . FREO_DATABASE_PREFIX . 'entries LEFT JOIN ' . FREO_DATABASE_PREFIX . 'category_sets ON id = entry_id WHERE id <> :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' GROUP BY id ORDER BY datetime DESC LIMIT :limit');

$stmt = $freo->pdo->prepare('SELECT id, user_id, created, modified, approved, restriction, password, status, display, comment, trackback, code, title, tag, datetime, close, file, image, memo, text, category_id, entry_id FROM ' . FREO_DATABASE_PREFIX . 'entries LEFT JOIN ' . FREO_DATABASE_PREFIX . 'category_sets ON id = entry_id WHERE id <> :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' GROUP BY id, user_id, created, modified, approved, restriction, password, status, display, comment, trackback, code, title, tag, datetime, close, file, image, memo, text, category_id, entry_id ORDER BY datetime DESC LIMIT :limit');

に変更すればいいです。

変更箇所はSELECT句とGROUP BY句を一致させただけです。

おわり

まぁfreo本体側は関係なかったし、対象コードも自分の環境では1箇所でしたのですぐ対処できてよかったです。

他のプラグインなんかでもGROUP BY句を使っていたら書き方の関係でもしかしたらエラーになるかもしれませんが、同様に対処すればいいと思います。

ちなみにこれ、別にsql_modeに指定されてなくてもこの修正した書き方で問題ないんだよね……?

コメント
※コメントは承認制となっていますので、コメントを頂いても直ぐには表示されません。
※不適切な内容(スパムや悪意ある内容等)のコメントは公開されませんので、ご了承ください。
※返信が必要な場合などでコメントの公開を通知されたい場合はメールアドレスの入力をお願いします。
名もなき名無しさん
メールアドレス(例:コメントの公開通知が欲しい場合)
内容