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

MySQL中RSS pubDate转日期字段更新失败,求技术解决方案

搞定RSS日期转MySQL DATE字段的问题

嘿,作为新手能写出这样的代码已经很棒了!不过你的代码里有几个关键问题导致更新失败,我一步步给你拆解并修正:

1. SQL语句里的日期字符串没加引号

你直接把$pubDate_Date拼进UPDATE语句里,它是Y-m-d H:i:s格式的字符串,但MySQL要求字符串类型的值必须用单引号括起来,不然会把它当成语法错误。比如原本的SET pubDate_Date = 2024-05-20 12:30:00会被MySQL误解,正确的写法应该是SET pubDate_Date = '2024-05-20 12:30:00'。

2. 没处理日期转换失败的情况

strtotime()不是万能的,遇到一些特殊格式的RSS日期(比如带奇怪时区缩写的)可能会返回false,这时候date()会生成1970-01-01 00:00:00,把这种无效数据存进数据库肯定不是你想要的。

3. 存在SQL注入风险

虽然是自己的数据库,但直接把变量拼进SQL语句是个坏习惯,万一哪天数据里有特殊字符(比如单引号),不仅会报错,还可能带来安全问题。用预处理语句能一次性解决引号和注入的问题。

修改后的完整代码

function pubDateToMySql($str){
    // 先尝试转换为时间戳
    $timestamp = strtotime($str);
    // 检查转换是否成功
    if($timestamp === false){
        return null; // 转换失败返回null,存入数据库时会变成NULL(如果字段允许空的话)
    }
    // 注意:如果pubDate_Date是DATE类型(不是DATETIME),这里改成date('Y-m-d', $timestamp)
    return date('Y-m-d H:i:s', $timestamp);
};

// 先准备好预处理的UPDATE语句,绑定参数避免注入和引号问题
$updateStmt = mysqli_prepare($myConnection, "UPDATE feeds SET pubDate_Date = ? WHERE id = ?");
// "si"表示第一个参数是字符串(s),第二个是整数(i)
mysqli_stmt_bind_param($updateStmt, "si", $pubDate_Date, $id);

// 只查询需要的字段(id和pubDate),比SELECT *更高效
$sqlCommand = "SELECT id, pubDate FROM feeds ORDER BY id ASC"; 
$query = mysqli_query($myConnection, $sqlCommand) or die (mysqli_error($myConnection)); 

while ($row = mysqli_fetch_array($query)) { 
    $id = $row["id"]; 
    $pubDate = $row["pubDate"]; 
    $pubDate_Date = pubDateToMySql($pubDate);
    
    // 只有转换成功才执行更新
    if($pubDate_Date !== null){
        mysqli_stmt_execute($updateStmt);
    } else {
        // 可以在这里记录转换失败的情况,方便排查
        echo "转换失败的ID: $id,原日期字符串: $pubDate<br>";
    }
} 

// 记得释放结果集和关闭预处理语句
mysqli_free_result($query);
mysqli_stmt_close($updateStmt);

额外小技巧

如果strtotime()还是搞不定某些RSS日期,试试用DateTime类,它对各种日期格式的兼容性更好,比如处理带时区的日期:

function pubDateToMySql($str){
    try {
        $date = new DateTime($str);
        // 同样,DATE类型就改成'Y-m-d'
        return $date->format('Y-m-d H:i:s');
    } catch (Exception $e) {
        return null;
    }
}

这样应该就能正常更新数据啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:02:14