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

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して、それを全部回せば終わり。
処理が簡単になるから、とても便利。

 


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


最後までお読みいただきありがとうございました。
アルゴリズン


役に立ったと思っていただけたら、以下からシェア頂けたら幸いです^^

QRコードからもこのURLを開けます。

アイキャッチ画像に利用させて頂いております、各社ブランドのロゴやシンボルに関しては、
各社ブランドのロゴや商標等に関する帰属についてをご確認頂けますようお願い致します。
ロゴの使用等に関する苦情・ご意見等がございましたら管理者までご連絡ください。

AdMax Promotion

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

Rakuten Promotion

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

 - WordPress ,

Message

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

  関連記事

eye_wordpress
wordpressでメディアページ(ギャラリー、gallery)を表示する方法

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

eye_wordpress
WordPressのインストールディレクトリに配置される.htaccess作成タイミング

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

eye_wordpress
JetPack統計情報で指定した記事の日別アクセスを開く方法

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

eye_wordpress
WordPressのコメント入力者の名前の横に表示される空白は何か

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

eye_php
PHP.iniに設定する設定をhttpd.confや.htaccessに対して行うメリット

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

eye_wordpress
【解決】スラッグが全ての投稿で「post-0」としてMT形式がインポートされる原因

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

eye_wordpress
WordPressの独自ショートコード埋め込みにJavaScript外部ファイルを指定する

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

eye_statcounter
StatCounter無料アクセス解析の利用にStatCounter_v1.6.5-wordpressプラグインを利用

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

eye_wordpress
WordPress投稿の前後にGoogle™AdSenseユニットを追加

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

eye_wordpress
06.いいね-Jetpack by WordPress.com

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