サポート » プラグイン » MySQLでテーブルが作成できない時のトラブルシューティング

  • 解決済 tokkonopapa

    (@tokkonopapa)


    IP Geo Block というプラグインの作者です。海外のユーザーさんから データベース・テーブルが作成されない旨の問題 が上がってきており、その原因を切り分ける方法について相談させて下さい。

    プラグインの機能としては、以下を実装しています。

    1. ログ記録用のテーブルをプラグインの有効化時に作成する(この時点でのエラーチェックは未実装)。
    2. 管理画面に入った時にテーブルが作成されていなければ、エラーを表示、再度、無効化->有効化を促す。

    現在分かっているユーザーさんの情報は、以下の通りです(そのまんまのコピペです)。

    Version: 5.5.32 | Server Name: angzvacom.fatcowmysql.com
    Databases Available: unlimited | Used: 11

    ※ angzvacom はアカウント名、fatcowmysql.com が MySQL サーバーの様です。
    (情報源: http://www.fatcow.com/knowledgebase/read_article.bml?kbid=7137
    http://www.fatcow.com/PHP バージョンは 5.0 と記載されています が、WordPress のホスティングもしているので、最低スペックは満足しているのだと思います。

    また、プラグイン側でも WordPress バージョン 3.7 以上が必要な事はチェックしています。

    プラグイン有効化時のテーブルの作成は、

    ・ストレージエンジンは指定せず(デフォルト)
    ・文字セットは UTF8 に指定

    を基本に、以下のコードで作成しています。

    global $wpdb;
    $table = $wpdb->prefix . self::TABLE_NAME;
    $wpdb->query( "CREATE TABLE IF NOT EXISTS $table (
     No bigint(20) unsigned NOT NULL AUTO_INCREMENT,
     time int(10) unsigned NOT NULL DEFAULT 0,
     ip varchar(40) NOT NULL,
     hook varchar(8) NOT NULL,
     auth int(10) unsigned NOT NULL DEFAULT 0,
     code varchar(2) NOT NULL DEFAULT 'ZZ',
     result varchar(8) NULL,
     method varchar(255) NOT NULL,
     user_agent varchar(255) NULL,
     headers varchar(511) NULL,
     data text NULL,
     PRIMARY KEY (No),
     KEY time (time),
     KEY hook (hook)
    ) CHARACTER SET 'utf8'" );

    ※ 上記コードは「バッククォート」が正確に表現されていません。実際のコードは https://github.com/tokkonopapa/WordPress-IP-Geo-Block/blob/master/ip-geo-block/classes/class-ip-geo-block-logs.php#L21 を見て下さい。

    管理画面でのテーブル有無のチェックは以下の通りです。

    if ( $wpdb->get_var( "show tables like '$table'" ) !== $table )
    	return エラーメッセージ;

    フォーラムからは、「管理権限を持っているか」、「他のプラグインが影響していないか」、「MU か」などが関連するかも知れない事柄として検索されましたが、MySQL に関しては知識が乏しく、どのようにトラシューすべきかが分かっていません。

    何からどう切り分けていったら良いか、どうか、お力添えをお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • バグリポートのやり取りを見る限り、リポーターはテーブルが作成されているかどうかを確認していないように見えるんですが、プラグインの挙動から考えて、確実にテーブルが存在しないということでしょうか? エラーメッセージを追加したバージョンにアップデートしたときに、”No change” と言ってますが、メッセージが出たとは言っていませんので… admin notice が出ていないのかもしれません。何より、プラグインを有効化したときに、テーブル作成でエラーになっていると、その時点で WordPress が admin notice を出すような気がします。

    ユーザに質問するときは、ひとつずつ、できれば Yes/No で答えられる問いを投げて、問題を絞っていくといいです。目の前に見ているものを言語化するのは、以外と難しいものですから。今回の場合は、プラグインが出しているエラーメッセージを見たか、見なかったか、からでしょう。それがなければ、テーブルは OK ってことですよね。

    また、プラグイン自体は動作していて、ログだけが取れていない、とも読めます。ログデータを INSERT や UPDATE するときのエラー・チェックはありますか? こちらがうまく動作していない可能性はありませんか? テーブルが存在しない場合に INSERT/UPDATE 文を投げると、MySQL はテーブルが存在しない旨のエラーを返しますが、スクリプト自体が return すれば何も表示されません。デバッグモードのときには、ここでチェックを入れるというのも考えられます。

    サーバの phpMyAdmin のチュートリアルを見ると、Server version 4.1.22、ENGINE=MYISAM とか書いてあって、ぎょっとなりますが、昔のものをそのまま使っているのでしょう。おっしゃるとおり、WordPress 本体が動いているので、PHP のバージョンが原因とは考えにくいですが、肝心の WordPress のバージョンもわからないので、プラグインなども含めて確認し、疑念を振り払っておいたほうが健康のためにはいいです。

    CREATE クエリについては、お示しのコードで、普通なら、テーブルが作成できると思います。ただ、プラグインがテーブルを作るときは、dbDelta() 関数を使った方が、後々のメンテナンスが楽なので、お勧めではありますが。

    テーブルが存在するかどうかは、

    SHOW TABLES LIKE table_name;

    で確認ができているはずなので、admin notice の有無を聞けばよいと思います。でも、これだけでは、テーブルの整合性まではチェックしてくれないので、

    DESCRIBE table_name;

    を使うと、テーブル内のカラムの状況を把握することができます (dbDelta() 関数は内部でこれを使っていて、よきに計らってくれます)。また、

    SHOW CREATE TABLE table_name;

    を使うと、テーブルを作成したときに使ったクエリをチェックすることができます (どちらもテーブルが存在することが必要条件です)。ユーザが phpMyAdmin をうまく使えそうもないときは、デバッグ用のコードを入れたものを作り、公開版とは別のタグを打って、コミットし、それと差し替えてもらうという手もあります。FTP なら何とか使えるという場合ですね。

    トピック投稿者 tokkonopapa

    (@tokkonopapa)

    kjmtsh さん、モヤモヤを吹き飛ばしてくれる素晴らしいアドバイスをありがとうございます!

    確かに admin notice が出ているかどうか、ちゃんと答えてもらっていないので、アドバイスの通り PHP バージョン、WordPress バージョンなどの基本的な事から順に、Yes/No で答えてもらうよう、設問を構成してみたいと思います。

    また dbDelta() の利用を検討してみます。コードリーディングも勉強になりそうですネ。

    実際にログを書き込む箇所でのエラーチェックですが、実はちゃんと実装していません。ご教示いただいた SHOWDESCRIBE 等の活用の仕方も知らなかったので、エラー検出時にはこれらを使ってエラーログに出力をするなど、この際、今後のために色々仕込んでみたいと思います。

    このスレッドは、問題が決着するまでオープンのままにしておきます。
    ありがとうございました。

    トピック投稿者 tokkonopapa

    (@tokkonopapa)

    とりあえず phpMyAdmin 上で DESCRIBE table_name;SHOW CREATE TABLE table_name;、PHP コードでは $wpdb->get_results( "SHOW CREATE TABLE table_name" ); を試してみました。なるほど、省略したパラメータも含めて実際どう作られたかが分かります。先方が phpMyAdmin を使える時はお手軽かもしれませんネ。

    トピック投稿者 tokkonopapa

    (@tokkonopapa)

    kjmtsh さんのアドバイスを元に質問を構成しました。
    https://github.com/tokkonopapa/WordPress-IP-Geo-Block/issues/1#issuecomment-91756263

    まず、PHPやWordPressのバージョン、使っているプラグインなど基本的な質問から始め、phpMyAdminやFTPの使用、wp-config.phpの編集、サーバーのエラーログのチェックなど、管理者として出来ることの確認、次いで現在もエラーメッセージが表示されているかなど、なるべく単純に [Yes/No] で答えてもらうよう構成しました。

    またご教示いただいた SQL を埋め込こみ、原因を切り分けるためのデバッグ用ブランチも準備しました。

    先方の都合により解決までには時間がかかりそうですが(何とトルコの猟師さん!)、質問させてもらった内容にはバッチリお答えを頂きましたので、解決済みとします。

    ありがとうございました!

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「MySQLでテーブルが作成できない時のトラブルシューティング」には新たに返信することはできません。