MariaDB中使用datetime变量查询返回空结果问题排查
MariaDB DateTime变量查询无结果的问题分析与解决
你遇到的问题核心原因很直白:直接拼接变量到SQL语句时,没有给DateTime值加上引号,导致数据库把你的时间字符串当成了数学表达式解析,自然查不到数据。
问题拆解
当你写datum >= $ymdt时,实际生成的SQL语句是:
SELECT * FROM wetterdaten where datum >= 2018-01-25 15:16:17 ORDER BY id DESC
数据库会把2018-01-25解析成2018-1-25=1992,后面的15:16:17完全不符合SQL语法——这条语句其实是报错的,只是你的页面没显示错误信息,所以看起来是空结果。
而用'2018-01-25 15:16:17'时,数据库会把它识别为合法的字符串类型DateTime值,自然能正确匹配。
解决方案
1. 临时方案:给变量添加引号(仅用于测试/可控场景)
如果变量值完全可控(比如自己定义的固定值),可以直接给变量加上单引号:
foreach($db->query("SELECT * FROM wetterdaten where datum >= '$ymdt' ORDER BY id DESC") as $zeile) { // 处理数据逻辑 }
⚠️ 注意:如果$ymdt来自用户输入,这种写法存在严重SQL注入风险,绝对不能用于生产环境。
2. 推荐方案:使用PDO预处理语句(安全且规范)
这是数据库查询的标准做法,既能自动处理数据转义、防止SQL注入,又能确保DateTime值被正确解析:
$dat = "2018-01-25 15:16:17"; $ymdt = DateTime::createFromFormat('Y-m-d H:i:s', $dat)->format('Y-m-d H:i:s'); // 准备预处理语句 $stmt = $db->prepare("SELECT * FROM wetterdaten where datum >= :ymdt ORDER BY id DESC"); // 绑定变量 $stmt->bindParam(':ymdt', $ymdt); // 执行查询 $stmt->execute(); // 获取并处理结果 foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $zeile) { // 例如打印每行数据 print_r($zeile); }
预处理语句会自动帮你处理字符串的引号和转义,确保数据库正确识别DateTime类型的值,同时从根源上避免SQL注入问题。
额外调试建议
开启PHP错误显示,能更快定位问题:
error_reporting(E_ALL); ini_set('display_errors', 1);
这样如果SQL语句有语法错误,你能直接看到错误提示,不用再靠“空白页面”猜问题。
内容的提问来源于stack exchange,提问作者user9276613
相关产品推荐
相关产品推荐

