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

