web-dev-qa-db-fra.com

Création de deux tables de base de données via un plugin

Je travaille sur un plugin de vote pour mon site et je souhaite créer deux tableaux: un qui stocke les votes et un autre qui stocke les votes des électeurs.

Dans le Codex, il est suggéré d’utiliser une instruction if pour voir si la table a déjà été créée lors de l’installation du plugin, mais comment puis-je modifier le code si je crée deux tables?

Ceci est mon instruction if dans la fonction d'installation du plug-in, actuellement configurée pour vérifier si 1 table existe déjà.

...

   $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);
   }

....

Quelle est la bonne façon de vérifier si les deux tables existent?

Techniques de programmation de base que vous devriez avoir apprises avant de créer un plugin:

  1. Vous pouvez concaténer des vérifications avec && (et) et || (ou).
  2. Vous pouvez (et devriez) protéger chaque requête CREATE avec sa propre vérification

La syntaxe SQL que vous devriez avoir examinée avant d’écrire vous-même des requêtes:

Sur une note connexe, assurez-vous de supprimer ces tables lorsque le plug-in est uninstalled/delete .

PS: Aucune infraction intentionnelle, mais il fait semble que vous copiez collé sans savoir ce que le code fait. Sachez qu'en faisant cela dans un plugin, vous risquez des installations d'autres personnes!

4
Raphael

J'ai jeté un coup d'œil rapide sur votre code, mais vous avez au moins trois problèmes.

Le premier est lié à la sécurité:

CREATE TABLE " . $table_name1 . "

Vous ne savez jamais quel genre de déchets votre fonction pourrait recevoir, alors écrivez-la comme ceci:

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

Le second est lié à SQL et déjà mis en évidence:

CREATE TABLE

Devrait être:

CREATE TABLE IF NOT EXISTS

Le dernier et le plus important est PHP lié à la syntaxe. Le deuxième appel à:

$sql =

Devrait être:

$sql .=

Sinon, vous ne créerez jamais la première table. Déjà.

Enfin, comme indiqué dans un message précédent, il est recommandé de stocker la version de votre plugin, ou de ses tables, dans une option. Cela permet de le mettre à niveau plus facilement lorsque ses propres options et son schéma changent.

8
Denis de Bernardy

Si vous utilisez des noms de table uniques, vous pouvez supposer avec une certaine confiance que le tableau 2 existe si le tableau 1 existe. Je ne vérifierais donc que l'existence de 1 et, s'il y en a un, ignore les scripts ... sinon, lancez les scripts.

Vous pouvez également désactiver une option que vous avez définie pour votre plug-in:

  • Si l'option existe (c'est-à-dire get_option('my-voting-version')), votre plug-in est installé et vous n'avez pas besoin d'exécuter vos scripts de base de données.
  • Si l'option n'existe pas, exécutez vos scripts et définissez-la pour ne pas les exécuter deux fois.

Même si le plug-in est supprimé, l'option restera active. Ainsi, une fois réactivé, vous ne réécrirez pas les tables. Le stockage de la version de votre base de données et l’exécution de scripts en fonction vous permettent également de gérer les mises à niveau. Vous pouvez ensuite exécuter de manière sélective des scripts de mise à niveau en fonction de la version de la table qui existait auparavant pour le site.

1
EAMann