You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress自定义表加join_date字段后无法插入CSV数据求助

问题拆解与修复方案

咱们先逐个解决你遇到的三个问题,都是代码里的细节问题,新手很容易踩这些坑:


1. 「字段列表中不存在列'join_date '」错误

原因

你在$wpdb->insert的数组里写的键是'join_date '(注意末尾多了个空格!),但数据库表定义里的列名是join_date(没有空格)。MySQL对列名的空格是严格敏感的,自然找不到这个列。

修复

把插入数组里的'join_date ' =>$name改成'join_date' => $name,直接去掉键名末尾的空格就行。


2. 「Unknown column 'username' in 'where clause'」错误

原因

你的数据库表结构里根本没有username这个列,但你在查询语句里写了where username='".$username."'。看你的代码,你把CSV里的$username赋值给了last_name字段,所以应该用表中存在的last_name来做查询条件。

另外,直接把变量拼进SQL里有SQL注入风险,必须用WordPress提供的$wpdb->prepare来处理。

修复

把查询语句改成安全的预处理写法:

$cntSQL = $wpdb->prepare("SELECT count(*) FROM {$tablename} where last_name = %s", $username);

3. 「Undefined offset: 0」和「Trying to get property of non-object」错误

原因

当你的SQL查询出错(比如上面的username列不存在),$wpdb->get_results会返回空数组,这时候$record[0]就会触发索引不存在的错误。就算查询正常,没有匹配记录时$record也可能是空的,同样会报错。

修复

用$wpdb->get_var直接获取统计数量,不需要用get_results返回数组,代码更简洁也更安全:

$count = $wpdb->get_var($cntSQL);
if ($count == 0) {
    // 执行插入逻辑
}

额外优化建议

  1. SQL注入防护:所有外部数据(比如CSV内容、表单数据)都要通过$wpdb->prepare处理,你现在的插入用$wpdb->insert是安全的,但之前的查询写法有风险,已经在上面修复了。
  2. CSV字段对应:你现在把很多数据库字段都赋值为$name,这明显是测试用的,记得根据CSV的实际列对应到数据库字段(比如CSV第1列是first_name,第2列是last_name等)。
  3. 错误处理优化:不要在循环里每次都发邮件,建议收集所有错误后一次性发送,避免频繁触发邮件。

修改后的完整代码

function maybe_insert_new_subscriber_batch_database_table() {
    // 获取表单数据
    parse_str( $_POST['form_data'], $form_data );
    $postarr = array_merge( array(), $form_data );
    global $wpdb;
    $charset_collate = $wpdb->get_charset_collate();
    $table_name = $wpdb->prefix . "lubuvna_subscribers";
    
    // 检查表是否存在,不存在则创建
    if ( $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_name ) ) != $table_name ) {
        $sql = "CREATE TABLE `{$table_name}` (
            ID bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
            first_name varchar(255),
            last_name varchar(255),
            email varchar(255),
            phone varchar(255),
            birthday varchar(255),
            gender varchar(255),
            customer_type varchar(255),
            id_company_number varchar(255),
            street_address varchar(255),
            address_line_2 varchar(255),
            city varchar(255),
            state_area varchar(255),
            zip varchar(255),
            customer_from varchar(255),
            groups varchar(255),
            last_visit varchar(255),
            send_sms varchar(255),
            send_email varchar(255),
            join_date varchar(255),
            post_author varchar(255),
            post_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
            post_status varchar(20),
            PRIMARY KEY (ID)
        ) $charset_collate;";
        require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
        dbDelta( $sql );
    }
    
    $tablename = $table_name;
    $csvFile = fopen( get_option( LUBUVNA_PREFIX . 'file_url' ), 'r' );
    if ( !$csvFile ) {
        wp_send_json_error( '无法打开CSV文件' );
        wp_die();
    }
    fgetcsv( $csvFile ); // 跳过表头
    
    $totalInserted = 0;
    $errors = array();
    
    // 读取CSV内容
    while( ( $csvData = fgetcsv( $csvFile ) ) !== FALSE ) {
        $csvData = array_map( "utf8_encode", $csvData );
        $dataLen = count( $csvData );
        
        // 跳过数据长度不足的行(根据你的CSV实际列数调整)
        if ( $dataLen < 4 ) {
            continue;
        }
        
        // 赋值变量
        $name = trim( $csvData[0] );
        $username = trim( $csvData[1] );
        $email = trim( $csvData[2] );
        $age = trim( $csvData[3] );
        
        // 检查记录是否已存在(用last_name替代不存在的username列)
        $cntSQL = $wpdb->prepare( "SELECT count(*) FROM {$tablename} WHERE last_name = %s", $username );
        $count = $wpdb->get_var( $cntSQL );
        
        if ( $count == 0 ) {
            // 检查必要字段是否非空
            if ( !empty( $name ) && !empty( $username ) && !empty( $email ) && !empty( $age ) ) {
                // 插入记录,修复join_date的空格问题
                $insertSuccess = $wpdb->insert(
                    $tablename,
                    array(
                        'first_name' => $name,
                        'last_name' => $username,
                        'email' => $email,
                        'phone' => $age,
                        'birthday' => $name, // 记得改成CSV对应的实际列
                        'gender' => $name,
                        'customer_type' => $name,
                        'id_company_number' => $name,
                        'street_address' => $name,
                        'address_line_2' => $name,
                        'city' => $name,
                        'state_area' => $name,
                        'zip' => $name,
                        'customer_from' => $name,
                        'groups' => $name,
                        'last_visit' => $name,
                        'send_sms' => $name,
                        'send_email' => $name,
                        'join_date' => $name // 已去掉键名末尾的空格
                    )
                );
                
                if ( $insertSuccess ) {
                    $totalInserted++;
                } else {
                    $errors[] = "插入失败,错误信息:" . $wpdb->last_error;
                }
            }
        }
    }
    
    fclose( $csvFile );
    
    // 有错误才发送邮件
    if ( !empty( $errors ) && get_option( 'some_email_setting' ) == 'enabled' ) {
        $headers = array(
            'MIME-Version: 1.0',
            'From: myemailfrom@mail.com',
            'Content-Type: text/html; charset=UTF-8',
        );
        $errorMessage = implode( '<br>', $errors );
        wp_mail( 'myemailto@hotmail.com', 'WP批量订阅插入错误', $errorMessage, $headers );
    }
    
    wp_send_json_success( array( 'inserted' => $totalInserted ) );
    wp_die();
}
add_action( 'wp_ajax_new_subscriber_batch', 'maybe_insert_new_subscriber_batch_database_table' );

内容的提问来源于stack exchange,提问作者Nash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:02:33