通过插件创建两个数据库表

时间:2010-11-19 作者:at least three characters

我正在为我的网站开发一个投票插件,我想创建两个表:一个存储投票,另一个存储选民IP。

在Codex中,它建议在安装插件时使用if语句来查看是否已经创建了表,但是如果我创建了2个表,如何更改代码?

这是插件安装函数中的if语句,当前设置为检查是否已经存在1个表。

...

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

....
检查两个表是否都存在的正确方法是什么?

3 个回复
最合适的回答,由SO网友:Raphael 整理而成

构建插件之前应该学习的基本编程技术:

您可以将支票与(&L)连接起来&;(和)和| |(或)CREATE 使用自己的check查询在编写自己的查询之前,您应该查看SQL语法:

在相关说明中,请确保在插件运行时删除这些表uninstalled/deleted.

PS:无意冒犯,但它看起来像是你在不知道代码的情况下复制粘贴的。请注意,在插件中执行此操作会给其他人的安装带来风险!

SO网友:Denis de Bernardy

我只是粗略地看了一下您的代码,但您至少有三个问题。

第一个是与安全相关的:

CREATE TABLE " . $table_name1 . "
你永远不知道你的函数可能会收到什么类型的垃圾,所以最好这样写:

CREATE TABLE `" . str_replace(\'`\', \'\', $table_name1) . "`
第二个与SQL相关,并且已经突出显示:

CREATE TABLE
应为:

CREATE TABLE IF NOT EXISTS
最后也是最重要的一点是与PHP语法相关的。第二次呼叫:

$sql =
应为:

$sql .=
否则您将永远无法创建第一个表。曾经

最后,如前一条消息所指出的,将插件或其表的版本存储在选项中是一种好的做法。这样,当它自己的选项和模式发生更改时,就可以更轻松地升级它。

SO网友:EAMann

如果您使用的是唯一的表名,那么如果表1存在,您可以很有信心地假设表2存在。所以我只检查1是否存在,如果有,跳过脚本。。。如果不是,请运行脚本。

您还可以关闭为插件设置的选项:

如果该选项存在(即。get_option(\'my-voting-version\')) 然后安装插件,无需运行数据库脚本即使插件被删除,该选项仍将保留,因此当它被重新激活时,您将不会重新写入表。存储您的数据库版本并在此基础上运行脚本还可以为您提供管理升级的能力。然后,您可以根据站点以前存在的表版本有选择地运行升级脚本。

结束

相关推荐

How do you debug plugins?

我对插件创作还很陌生,调试也很困难。我用了很多echo,它又脏又丑。我确信有更好的方法可以做到这一点,也许是一个带有调试器的IDE,我可以在其中运行整个站点,包括插件?