web-dev-qa-db-ja.com

プラグインを介して2つのデータベーステーブルを作成する

私は自分のサイトのための投票プラグインに取り組んでおり、私は2つのテーブルを作成したいと思います。1つは投票を格納するもの、もう1つは投票者のIPアドレスを格納するものです。

Codexでは、プラグインのインストール時にテーブルがすでに作成されているかどうかを確認するためにifステートメントを使用することをお勧めしますが、2つのテーブルを作成している場合はどうすればコードを変更できますか?

これは、現在1つのテーブルが存在するかどうかをチェックするように設定されているプラ​​グインのインストール機能における私のif文です。

...

   $table_name1 = $wpdb->prefix . "voters_ip";
   $table_name2 = $wpdb->prefix . "vote_posts";
   $installed_ver = get_option( "postvote_version" );  

   if($wpdb->get_var("show tables like '$table_name'") != $table_name1) { //unsure how to add both tables

      $sql = "CREATE TABLE " . $table_name1 . " (
      id bigint(20) NOT NULL AUTO_INCREMENT,
      vote_post_id bigint(20) NOT NULL,
      voter_ip varchar(100) NOT NULL,
      UNIQUE KEY id (id)
    );";

      $sql = "CREATE TABLE " . $table_name2 . " (
      id bigint(20) NOT NULL AUTO_INCREMENT,
      vote_post_id bigint(20) NOT NULL,
      up int(11) NOT NULL,
      ddown int(11) NOT NULL,
      UNIQUE KEY id (id)
    );";

      require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
      dbDelta($sql);

      add_option("postvote_version", $postvote_version);
   }

....

両方のテーブルが存在するかどうかを確認する正しい方法は何ですか?

プラグインを構築する前に習得しておくべき基本的なプログラミングテクニック:

  1. チェックを&&(and)と||で連結できます。 (または)。
  2. あなたはそれぞれのCREATEクエリをそれ自身のチェックで守ることができます(そして守るべきです)

自分でクエリを書く前に調べておくべきSQL構文:

関連する注意として、プラグインが uninstall/deleted の場合は必ずこれらのテーブルを削除してください。

シモンズ:何の罪も意図していませんでしたが、します。プラグインでこれを実行すると、他の人のインストールを危険にさらすことに注意してください。

4
Raphael

私はあなたのコードをざっと見ただけでしたが、あなたは少なくとも3つの問題を抱えています。

1つ目はセキュリティ関連です。

CREATE TABLE " . $table_name1 . "

あなたの関数がどんな種類のゴミを受け取るのかわからないので、次のように書いてください。

CREATE TABLE `" . str_replace('`', '', $table_name1) . "`

2つ目はSQL関連で、すでに強調されています。

CREATE TABLE

する必要があります:

CREATE TABLE IF NOT EXISTS

最後のそして最も重要なのはPHP構文関連です。 2番目の呼び出し:

$sql =

する必要があります:

$sql .=

そうでなければ、最初のテーブルを作成することは決してないでしょう。今まで.

最後に、前のメッセージで指摘したように、プラグインのバージョン、またはそのテーブルのバージョンをオプションに格納することをお勧めします。これにより、独自のオプションとスキーマが変更されたときに、より簡単にアップグレードできます。

8

一意のテーブル名を使用している場合は、テーブル1が存在すればテーブル2が存在するとかなりの自信を持って推測できます。だから私は1の存在をチェックし、もしあればスクリプトをスキップします。もしそうでなければスクリプトを実行します。

プラグインに設定したオプションをキーオフすることもできます。

  • オプションが存在する場合(つまりget_option('my-voting-version'))、プラグインはインストールされているので、データベーススクリプトを実行する必要はありません。
  • オプションがない場合は、スクリプトを実行して、2回実行しないようにオプションを設定してください。

プラグインが削除されても、オプションは有効になっているため、再アクティブ化してもテーブルを書き換えることはできません。データベースのバージョンを保存し、それに基づいてスクリプトを実行すると、アップグレードを管理することもできます。その後、そのサイトに以前に存在していたテーブルバージョンに基づいてアップグレードスクリプトを選択的に実行できます。

1
EAMann