サポート » プラグイン » 予期しない出力が生成されました。

  • 解決済 ForestRiver

    (@forestriver)


    データベースを新しく生成する基本的なプラグインを書いていたのですが、
    「このプラグインを有効化する際に、556文字分の予期しない出力が生成されました。」
    のエラー文が出てきます。
    以下のサイトを参考に作っています。
    koko
    sql文は問題なくかけていると思います。($SQLをMySql内でクエリを実行してみてエラーが出ませんでした。)

    このエラーは
    define(‘WP_DEBUG’, true);
    にしていても、エラー文自体を見ることはできないのでしょうか?
    悪い個所を見つけ出す方法がわかりません。
    ご指導よろしくお願いします。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • ForestRiver

    (@forestriver)

    public function paka3_plugin_start()内のIF文で、
    おそらくエラーが起きていると思います。
    なぜなら
    このIF文のelseの時(テーブルが既に存在するとき)はエラーが出てきません

    モデレーター Daisuke Takahashi

    (@extendwings)

    Paka3_DatabaseTable.phpの末尾の?>を消してみてください。
    たいていはそれが原因です。

    ForestRiver

    (@forestriver)

    ご返答ありがとうございます、
    消してみましたがエラーが出ます。
    テーブルは、エラーが出ていますが、正常に作られています。

    それにしても
    phpの末尾の?>を消すとは…phpは
    <?php ?>の中に書かなくてはいけないものとばかり思っていました。

    ForestRiver

    (@forestriver)

    個人的には
    require_once(ABSPATH.’wp-admin\includes\upgrade.php’);
    dbDelta($sql);
    $this->forest_FirstData();
    add_option(“forest_db_version”,$this->forest_db_version);
    辺りが怪しいと思っています。

    nobita

    (@nobita)

    こんにちは

    参考にされているサイトの functions.phpのコード

    <!--?php

    となっていますが、このソースをそのままコピーしているといった事はありませんか?

    ForestRiver

    (@forestriver)

    コメント以外はコピペせずにやっているので
    大丈夫だと思います
    自分は基本的にGitHubのコード部分を読むようにしています。

    kjmtsh

    (@kjmtsh)

    参考にしたコードが古すぎます。

    if($wpdb->get_var("SHOW TABLES LIKE '$this->table_name'") != $this->table_name)

    これは必要ありません。

    dbDelta() 関数のすることは以下の通りです。

    1. 該当のテーブル名が存在しないときは、テーブルを作成する。
    2. 該当のテーブル名が存在するときは、そのスキーマをチェックする。
    3. スキーマが同じなら、何もしない。
    4. スキーマが異なるときには、テーブルの構造を変更する。

    テーブル名だけをチェックする上のコードが存在すると、2以下の機能が果たせなくなります。ということは、本来なら、上のコードは誤りなのですが、日本語版 Codex にこのコード例があるので、広まってしまったのでしょう。プラグイン作者たちもよく間違えているので、たぶん、英語版 Codex が誤った記述をしていて、日本語版 Codex は、それを引き継いだままなのだと思います。現在の英語版 Codex では修正されています。

    しかし、Warning が発生するのは、上のコードではなくて、次の2行です。

    $title = $wpdb->escape("初めての投稿です");
    $contents = $wpdb->escape("インストールが完了しました");

    この wpdb::escape() は、deprecated なので、使ってはいけません。互換性のために残されているだけです。適切なエスケープも期待できません (攻撃を阻止できません)。wpdb::insert() 内部で wpdb::prepare() が呼ばれるので、エスケープ処理は WordPress に任せてください。

    ForestRiver

    (@forestriver)

    kjmtsh様 ありがとうございます。

    $title='初めての投稿です5';
     $contents='インストールが完了しました.5';

    と書き換えたらエラーが出てこなあくなり、テーブルもちゃんと作られていました。
    まさかCodexに書き損じがあるとは思ってもみませんでした。
    Codexを超えている人に初めて会いました(笑)
    勉強になります。
    また、if($wpdb->get_var…はコメントにしていると、
    テーブルが既にある状態でプラグインを有効にするとまたエラーが出てきたので、
    今回は残すことにしました。

    皆様此度のご協力心から感謝いたします。
    ありがとうございます

    kjmtsh

    (@kjmtsh)

    わお、いつの間に写真が…

    Codex は、ボランティアのユーザが書いています。英語版も日本語版も同様です。だから、WordPress の現状に合ってないものもあるし、間違いもあります。そうしたところは見つけた人が直す、というのが本来の姿なのですが、私がサボっているだけです。もちろん、ForestRiver さんも書くことができますよ。

    dbDelta() は、WordPress 随一融通がきかないので有名です。スペースひとつ間違えてもまともに動いてくれません。まあ、内部のコードを見てもらえばわかりますが、正規表現でちまちまやっているので、仕方がないのです。だから、前もってのデバッグは必須です。使うときには、ドキュメントをよく読み、そこに書いてあることを全て守る必要がありますので、ご注意ください。また、第二引数に false を与えると、テーブル操作は実行せずに、何をしようとしているかを教えてくれるようになってます。

    ForestRiver

    (@forestriver)

    驚かせてしまってすみません。(笑)

    なるほど。やっぱりネットサービスって面白いですね。
    私は恐れ多くてまだかけませんが…

    dbDelta() はややこしいにおいがプンプンしますね。
    勉強します。

    大変勉強になりましす ありがとうございます。

10件の返信を表示中 - 1 - 10件目 (全10件中)
  • トピック「予期しない出力が生成されました。」には新たに返信することはできません。