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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:51