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

MySQL日期格式更新后查询无结果且无报错问题求助

问题分析与解决方案

先帮你拆解代码里的核心问题,这些问题直接导致了UPDATE没执行、SELECT查不到结果:

1. UPDATE语句的语法错误

你写的UPDATE查询里错误嵌套了PHP代码,这完全不符合SQL语法,MySQL根本无法识别,所以UPDATE操作根本没执行,数据库里的vv值还是原来的格式,自然用新格式的$final查不到结果。

错误写法:

$result = mysqli_query($con,"$result = mysqli_query($con,"UPDATE `data` SET `vv` = STR_TO_DATE(REPLACE(`vv`, '.', '-'), '%d-%m-%Y %H:%i:%s')");");

正确的UPDATE语句应该是:

$result = mysqli_query($con, "UPDATE `data` SET `vv` = STR_TO_DATE(REPLACE(`vv`, '.', '-'), '%d-%m-%Y %H:%i:%s')");

执行后可以用mysqli_affected_rows($con)检查是否有行被更新,确认操作是否成功。

2. $final变量的字符串截取错误

假设$_POST['start_date']是2019-12-09 12:55:50这种格式:

  • substr($start, 0, 10)能正确获取日期部分,但substr($start, 11, 17)是错误的:第三个参数是截取长度,时间部分12:55:50只有9个字符,写17会截取到超出字符串的内容,导致$final格式混乱。

更可靠的做法是用DateTime类处理日期,避免手动截取的失误:

$date = new DateTime($_POST['start_date']);
$final = $date->format('Y-m-d H:i:s');

3. SQL注入风险与结果读取错误

直接把$final拼到SELECT语句里有SQL注入风险,而且mysqli_query返回的是结果集对象,直接print_r($result2)只会输出对象信息,不会显示数据,需要用fetch_assoc()或fetch_array()获取具体行数据。建议用预处理语句:

$stmt = $con->prepare("SELECT * FROM data WHERE vv = ?");
$stmt->bind_param("s", $final);
$stmt->execute();
$result2 = $stmt->get_result();

// 遍历输出结果
while ($row = $result2->fetch_assoc()) {
    print_r($row);
}

完整修正后的代码示例

<?php
include("includes\conn.php");

// 处理日期参数,避免格式错误
if (isset($_POST['start_date'])) {
    try {
        $date = new DateTime($_POST['start_date']);
        $final = $date->format('Y-m-d H:i:s');
    } catch (Exception $e) {
        echo "日期格式错误:" . $e->getMessage();
        exit;
    }
} else {
    echo "未提交start_date参数";
    exit;
}

// 执行UPDATE操作并检查结果
$result = mysqli_query($con, "UPDATE `data` SET `vv` = STR_TO_DATE(REPLACE(`vv`, '.', '-'), '%d-%m-%Y %H:%i:%s')");
if ($result) {
    echo "更新成功,共更新 " . mysqli_affected_rows($con) . " 行<br>";
} else {
    echo "更新失败:" . mysqli_error($con);
    exit;
}

// 预处理查询并输出结果
$stmt = $con->prepare("SELECT * FROM data WHERE vv = ?");
$stmt->bind_param("s", $final);
$stmt->execute();
$result2 = $stmt->get_result();

echo "查询结果:<br>";
while ($row = $result2->fetch_assoc()) {
    print_r($row);
    echo "<br>";
}

// 关闭资源
$stmt->close();
mysqli_close($con);
?>

额外提醒

  • 建议把vv列的类型改成DATETIME或TIMESTAMP,如果当前是VARCHAR类型,虽然能存储字符串,但日期类型更适合后续的日期查询和操作。
  • 执行UPDATE前最好先备份数据,避免操作失误导致数据丢失。

内容的提问来源于stack exchange,提问作者Maria Abdullah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:32:33