向SQL插入数据时Timestamp无法正确录入的问题求助
解决WordPress中
$wpdb->insert插入时间为0000-00-00 00:00:00的问题 我一眼就发现了导致时间插入失败的核心问题,同时也给你几个额外的排查方向:
1. 最直接的原因:格式化占位符数量不匹配
你在调用$wpdb->insert()时,插入的字段数组包含5个元素,但对应的格式占位符数组只有4个,缺少了date字段对应的格式标识!
current_time('mysql')返回的是字符串类型的时间(比如2024-05-20 15:45:30),所以需要给它加上%s占位符。
修正后的log_participant函数代码:
public function log_participant( $product_id, $current_user_id, $ticketnumber, $order_id ) { global $wpdb; $log_bid = $wpdb->insert( $wpdb->prefix . 'wc_lottery_log', array( 'userid' => $current_user_id, 'lottery_id' => $product_id, 'ticketid' => $ticketnumber, 'orderid' => $order_id, 'date' => current_time( 'mysql' ), ), array( '%d', '%d', '%d', '%s', '%s' ) // 新增对应date的%s占位符 ); return $wpdb->insert_id; }
2. 额外排查点
如果修正后还是有问题,可以检查以下几点:
- 数据库字段类型:确认
wc_lottery_log表的date字段类型是DATETIME或TIMESTAMP,且没有设置错误的约束(比如NOT NULL却没有默认值,同时插入值无效时就会填充0000)。 - 验证
current_time的输出:在函数里临时添加var_dump(current_time('mysql')); exit;,确认它返回的是合法的时间字符串,而不是空值或错误格式。 - WordPress时区设置:后台进入「设置」→「常规」,检查站点时区是否正确配置,
current_time('mysql')会基于这个时区返回时间。
补充小提示
我还注意到你在循环调用log_participant时,传入了5个参数($this->log_participant( $product_id, $order->get_user_id(), $ticketnumber, $order_id, $item );),但函数定义只接受4个参数,这会导致$item参数被忽略,你可以根据实际需求调整函数参数哦。
内容的提问来源于stack exchange,提问作者Shaun
相关产品推荐
相关产品推荐

