You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Typo3 QueryBuilder使用动态参数执行LIKE查询失效如何解决?

问题原因

出现静态值正常、动态参数异常的核心原因集中在以下几点:

  • 通配符拼接不符合业务匹配逻辑:你当前的代码仅在用户输入前拼接了%,仅能匹配以$query开头的title字段值。如果你的预期是模糊匹配任意位置包含$query的内容,或是后缀匹配,就会出现无结果的情况;而你测试静态值时大概率带了符合需求的通配符,所以结果正常。
  • 动态输入携带无效字符:传入的$query变量可能带有前后空格、换行符等你没预期到的空白字符,静态测试用的字符串是干净的,所以匹配结果存在差异。
  • 调试判断有误:$queryBuilder->getSQL()返回的是带占位符的预处理SQL,不会显示实际绑定的参数值,你无法通过该方法直接判断动态参数拼接是否正确,容易误判问题。
正确实现方式

首先根据你的匹配需求确定通配符位置:

  • 前缀匹配(内容以输入值开头):仅在输入值后加%
  • 后缀匹配(内容以输入值结尾):仅在输入值前加%
  • 全模糊匹配(内容任意位置包含输入值):输入值前后都加%

标准实现代码如下(以最常用的全模糊匹配为例):

public function getAutocompleteData($query)
{
    // 按需过滤输入的无效空白字符,可根据业务逻辑调整
    $query = trim($query);
    if (empty($query)) {
        return [];
    }

    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_kesearch_index');

    $queryBuilder->select('title')
        ->from('tx_kesearch_index')
        ->where(
            $queryBuilder->expr()->like(
                'title',
                $queryBuilder->createNamedParameter(
                    '%' . $queryBuilder->escapeLikeWildcards($query) . '%',
                    \PDO::PARAM_STR
                )
            )
        );

    // 调试时可打印实际绑定的参数确认是否符合预期
    // debug($queryBuilder->getParameters());

    $data = $queryBuilder->execute();
  
    return $data->fetchAll();
}

注意$queryBuilder->escapeLikeWildcards()的作用是转义用户输入中自带的%、_等LIKE语法通配符,避免用户输入特殊字符导致非预期的匹配结果,不要省略该调用。


内容的提问来源于stack exchange,提问作者deroccha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:42:02