PDO绑定MySQL日期变量后LIKE查询无匹配结果的问题
问题排查与解决方案
你的问题出在绑定参数的写法错误,导致占位符没有被正确解析为变量值,而是被当作字符串的一部分处理。
错误原因分析
当你写LIKE "%:lastweek%"时,MySQL会把:lastweek当成字符串的一部分去匹配,实际执行的SQL是找date字段中包含:lastweek这个子串的记录,而不是你传入的日期值,所以自然没有结果。
正确的两种写法
写法一:在绑定变量时拼接通配符%
修改SQL语句,去掉里面的%,直接用占位符:
$sql = 'SELECT `date` FROM `sessions` WHERE `date` LIKE :lastweek';
然后在绑定变量时,把%和日期值拼接在一起:
$stmt->bindValue(':lastweek', "%{$lastWeek}%", PDO::PARAM_STR);
写法二:在SQL中用CONCAT函数拼接通配符
保持变量为纯日期值,在SQL里通过CONCAT把%和占位符拼接:
$sql = 'SELECT `date` FROM `sessions` WHERE `date` LIKE CONCAT(\'%\', :lastweek, \'%\')';
然后正常绑定日期变量即可:
$stmt->bindValue(':lastweek', $lastWeek, PDO::PARAM_STR);
额外注意事项
- 表名一致性:你之前的测试代码里出现过
sessions和lift_sessions两个表名,确认实际查询的表名是否正确,避免因表名错误导致无结果。 - 字段类型优化:如果
date字段是DATE类型,不需要用LIKE,直接用WHERE date = :lastweek即可,效率更高;如果是DATETIME/TIMESTAMP类型,也可以用WHERE DATE(date) = :lastweek来匹配日期部分,同样比LIKE更高效。
内容的提问来源于stack exchange,提问作者grzybowski1911
相关产品推荐
相关产品推荐

