DBDelta仅创建最后一个表

时间:2012-05-09 作者:mybecks

我正在使用dbDelta的以下安装函数作为参考,因此我注意到了一些典型的问题,例如主键上的一个空格而不是两个空格。。。

function myplugin_install(){
    global $wpdb;
    $table_name = $wpdb->prefix . "vehicles";       

    $sql = "CREATE TABLE IF NOT EXISTS $table_name 
    (
        id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
        description         VARCHAR(25) NOT NULL,
        PRIMARY KEY  (id)
    );  
    ";

    $sql .= "CREATE TABLE IF NOT EXISTS $table_name1 
    (
        ...
    )";

    $sql .= "CREATE TABLE IF NOT EXISTS $table_nameX 
    (
        id                  INT UNSIGNED NOT NULL AUTO_INCREMENT ,
        art_alarmierung     VARCHAR(25) NOT NULL ,
        PRIMARY KEY  (id)
    );";

require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');
dbDelta($sql);
echo $wpdb->last_error;

}
dbDelata仅存储最后一个$sql 变量和echo$wpdb->last_error; 不显示任何错误?我的失败在哪里?

BR;麦贝克

2 个回复
最合适的回答,由SO网友:Stephen Harris 整理而成

dbDelta 对于每个SQL语句,分别执行以下操作:

function myplugin_install(){
    global $wpdb;
    $table_name = $wpdb->prefix . "vehicles";       
    require_once(ABSPATH . \'wp-admin/includes/upgrade.php\');

    $sql = "CREATE TABLE IF NOT EXISTS $table_name 
    (
        id                  INT UNSIGNED NOT NULL AUTO_INCREMENT,
        description         VARCHAR(25) NOT NULL,
        PRIMARY KEY  (id)
    );  
    ";
    dbDelta($sql);

    $sql2 = "CREATE TABLE IF NOT EXISTS $table_name1 
    (
        ...
    )";
    dbDelta($sql2);

    $sql3 = "CREATE TABLE IF NOT EXISTS $table_nameX 
    (
        id                  INT UNSIGNED NOT NULL AUTO_INCREMENT ,
        art_alarmierung     VARCHAR(25) NOT NULL ,
        PRIMARY KEY  (id)
    );";

    dbDelta($sql3);

}

SO网友:Felipe Elia

对于那些试图理解一些插件(如WooCommerce)如何能够不打电话就做到这一点的人来说dbDelta 对于每个表,原因是IF NOT EXISTS 查询的一部分。这个dbDelta 函数根据后面的内容创建索引CREATE TABLE, 因此,它最终猜测所有查询都创建相同的表。

如果你到了这里,试着用CREATE TABLE tablename 它会起作用:)

结束

相关推荐

从非核心php文件访问BloInfo、Get_Option和plugins_url

我正在创建一个插件,插件目录中有一个php文件,可以通过自定义重写url直接访问该文件。我需要这个文件能够使用标题中提到的三个功能。目前,我正在包括wp负载。php文件,它使我能够访问所有这些函数。然而,我一直在读到不应该包括wp负载,因为它可能不总是在同一个位置,而且它包括可能不需要的wordpress文件。这就是我如何包含wp负载:$wp_base = explode($_SERVER[\'PHP_SELF\'], $_SERVER[\'SCRIPT_FILENAME\']); require