頑張らない!でも諦めない!必死にならずにええかげん

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万くらいにしてしまいます。

(引用)MySQLのgroup_concatの結果が短い気がするのは環境変数で制限されているから。 | 三度の飯とエレクトロン

 

とまぁ「set group_concat_max_len = 10000000;」(サイズは任意)と、
SQLウィンドウからSQLを実行してやれば、サイズが変更できますよと。

しかし、注意事項があって「システム変数」には、
そのセッションのみ有効な設定と、サーバー再起動後も有効なグローバル設定があると言うのです。

セッション変数とグロバール変数

SET文は、デフォルトでセッション変数を変更します。

そのため、セッション変数とグロバール変数の違いを理解していないと、SET文を利用してもシステム変数が反映されないと悩むことになるので注意が必要です。

セッション変数とグロバール変数の違いは以下の通りです。

セッション変数

・現在の接続の操作のみに影響。
・SET ⇒ 「SET 変数名 = 設定値;

グローバル変数

・サーバーの操作全体に影響。
・設定変更した後に接続した全クライアントに適用される。
・SET文 ⇒ 「SET GLOBAL 変数名 = 設定値;

(引用)MySQL : SET文でシステム変数を変更 | DN-Web64

 

自分が全権を持っているMySQLサーバーならいいですし、
MySQLの設定変更の権限を持ってるレンタルサーバーならいいのですが、
私が今回設定したかったのが、minibird(改:StarServer)です。

安価なレンサバということもあって、MySQLの設定は手が出せません。

phpMyAdminから実行してみると、当然のごとくエラーとなります。

ならばと「SET 変数名 = 設定値;」を行っても設定は保持されません。
設定が保持されないのではWordPressのショートコードなどで実行するSQLには、
そのままでは設定が有効になりません。

 

プロモーション(btm)

Google or AdMax Promotion (it)

WordPress(PHP)から「group_concat_max_len」の変更

となると、どうするか。

PHP側でSQLを投げる前に、設定すればいいのです。
1行目です。

現在のセッションにて次に投げる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して、それを全部回せば終わり。
処理が簡単になるから、とても便利。

 


*本ページ内に記載されされた各社ブランド、サービス名、商標、登録商標については、
各社ブランドのロゴや商標等に関する帰属についてをご確認ください


最後までお読みいただきありがとうございました。

アイキャッチ画像に利用させて頂いております、各社ブランドのロゴやシンボルに関しては、
各社ブランドのロゴや商標等に関する帰属についてをご確認頂けますようお願い致します。

AdMax Promotion

ブログ記事のご紹介
すべて展開 | すべて省略

Rakuten Promotion

ページ
すべて展開 | すべて省略

 - WordPress ,

Message

メールアドレスが公開されることはありません。

  関連記事

eye_jetpack
JetPack統計情報は復旧できる!見えていないだけだから大丈夫

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
WordPressインストール後のパーマリンク設定

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_google_pls
Google+プロフィール(バッジ)をGoogleDevelopers推奨方法で設置する

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
KAGOYA™(カゴヤ)の共用レンタルサーバにWordPressの設置(簡単インストール)

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
19_06.scribdドキュメント表示には、Jetpackのscribdショートコード埋め込み

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
投稿の前後挿入にPost6WidgetArea v0.6.2<-0.5.0-wordpressプラグインを利用

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_local_wordpress
wordpressの複数バージョン違いをテスト(動作確認)する方法

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
WordPressのサイドバーにサイト内検索フィールド(ボックス)を設置する方法(標準)

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_wordpress
電子メール(email)への共有をJetpack by WordPress.comで行う動作

Google or AdMax Promotion(it) 禁断の機能がau公式 …

eye_local_php
ローカル環境へのPHP設置

Google or AdMax Promotion(it) 禁断の機能がau公式 …