[3.0.2]記事管理で非公開やラベル無しの絞り込みをするとデータベースエラーになる

バグかなと思ったらこちらへ。

[3.0.2]記事管理で非公開やラベル無しの絞り込みをするとデータベースエラーになる

投稿記事by minoji on 2018年10月31日(水) 19:26

お世話になっております。

SOY CMS 3.0.2で、記事の管理画面から、「公開状態等で絞り込み」の非公開や公開期間外、ラベル無しを選択すると、
「致命的なエラーが発生しました」となります。

環境としては、MySQL版SOY CMS 1.8.15から3.0.2へバージョンアップしています。
phpやmysqlのバージョンが異なる2つのサイトで同じ現象が起きているので、なにか不都合があると思います。

詳細は下記になります
-------------------------
エラーメッセージ
Invalid query.

詳細/解決策
データベースへのアクセス中にエラーが発生しました。。

レポート
DETECT DATE: 2018-10-31T19:18:11+09:00

MESSAGE: Invalid query. (SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') group by entry_id having count(entry_id) = 0) and label_id not in () group b' at line 1; 42000, 1064, You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') group by entry_id having count(entry_id) = 0) and label_id not in () group b' at line 1)
EXCEPTION TYPE: SOY2DAOException
LOCATION: /cms/common/lib/soy2_build.php (3279)

SOY CMS Version: 3.0.2
SOY CMS Build Date: 2018-06-13T10:08:31+0000
SOY CMS DB Type: mysql
SOY2RootDir: /testtest/html/cms/common/
SOY2_DOCUMENT_ROOT: undefined


STACK TRACE
-----------------------
0:SOY2DAO->executeQuery
argument[0]: String("select label_id, count(entry_id) as `count` from EntryLabel where entry_id in (select `entry_id` from `EntryLabel` where label_id in () group by entry_id having count(entry_id) = 0) and label_id not in () group by label_id ")
argument[1]: array (
)

/cms/common/domain/cms/EntryLabelDAO.class.php(101)
-----------------------
1:EntryLabelDAO->getEntryCountByLabelIdForNarrowEntries
argument[0]: array (
)

/cms/soycms/cache/3.0.2_dao_cache_EntryLabelDAOImpl_98c500f073d8029b8c08913c16c83064.class.php(213)
-----------------------
2:EntryLabelDAOImpl->getEntryCountByLabelIdForNarrowEntries
argument[0]: array (
)

/cms/common/logic/site/Label/LabelLogic.class.php(233)
-----------------------
3:LabelLogic->getEntryCountByLabelIdForNarrowEntries
argument[0]: array (
)

/cms/common/action/site/EntryLabel/NarrowLabelListAction.class.php(16)
-----------------------
4:NarrowLabelListAction->execute
argument[0]: SOY2ActionRequest [SOY2ActionRequest::__set_state(array(
'_hash' =>
array (
),
'_method' => 'GET',
))]
argument[1]: SOY2ActionForm [""]
argument[2]: SOY2ActionResponse [SOY2ActionResponse::__set_state(array(
'_header' =>
array (
),
))]

/cms/common/lib/soy2_build.php(2041)

Server Environment
PHP Version: 5.3.8
minoji
 
記事: 3
登録日時: 2018年10月31日(水) 19:12

Re: [3.0.2]記事管理で非公開やラベル無しの絞り込みをするとデータベースエラーになる

投稿記事by inunosinsi on 2018年10月31日(水) 20:32

非公開ではありますが、
私が個人的にメンテナンスしているパッケージであれば、
今回のエラーの個所は修正していますので、おそらくエラーなしで表示されるはずです。
https://saitodev.co/soycms/

エラーを見る限り、
サポートが切れているバージョンのPHPをご利用されているので、
PHPのバージョンを最低でも5.6まで、可能であれば7.2まで上げると良いです。
SOY CMSの操作に関する質問は下記のページのフォームで受け付けています。
https://saitodev.co/soycms/inquiry

京都でフリーのプログラマをしています。
SOY ShopのプラグインやSOY Appの開発のサポートをしています。
http://saitodev.co/soycms(SOY CMSのマニュアルを作成しています)

株式会社京都農販(SOY Shopのサイト)
株式会社コトブキ園(SOY Shop)
inunosinsi
 
記事: 683
登録日時: 2008年6月12日(木) 20:48

Re: [3.0.2]記事管理で非公開やラベル無しの絞り込みをするとデータベースエラーになる

投稿記事by minoji on 2018年10月31日(水) 22:39

返信ありがとうございます。

エラーの根本的な原因はPHPバージョンが古いことでしょうか。
ソースコードを修正せずにPHPを5.6以上にすることで解決するのか、
5.6以上にしてもエラー箇所の修正は必要なのか分かると助かります。

現状の環境で他のPHPコードも動いており、簡単にPHPのバージョンを上げることが
できないため、今後もPHPバージョンによるエラーが出るようであれば、
作業が大変ですがサーバー環境を変更しようと思います。

よろしくお願いします。
minoji
 
記事: 3
登録日時: 2018年10月31日(水) 19:12

Re: [3.0.2]記事管理で非公開やラベル無しの絞り込みをするとデータベースエラーになる

投稿記事by inunosinsi on 2018年11月01日(木) 04:31

エラーの原因は
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') group by entry_id having count(entry_id) = 0) and label_id not in () group b' at line 1

上記エラーメッセージにあります通り、SOY CMSから発行されるSQL構文にエラーがあります。
※SQL構文とはデータベースから値を取得する為に用いるデータベース用の言語のようなものです。

おそらくエラーメッセージの太字の個所の()が原因で、本来であればこの個所には(1,2,3)のようにカンマ区切りで複数の値を指定しなければならないのですが、ご覧の通り()を出力したにも関わらず値が何も入っていないことが原因です。

もし、以前はエラーが出ていなかったのであれば、MySQLのバージョンが自然に上っていた可能性がございます。
※該当する個所のエラーは1.8.15から3.0.2までの間に改修はなかったはずです。

これはPHPの問題ではなく、SOY CMS内のコードの問題になるのですが
私が修正を続けているパッケージでは、PHP5.3に対応できるか怪しいため、安易にバージョンアップを行うことが出来ません。

サーバの引っ越しをご検討された方が良いかもしれません。

ちなみにですが、
公式サイトで配布されているパッケージは私が知る限り、PHP7.2に対応されていません。

公式サイトの方のパッケージに私がメンテナンスしているものを反映したいのですが、
手段がなく反映のリクエストを送れない状態になっています。

私のメンテナンス分が反映される環境を準備して頂くことを切に願います。
SOY CMSの操作に関する質問は下記のページのフォームで受け付けています。
https://saitodev.co/soycms/inquiry

京都でフリーのプログラマをしています。
SOY ShopのプラグインやSOY Appの開発のサポートをしています。
http://saitodev.co/soycms(SOY CMSのマニュアルを作成しています)

株式会社京都農販(SOY Shopのサイト)
株式会社コトブキ園(SOY Shop)
inunosinsi
 
記事: 683
登録日時: 2008年6月12日(木) 20:48

Re: [3.0.2]記事管理で非公開やラベル無しの絞り込みをするとデータベースエラーになる

投稿記事by minoji on 2018年11月01日(木) 21:38

エラーの原因特定のため、新しい環境にSOY CMSを移植してみました。

PHPは5.6.28、MySQL(MariaDB)10.1.19の環境で動かしましたが、同じエラーが発生しました。
この結果から、PHPバージョンが古いのは関係ないと判断します。
SQLite版は問題なく「公開状態等で絞り込み」が動きますので、MySQL版のソースに問題があるようです。

SOY CMSの新しいバージョンで修正されるのを待つか、自分でエラーの該当箇所を探して修正してみようと思います。


MESSAGE: Invalid query. (SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') group by entry_id having count(entry_id) = 0) and label_id not in () group b' at line 1; 42000, 1064, You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') group by entry_id having count(entry_id) = 0) and label_id not in () group b' at line 1)
EXCEPTION TYPE: SOY2DAOException
LOCATION: /cms/common/lib/soy2_build.php (3279)

Server Environment
PHP Version: 5.6.28
10.1.19-MariaDB
minoji
 
記事: 3
登録日時: 2018年10月31日(水) 19:12

Re: [3.0.2]記事管理で非公開やラベル無しの絞り込みをするとデータベースエラーになる

投稿記事by inunosinsi on 2018年11月02日(金) 05:08

公式サイトにあるパッケージだと、記事の取得周りのロジックがたしかReflectionクラスというものを使っていて修正が難しいです。
今年のはじめあたりにSQLiteとMySQLの新しいバージョンで動作させるために癖のあるコードでは難しいということで、
私がメンテナンスを続けているパッケージで大幅なコードの書き換えを行いました。

一見してからの判断の方が宜しいかと思いますので、修正すべきファイルをお伝えしますと
たしかなのですが、/cmsインストールディレクトリ/common/logic/site/Entry/EntryLogic.class.phpを開き、
getOpenEntryByLabelIdsImplementsというメソッドを探します。

こちらのコードをよく見ると、メソッド名の上にあるコメントでSQL構文を組み立てる仕組みになっていて、labelIdsが0の場合といった条件分岐を挿入することが難しくなっています。

SOY CMSの新しいバージョンで修正されるのを待つか

これは期待できないので、PHP5.6で動かせるのであれば、私のメンテナンスしているものの利用を検討した方が良いです。
https://saitodev.co/soycms/

公式のパッケージが私を含め、ユーザの方が改修している分を反映してくれれば良いのですが、どうにも動いてくれないのが困ります。
SOY CMSの操作に関する質問は下記のページのフォームで受け付けています。
https://saitodev.co/soycms/inquiry

京都でフリーのプログラマをしています。
SOY ShopのプラグインやSOY Appの開発のサポートをしています。
http://saitodev.co/soycms(SOY CMSのマニュアルを作成しています)

株式会社京都農販(SOY Shopのサイト)
株式会社コトブキ園(SOY Shop)
inunosinsi
 
記事: 683
登録日時: 2008年6月12日(木) 20:48


Return to バグ報告

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[3人]

cron