MySQLのGROUP_CONCATの値が途中で切れる場合の対応(WordPress,PHP)
2018/04/07
WordPressでショートコードなどを自分で作成していて、
便利に使わせてもらっているのが、GROUP_CONCATです。
複数行の戻りを、任意のセパレータで分割した文字列で受け取れるという、
すこぶる便利な関数なのですが、あまりに大きいデータを返すと、
途中でデータが切れて受け取る事ができません。それに対応する手順をご紹介します。
目的はWordPress内のPHPから実行する場合の対応です。
MySQLのGROUP_CONCATの値が途中で切れる場合の対応(WordPress,PHP)
ちょっと急いでいる部分があるのでご紹介が雑になりますが、
基本的にはMySQLの「システム変数」で受け取れるバイト数が設定されているという答えになります。
group_concat_max_lenを書き換えて再実行
そういうわけで、このgroup_concat_max_len変数を大きくしてやれば途中で打ち切られなくなります。今回は乱暴ですが、1,000万くらいにしてしまいます。
12 mysql> set group_concat_max_len = 10000000;Query OK, 0 rows affected (0.00 sec)(引用)MySQLのgroup_concatの結果が短い気がするのは環境変数で制限されているから。 | 三度の飯とエレクトロン
とまぁ「set group_concat_max_len = 10000000;」(サイズは任意)と、
SQLウィンドウからSQLを実行してやれば、サイズが変更できますよと。
しかし、注意事項があって「システム変数」には、
そのセッションのみ有効な設定と、サーバー再起動後も有効なグローバル設定があると言うのです。
セッション変数とグロバール変数
SET文は、デフォルトでセッション変数を変更します。
そのため、セッション変数とグロバール変数の違いを理解していないと、SET文を利用してもシステム変数が反映されないと悩むことになるので注意が必要です。
セッション変数とグロバール変数の違いは以下の通りです。
セッション変数
・現在の接続の操作のみに影響。
・SET ⇒ 「SET 変数名 = 設定値;」グローバル変数
・サーバーの操作全体に影響。
・設定変更した後に接続した全クライアントに適用される。
・SET文 ⇒ 「SET GLOBAL 変数名 = 設定値;」
自分が全権を持っているMySQLサーバーならいいですし、
MySQLの設定変更の権限を持ってるレンタルサーバーならいいのですが、
私が今回設定したかったのが、minibird(改:StarServer)です。
安価なレンサバということもあって、MySQLの設定は手が出せません。
phpMyAdminから実行してみると、当然のごとくエラーとなります。
ならばと「SET 変数名 = 設定値;」を行っても設定は保持されません。
設定が保持されないのではWordPressのショートコードなどで実行するSQLには、
そのままでは設定が有効になりません。
WordPress(PHP)から「group_concat_max_len」の変更
となると、どうするか。
PHP側でSQLを投げる前に、設定すればいいのです。
1行目です。
1 2 |
$wpdb->query( "SET group_concat_max_len = 10000000;" ); $rows = $wpdb->get_results($sql, ARRAY_A); |
現在のセッションにて次に投げるSQL文に対して、
「set group_concat_max_len = 10000000;」を適用させることができます。
これで、このSQLを投げる時だけ、group_concat_max_lenの値を拡張することができます。
よかったよかった。
間違っても「$wpdb->get_results($sql, ARRAY_A);」で実行するSQLの最初の行に、
「”SET group_concat_max_len = 10000000;」を付けておくってのはNGですからね。
get_resultの戻りが、受け取れなくなります(笑)
関数リファレンス/wpdb Class – WordPress Codex 日本語版
本機能を使っているのは以下のページです。
以下では、対象の「干支」の範囲内にある「和暦の元号年」を表示していますが、
この戻りの「元号年」複数値をSQLでGROUP_CONCATしていました。
まぁ、PHP側でループしてもそれはそれだと思うんですけど、
こういうループの場合、
IDが変わったか?と判定しながらループして、
変わっていたら、新しい行に書き出す、それまでは同一行に書き出す・・・・続く。
結構、前のIDを持っておいて、今と比較して・・・がバグるんですよね(笑)
昔、こんな処理をやまほど書いてきた記憶があります。
それが、SQLの段階で1行に収まってるなら、
受け取ったデータをSplitして、それを全部回せば終わり。
処理が簡単になるから、とても便利。
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人が著作権を保持しております。
当サイトでご紹介しております写真につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
関連記事
-
-
WelCart専用テーマPayPal VermilionによるPayPal購入フロー
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
WP jQuery Lightboxで特定の投稿のみスライドショーが動かない場合の対処法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
wordpressでメディアページ(ギャラリー、gallery)を表示する方法
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
ローカル環境へのwordpress設置
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
WordPressの独自ショートコード埋め込みにJavaScript外部ファイルを指定する
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
ブログ共有データの一括表示にはZenback-wordpressプラグインを利用
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
JetPack by WordPress.com統計情報の検索リファラが減って表示されている件
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
【再投稿】投稿の前後挿入にPost6WidgetArea_v0.6.2-wordpressプラグインを利用
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
(phpMyAdmin)タイムアウト設定の動作と確認
Google or AdMax Promotion(it) 禁断の機能がau公式 …
-
-
facebookやtwitterの投稿連携などを試験する方法
Google or AdMax Promotion(it) 禁断の機能がau公式 …