时间戳转日期后按日期匹配查询用户详情无结果求助
问题排查与修复方案
嘿,我帮你梳理了这段代码里的问题,这几个点是导致你查不到数据的核心原因:
1. 变量类型被错误覆盖,时间戳变日期字符串
你一开始定义的$beginTimeStamp和$endTimeStamp是数字类型的时间戳(比如1524853800),但后续执行了这段代码:
$beginTimeStamp = date('Y-m-d', strtotime($beginTime . ' +1 day'));
这直接把原本的时间戳变量改成了YYYY-MM-DD格式的字符串,拼到SQL里就变成了created_at >=2018-04-29——SQL会把这个当成数值计算(2018减4减29),完全不是你想要的日期比较逻辑,自然查不到数据。
2. 日期转换逻辑冗余且易出错
你本来已经有原始时间戳了,完全不需要先转成日期字符串,再用strtotime重新解析加一天,直接对时间戳做秒数加减更准确:一天等于86400秒,直接给时间戳加86400就能得到次日同一时间的时间戳。
3. 存在SQL注入风险+语法错误
直接把变量拼到SQL语句里是非常危险的操作,而且你现在的变量变成字符串后没有加单引号,SQL会直接报错或者逻辑混乱。Laravel提供了参数绑定的方式,一定要用这个来避免问题。
修正后的代码示例
这里给你两种可行的修复方案,选适合你的就行:
方案1:使用原生SQL+参数绑定
$beginTimeStamp = 1524853800; // 注意这里是数字类型,不要加引号 $endTimeStamp = 1525717800; // 把时间戳转成数据库能识别的datetime格式字符串 $beginDate = date('Y-m-d H:i:s', $beginTimeStamp); // 结束时间加一天:直接给原始时间戳加86400秒 $endDate = date('Y-m-d H:i:s', $endTimeStamp + 86400); // 用参数绑定避免SQL注入,同时保证语法正确 $userDetails = DB::select('SELECT * from users where created_at >= ? AND created_at < ?', [$beginDate, $endDate]);
方案2:更简洁的Laravel查询构造器写法
$beginTimeStamp = 1524853800; $endTimeStamp = 1525717800; $userDetails = DB::table('users') ->where('created_at', '>=', date('Y-m-d H:i:s', $beginTimeStamp)) ->where('created_at', '<', date('Y-m-d H:i:s', $endTimeStamp + 86400)) ->get();
如果你的created_at字段是timestamp类型,甚至可以直接用时间戳比较,省去日期转换步骤:
$userDetails = DB::table('users') ->where('created_at', '>=', $beginTimeStamp) ->where('created_at', '<', $endTimeStamp + 86400) ->get();
内容的提问来源于stack exchange,提问作者Maneesh Rao
相关产品推荐
相关产品推荐

