PHP预处理语句LIKE查询无结果,求排查问题原因
我来帮你分析下可能导致查询无结果的几个关键点,一个个来梳理:
前后空格或隐藏字符干扰
你从$_GET['ordem']获取的值可能带有前后空格,甚至是换行、制表符这类不可见的控制字符。比如用户实际输入的是" 操作日志 ",拼接后$ordem就变成了"% 操作日志 %",但数据库里的texto字段是"操作日志",这种情况下LIKE匹配自然找不到对应结果。
解决办法:先对GET参数做清理处理,比如:$input = trim($_GET['ordem']); $ordem = "%{$input}%";要是还怀疑有隐藏字符,可以直接输出
$_GET['ordem']的原始内容,确认参数的真实值。大小写敏感问题
不同数据库的LIKE匹配规则可能区分大小写。比如你的数据库表字符集是utf8_bin(默认区分大小写),而$_GET['ordem']传入的是大写内容,数据库里的texto是小写,这时候LIKE就会匹配失败。
解决办法:统一转换为相同大小写再查询,比如:$input = strtolower(trim($_GET['ordem'])); $ordem = "%{$input}%"; // SQL里同步转换字段值的大小写 $stmt = $conn->prepare("SELECT texto,data_hora FROM logs WHERE LOWER(texto) LIKE ?");也可以修改表的字符集为不区分大小写的类型(比如
utf8_general_ci)。LIKE通配符的特殊处理
如果数据库里的texto字段本身包含%或_这类LIKE的通配符,而你传入的参数是这些字符的实际内容,拼接后的$ordem会把它们当成通配符解析,导致匹配错误。比如数据库里是"abc%def",你传入"abc%def",那$ordem是"%abc%def%",这时候LIKE会匹配所有包含abc+任意字符+def的内容,而非精确的abc%def。
解决办法:对输入的特殊字符进行转义,比如:$input = trim($_GET['ordem']); // 转义LIKE的特殊字符 $input = str_replace(['%', '_'], ['\%', '\_'], $input); $ordem = "%{$input}%";这样绑定参数后,数据库会把
%和_当成普通字符处理。字符集编码不一致
如果PHP脚本的字符集和数据库的字符集不匹配,也会导致内容无法匹配。比如PHP用UTF-8编码,而数据库用GBK,传入的参数编码转换后和数据库里的内容不一致,自然查不到结果。
解决办法:确保PHP和数据库的字符集统一,比如在连接数据库后执行:$conn->set_charset('utf8mb4');同时PHP脚本本身的编码也要设置为UTF-8。
你可以先从第一个点开始排查,先给参数做trim处理看看有没有效果,再逐步排除其他情况。
内容的提问来源于stack exchange,提问作者Pedro Antônio

