phpMyAdminでのエクスポートエラー
今回は、弊社で制作したWebサイトをお客様の環境へ反映する際に遭遇した「phpMyAdmin」のエクスポートエラーについて対応した内容となります。
恐らく同じような事象に遭遇する人もいるかと思いますので、メモも兼ねて記載します。
1.「phpMyAdmin」とは
「phpMyAdmin」とは、ブラウザ上でDBサーバー(MySQL)を管理する「フリーソフトウェア」です。ほとんどのレンタルサーバーでも普通に実装されています。
通常、DBの管理にはDBを操作するためのSQL文と言われるCUI(Character User Interface)ベースの言語を使って管理しますが、この「phpMyAdmin」を使うと、ブラウザ上からGUI(Graphical User Interface)ベースでMySQL(DBサーバー)の操作ができます。
フリーソフトウェアですので、設定ファイルの修正などは自己責任となりますので、ご注意下さい。
今回遭遇した事象の「phpMyAdmin」は、「v5.0.1」で確認した内容となります。なお、最終の安定バージョンは、v5.1.1のようです。
「XAMPP(ザンプ)」に同梱されています。「XAMPP」ついては、こちらでも記載しています。
2.エクスポートエラーの内容
制作したものを、ローカルの開発環境から、お客様の環境へインポートするため、ローカル環境のMySQL(DBサーバー)から、DBのデータを取り出す必要がありました。
そのため、「phpMyAdmin」を起動し、該当のDBのテーブルのエクスポート処理を実行したところ、エクスポートしたsqlファイルの中に以下のエラーが検出され、エクスポートに失敗しました。
1 2 3 4 5 | <b>Fatal error</b>: Uncaught TypeError: mb_detect_encoding() expects parameter 1 to be string, bool given in C:\xampp\phpMyAdmin\libraries\classes\Util.php:1620 Stack trace: #0 C:\xampp\phpMyAdmin\libraries\classes\Util.php(1620): mb_detect_encoding(false, 'UTF-8', true) #1 C:\xampp\phpMyAdmin\libraries\classes\Plugins\Export\ExportSql.php(725): PhpMyAdmin\Util::localisedDate() #2 C:\xampp\phpMyAdmin\export.php(444): PhpMyAdmin\Plugins\Export\ExportSql->exportHeader() |
エラーメッセージの内容から、該当のエラーは、Util.php 1620行目で、mb_detect_encodingの第一パラメータが原因でエラーが発生しているようです。
1 | Uncaught TypeError: mb_detect_encoding() expects parameter 1 to be string, bool given in C:\xampp\phpMyAdmin\libraries\classes\Util.php:1620 |
3.Util.php 1620行目の修正
実際の「C:\xampp\phpMyAdmin\libraries\classes\Util.php」の1620行目を確認しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 1608 /* Fill in AM/PM */ 1609 $hours = (int) date('H', (int) $timestamp); 1610 if ($hours >= 12) { 1611 $am_pm = _pgettext('AM/PM indication in time', 'PM'); 1612 } else { 1613 $am_pm = _pgettext('AM/PM indication in time', 'AM'); 1614 } 1615 $date = preg_replace('@%[pP]@', $am_pm, $date); 1616 1617 $ret = strftime($date, (int) $timestamp); 1618 // Some OSes such as Win8.1 Traditional Chinese version did not produce UTF-8 1619 // output here. See https://github.com/phpmyadmin/phpmyadmin/issues/10598 1620 if (mb_detect_encoding($ret, 'UTF-8', true) != 'UTF-8') { 1621 $ret = date('Y-m-d H:i:s', (int) $timestamp); 1622 } |
1620行目の第一パラメータの$retが原因で発生しており、その上の1617行目の$retを確認すると、$dateが日本語の場合、文字化けが起因で$retにfalseを返却する可能性があり、根本原因はこの1617行目が原因で発生していました。(ネットに情報あり。)
そのため、1617行目を以下の形(1619行目)で修正する事で文字化けを防ぐ事で対応ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 1608 /* Fill in AM/PM */ 1609 $hours = (int) date('H', (int) $timestamp); 1610 if ($hours >= 12) { 1611 $am_pm = _pgettext('AM/PM indication in time', 'PM'); 1612 } else { 1613 $am_pm = _pgettext('AM/PM indication in time', 'AM'); 1614 } 1615 $date = preg_replace('@%[pP]@', $am_pm, $date); 1616 1617 // RishunTrading Limited 1618// $ret = strftime($date, (int) $timestamp); 1619 $ret = strftime('%Y-%B-%d %H:%M', (int) $timestamp); 1620 // Some OSes such as Win8.1 Traditional Chinese version did not produce UTF-8 1621 // output here. See https://github.com/phpmyadmin/phpmyadmin/issues/10598 1622 if (mb_detect_encoding($ret, 'UTF-8', true) != 'UTF-8') { 1623 $ret = date('Y-m-d H:i:s', (int) $timestamp); 1624 } |
この後、問題なく取得したいデータをエクスポートする事ができましたので、エクスポートしたSQL文の該当箇所を修正した上で、お客様の本番環境の「phpMyAdmin」を使ってインポートする事ができました。
めでたし。めでたし。。。
- タグ
- プログラミング
WEB DESIGN全てお任せ!ホームページ制作
RishunTradingでは、日本にはないコンセプトや高いデザイン性をもったヨーロッパ製品の輸入販売、及び、Webサイト制作事業などをおこなっております。
「全てお任せ!ホームページ制作」は、ドメイン取得からサーバー設定、レスポンシブルデザイン(スマホ、タブレット対応)、SEO対策がすべて含まれたお得なホームページを制作するサービス商品です。
運用開始後に「Webサイト運用管理サービス(保守)」と組み合わせて購入しますと、メンテナンス、更新も含めてすべて弊社で実施しますので、お客様は安心して本業に集中する事ができます。
しかもなんと、「全てお任せ!ホームページ制作」は、¥100,000!で提供しております。
本業が忙しい中小企業様に大変ご好評を頂いている商品です。
独自ドメイン取得
サーバー開設&設定
レイアウト設計
レスポンシブルデザイン
(*1)検索エンジン最適化
(SEO対策)場所Maps
お問い合わせフォーム
SSL化
各種SNS連携
運用マニュアル