PHP报错Call to a member function getTimestamp() on boolean求助
排查并解决「Call to a member function getTimestamp() on boolean」错误
咱们先拆解这个错误的核心:date_create_from_format()函数返回了false(布尔值),而你直接调用了它的getTimestamp()方法,这就导致了这个致命错误。接下来一步步解决:
1. 最直接的原因:日期格式不匹配
你的CSV/Excel日期格式是yyyy/mm/dd H:mm,但代码里用的解析格式是Y/m/d H:i:s——注意多了s(秒)的部分!这就导致函数无法解析没有秒的日期字符串,直接返回false。
修复方法:把解析格式改成和数据源一致的Y/m/d H:i:
$date = date_create_from_format('Y/m/d H:i', $row[$value]);
2. 必须添加解析失败的容错处理
即使格式匹配,也可能遇到CSV里的脏数据(比如空日期、格式错乱的行),所以一定要先判断$date是否有效,再调用方法:
if ($key == 'dateTime') { $date = date_create_from_format('Y/m/d H:i', $row[$value]); // 先判断日期解析是否成功 if ($date === false) { // 这里可以根据需求处理:比如跳过这条数据、记录错误日志 error_log("无效的日期格式:" . $row[$value]); continue; // 或者直接return终止当前行处理 } $timestamp = $date->getTimestamp(); $sql .= 'UNIX_TIMESTAMP('.$key . ') = "' . $timestamp . '"'; }
3. 紧急修复:SQL注入风险
你现在直接把用户输入(CSV数据)拼进SQL语句,存在严重的SQL注入漏洞!建议改用MySQLi预处理语句,既安全又能避免字符串拼接的格式问题。
比如查询部分可以改成这样:
// 先构建占位符和参数数组 $conditions = []; $params = []; $types = ''; foreach ($map_column as $key => $value) { if ($key == 'dateTime') { $date = date_create_from_format('Y/m/d H:i', $row[$value]); if ($date === false) { error_log("无效的日期格式:" . $row[$value]); continue; } $timestamp = $date->getTimestamp(); $conditions[] = 'UNIX_TIMESTAMP(?) = ?'; $params[] = $key; $params[] = $timestamp; $types .= 'si'; // s=字符串,i=整数 } else { $conditions[] = '? = ?'; $params[] = $key; $params[] = $row[$value]; $types .= 'ss'; } } $sql = "SELECT COUNT(*) as count FROM hrar WHERE " . implode(' AND ', $conditions); // 使用预处理语句 $stmt = $cons->prepare($sql); $stmt->bind_param($types, ...$params); $stmt->execute(); $result = $stmt->get_result(); $r = $result->fetch_assoc(); $count = (int)$r['count'];
插入部分同样要改成预处理:
if (!$count) { $columns = implode(", ", array_keys($insData)); $placeholders = implode(", ", array_fill(0, count($insData), '?')); $sql = "INSERT INTO hrar($columns) VALUES ($placeholders)"; $stmt = $cons->prepare($sql); // 绑定参数(这里需要根据字段类型调整types,比如字符串用s,整数用i) $types = str_repeat('s', count($insData)); $stmt->bind_param($types, ...array_values($insData)); if ($stmt->execute()) { echo "New record created successfully"; } else { echo "Error: " . $stmt->error; } }
其他排查点
- 检查CSV文件中
dateTime列的每一行数据,是否存在格式不一致的情况(比如有的行是yyyy-mm-dd,有的是带中文的日期) - 确认PHP的时区设置是否正确,比如在代码开头添加
date_default_timezone_set('Asia/Shanghai');(根据你的时区调整)
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

