質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

1回答

328閲覧

fuelでJSON_CONTAINSを使うと最後にnullがつくので解消したい

Discord

総合スコア51

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2023/02/09 03:18

編集2023/02/15 10:30

実現したいこと

fuelでJSON_CONTAINSを使いたいのですが、実行されるクエリの最後にnullがついてしまうので解消したいです。

該当のソースコード

PHP

1$query->where(DB::expr('JSON_CONTAINS(`company_ features`,' . "'[1,2]'" . ')'));

発生している問題・エラーメッセージ

クエリを実行すると以下のようなSQLになり、最後にnullがつくためクエリーエラーとなります。

JSON_CONTAINS(`company_ features`,'[1,2]') null"

nullが最後につくため、以下のようなエラーメッセージも表示されます。

Fuel\Core\Database_Exception [ 42000 ]: 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 'null' at line 1 with query

ちなみに$queryをprint_rでみていると、以下のような感じでした。

[_where:protected] => Array ( [0] => Array ( [AND] => Array ( [0] => Fuel\Core\Database_Expression Object ( [_value:protected] => JSON_CONTAINS(`company_ features`,'[1,2]') ) [1] => [2] => ) ) )

以下、追記
ちなみにこのように書くと、nullにはならなりますが、思っていたSQLとは別のものになります。

$query->where(DB::expr('JSON_CONTAINS(`company_ features``,' . "'[1,2]'" . ')'), '');

この結果はこうなります。

JSON_CONTAINS(`company_ features`,'[1,2]') = ''

追記
以下のように書くと良さそうでした!

$cquery->where(DB::expr('JSON_CONTAINS(`company_ features`'), ',', '["1,2"]');

結果

JSON_CONTAINS(`company_ features` , '[\"1,2\"]'

バックスラッシュが入っているのと一番後ろに括弧をつければいけそうなのですが、ここからうまくいきません。。

記載方法が間違っているのかもしれません。
ご教示お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2023/02/09 04:09

>最後にnullがつくためクエリーエラー 勘違いでは?どうやってエラーを確認していますか?
Discord

2023/02/09 04:35

コメントありがとうございます! クエリを実行しようとすると、以下のようなエラーになり、後ろにnullがついていました。 それでわかった感じですね。 Fuel\Core\Database_Exception [ 42000 ]: 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 'null' at line 1 with query
Discord

2023/02/09 06:01

その後進捗ありましたので、説明に追記させていただきました!
guest

回答1

0

FuelPHPのバージョンが古くないでしょうか?

whereメソッド内で DB::expr がサポートされたのは1.7.3 からの様です。
https://github.com/fuel/fuel/blob/1.8/master/CHANGELOG.md#specific-classes-6

投稿2023/02/14 21:08

Eggpan

総合スコア2665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Discord

2023/02/15 00:46

回答ありがとうございます! たしかにバージョンを確認してみると、1.4でした。 ちなみにプログラム内ではDB::exprを使っているところがいくつかありまして、MAX関数など使っているのですが、一応問題ない動いているように思われます。 もしDB::exprが使えないとなるとJSON_CONTAINSを使いたい場合、代替方法などあるのでしょうか。
Eggpan

2023/02/15 01:30

selectでの利用や、whereでも max(x) = y のような比較を行うような文であれば動く、ということはあると思います。 真っ当なのはfuelphpのバージョンアップ、無理であればcore内のsqlを組み立てているクラスを拡張して新しいバージョンと同様に改修する、などになると思います。 どちらも難しそうならDB:queryで全部書くとか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問