通过插件创建两个数据库表
-
16-10-2019 - |
题
我正在为我的网站制作一个投票插件,我想创建2个表:一个存储投票的表,另一个存储选民IPS。
在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);
}
....
检查两个表是否存在的正确方法是什么?
其他提示
我只看了您的代码,但您至少有三个问题。
第一个是与安全有关的:
CREATE TABLE " . $table_name1 . "
您永远不知道您的功能可能会收到什么样的垃圾,所以最好像这样写:
CREATE TABLE `" . str_replace('`', '', $table_name1) . "`
第二个是与SQL相关的,并且已经突出显示:
CREATE TABLE
应该:
CREATE TABLE IF NOT EXISTS
最后也是最重要的是与PHP语法相关。第二个电话:
$sql =
应该:
$sql .=
否则您将永远不会创建第一张表。曾经。
最后,正如上一条消息中指出的那样,可以选择存储插件或表格的版本是一个很好的做法。当它自己的选项及其模式变化时,这可以更轻松地升级。
如果您使用的是唯一的表名称,则可以在相当多的信心中假设表2存在表2。因此,我只会检查1的存在,如果在那里,请跳过脚本...如果不是,请运行脚本。
您还可以关注您为插件设置的选项:
- 如果存在该选项(即
get_option('my-voting-version')
)然后,安装了插件,您无需运行数据库脚本。 - 如果该选项不存在,请运行您的脚本并设置该选项,以免运行两次。
即使删除了插件,该选项也将保留,因此当重新激活时,您将不会重新编写表。存储数据库版本并基于该脚本运行脚本,还为您提供了管理升级的功能。然后,您可以根据先前为网站存在的表版本选择性地运行升级脚本。