我正在为我的网站开发一个投票插件,我想创建两个表:一个存储投票,另一个存储选民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);
}
....
检查两个表是否都存在的正确方法是什么?
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 .=
否则您将永远无法创建第一个表。曾经
最后,如前一条消息所指出的,将插件或其表的版本存储在选项中是一种好的做法。这样,当它自己的选项和模式发生更改时,就可以更轻松地升级它。