07/201825

【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が入っているようです。

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

2018072501.png

見ての通りですね。

どうやら一意になる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に指定されてなくてもこの修正した書き方で問題ないんだよね……?

関連エントリー

【freo】メディア一括表示プラグインを指定数のみ表示する【プラグイン】

※ただしsmarty3限定 freoで新着メディアを表示したい場合、たぶん...

2018/04/11
【freo】メディア登録(タグ機能追加版)【改造】

どうも、freoのメディア登録ってメディアの説明を入力するところはあっても、タ...

2018/01/04
SSL化予定

最近絵の記事が全くない御堂です。 てめぇ本当に絵描か? それはさておき...

2017/08/18
【freo】TinyMCE 4 でのテーマの変更方法

別にfreoに限った話じゃないですけどね。TinyMCE4を実装しているところ...

2014/05/06
【freo】任意のページ内容を任意の箇所に表示【Tips】

freo1.10来ましたね。 それはそうと、freoってなんだかインフォメ...

2014/05/03
【freo】ページ送りナビゲーション【テンプレート】

freoのページ送りナビゲーションって初期だと前のページと次のページのみなんで...

2014/01/04

コメント

  • コメントはまだありません。

コメント登録

  • 閲覧制限 ※管理者のみにすると投稿者でも確認ができなくなります。

archive


×

ログイン