使用dbDelta创建表时出现问题

时间:2011-08-21 作者:redconservatory

我正在开发一个插件,它成功地创建了一个表。

然而,我决定在新安装的Wordpress(在我的本地服务器上)中测试它,现在该表没有在我的激活码中创建。相反,我收到了错误消息:

该插件在激活期间生成了149个字符的意外输出。如果您注意到“headers ready sent”消息、联合提要问题或其他问题,请尝试停用或删除此插件。

这是我的代码:

function nc_create_location_table() {
    // makes the location table
    global $wpdb;
    global $simple_location_version;

    $table_name = $wpdb->prefix . "nc_location";

    $installed_ver = get_option( "simple_location_version" );

    if( $installed_ver != $simple_location_version ) {
        $sql = "CREATE TABLE " . $table_name . " (
                location_id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
                PRIMARY KEY  (location_id),
                    name VARCHAR (100),
                    street_no VARCHAR (5),
                    street_name VARCHAR (75),
                    city VARCHAR (75),
                    province_state VARCHAR (75),
                    postal_code VARCHAR(10),
                    country VARCHAR (75)
            );";

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

        update_option("simple_location_version", $simple_location_version);

    }

    $tmp = get_option(\'nc_location_options\');

    if(($tmp[\'chkbox_reset\']==\'on\')||(!is_array($tmp))) {
    echo \'setting defaults\';
        $arr = array(
            "nc_location_zoom"=>10, 
            "nc_location_width" => "200", 
            "nc_location_height" => "200", 
            "nc_location_drop_down_maptype" => "road",
        );
        update_option(\'nc_location_options\', $arr);
    }
}

register_activation_hook(__FILE__,\'nc_create_location_table\');
当我检查我的表时,我看到我的表尚未创建,而且我收到了一条错误消息。

如果有人能说明为什么以前工作的代码现在不工作(还有,是否可以看到意外输出的位置……因为除了此消息之外,没有显示错误)?

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

if( $installed_ver != $simple_location_version ) {
第一次运行时,$installed_ver 是空字符串,并且$simple_location_version 为NULL,因此此不平等测试将失败,并且永远不会执行SQL。

如果检查是否存在严格的不等式,它将起作用:

if( $installed_ver !== $simple_location_version ) {

SO网友:kaiser

回答

该插件在激活期间生成了149个字符的意外输出。如果您注意到“headers ready sent”消息、联合提要问题或其他问题,请尝试停用或删除此插件。

每一个echo 声明会提到这一点。通常情况下,这只是你echo-ed。

<小时>Here 是指向我的插件卸载/激活/停用(普通/普通)类的链接。您可以看看我是如何将错误输出到admin\\u通知中以检查行为的。你可以试试$this->error( "DB-Error: {$wpdb->last_error}", true ); (或者查看wpdb核心文件,我可能对对象var有错误)以查看dbDelta调用后发生的情况。无论如何:不要回音,您将不会收到通知/错误/意外字符&;标头已发送消息。

SO网友:tollmanz

调查“意外输出”错误的另一种粗略方法是执行exit() wp admin/includes/upgrade第1569行。php。它在dbDelta函数的末尾调用,这将允许您查看生成的输出并快速修复问题,假设问题是dbDelta的问题。我遇到了与您类似的困难,当时dbDelta函数的SQL出现了一些问题,这种策略有助于调试它。这不是最好的解决方案,但在某些情况下会有所帮助。

结束

相关推荐