PHP中MySQL PDO的WHERE子句失效问题求助
PHP中PDO查询WHERE子句失效问题排查与解决
问题描述
我在PHP中用PDO执行简单SQL查询时,WHERE子句无法正常生效。移除WHERE条件能获取所有结果,直接在数据库SQL编辑器中执行相同查询却能得到正确结果,请问问题出在哪里?
相关代码与信息
PHP代码
$dbConnection = new PDO('mysql:dbname=XYZ;host=XYZ;', 'XYZ', 'XYZ'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); $statement = $dbConnection->prepare(" SELECT produktId, datum_gebucht FROM tric.lager_umbuchungen WHERE datum_gebucht LIKE '2025-02-25 - 10:40:29' "); $statement->execute(); $result = $statement->fetchAll(PDO::FETCH_ASSOC); print_r($result);
表结构
produktid bigint(20) datum_gebucht varchar(50)
数据示例
produktId datum_gebucht 5901341895 2025-02-25 - 10:40:29
数据库编辑器执行的查询语句
SELECT produktId, datum_gebucht FROM lager_umbuchungen WHERE datum_gebucht LIKE '2025-02-25 - 10:40:29'
PHP输出结果
Array ( )
可能的原因及解决方法
精确匹配用
=替代LIKE:LIKE多用于模糊匹配(需配合%通配符),精确匹配场景下使用=更可靠,避免字符校对规则导致的匹配异常。修改后的SQL:$statement = $dbConnection->prepare(" SELECT produktId, datum_gebucht FROM tric.lager_umbuchungen WHERE datum_gebucht = '2025-02-25 - 10:40:29' ");处理隐藏空白字符:
datum_gebucht是varchar类型,可能存在肉眼不可见的空格、换行符。可以用TRIM()函数去除两端空白后再匹配:SELECT produktId, datum_gebucht FROM tric.lager_umbuchungen WHERE TRIM(datum_gebucht) = '2025-02-25 - 10:40:29'使用参数绑定:参数绑定能避免字符串转义、编码问题,同时提升安全性。修改后的代码:
$targetDate = '2025-02-25 - 10:40:29'; $statement = $dbConnection->prepare(" SELECT produktId, datum_gebucht FROM tric.lager_umbuchungen WHERE datum_gebucht = :targetDate "); $statement->bindParam(':targetDate', $targetDate); $statement->execute();统一数据库字符集:在PDO连接的DSN中指定字符集(如
utf8mb4),确保PHP与数据库的编码一致,避免编码差异导致字符串比较失败:$dbConnection = new PDO('mysql:dbname=XYZ;host=XYZ;charset=utf8mb4', 'XYZ', 'XYZ');
内容的提问来源于stack exchange,提问作者Levin Janßen
相关产品推荐
相关产品推荐

