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
相关产品推荐
相关产品推荐

