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

MySQL带连字符法国城市搜索问题:空格输入无结果的解决方法

问题描述

我正尝试在MySQL数据库中搜索法国城市,部分城市名称包含连字符(如SAINT-MALO)。当输入单词形式的“saint-m”时,搜索结果正常;但输入空格分隔的“saint malo”时,无法查询到对应数据。以下是仅涉及city_upper字段搜索的PHP代码:

$list = array();

$strQuery = "SELECT zipcode CodePostal, city_upper Ville FROM french_cities WHERE ";

if (isset($_POST["codePostal"]))
{
    $strQuery .= "zipcode LIKE :codePostal ";
}
else
{
    $strQuery .= "city_upper LIKE :ville ";
}

if (isset($_POST["codePostal"]))
{
    $value = $_POST["codePostal"]."%";
    $query->bindParam(":codePostal", $value, PDO::PARAM_STR);
}
else
{
    $value = utf8_encode($_POST["ville"])."%";
    $query->bindParam(":ville", $value, PDO::PARAM_STR);
}
$query->execute();

$list = $query->fetchAll(PDO::FETCH_CLASS, "AutoCompletionCPVille");

foreach ($list as $row){
$row->Ville = ($row->Ville);
}

echo json_encode($list);

我是PHP新手,猜测可能需要使用explode函数,但不确定具体实现方式,希望获得有效的解决方法。


解决方案

方法1:替换空格为连字符匹配规则

针对输入空格的场景,直接把空格替换成%-,让搜索词能匹配数据库里带连字符的城市名,同时统一转大写(适配city_upper字段):

修改城市搜索分支的代码:

else
{
    // 转大写+编码,匹配数据库的city_upper字段
    $inputVille = strtoupper(utf8_encode($_POST["ville"]));
    // 把空格替换成 "%-",比如"saint malo"变成"SAINT%-MALO%"
    $processedVille = str_replace(' ', '%-', $inputVille) . '%';
    $query->bindParam(":ville", $processedVille, PDO::PARAM_STR);
}

另外,原代码里的foreach循环没有实际作用,可以直接删除。

方法2:拆分搜索词,多条件匹配(更灵活)

如果需要支持更宽泛的匹配(比如输入任意拆分的词都能命中),用explode拆分搜索词,生成多个LIKE条件,确保每个词都出现在城市名中:

完整修改后的代码:

$list = array();

$strQuery = "SELECT zipcode CodePostal, city_upper Ville FROM french_cities WHERE ";

if (isset($_POST["codePostal"]))
{
    $strQuery .= "zipcode LIKE :codePostal ";
    $value = $_POST["codePostal"]."%";
    $query->bindParam(":codePostal", $value, PDO::PARAM_STR);
}
else
{
    $inputVille = strtoupper(utf8_encode($_POST["ville"]));
    // 按空格拆分搜索词
    $terms = explode(' ', $inputVille);
    $conditions = [];
    
    foreach ($terms as $index => $term) {
        // 跳过空字符串(处理连续空格的情况)
        if (trim($term) === '') continue;
        
        $paramName = ":ville_$index";
        $conditions[] = "city_upper LIKE $paramName";
        // 绑定参数,每个词前后加%,匹配任意位置的该词
        $query->bindValue($paramName, "%$term%", PDO::PARAM_STR);
    }
    
    // 拼接条件,没有有效条件时返回空结果
    if (!empty($conditions)) {
        $strQuery .= implode(' AND ', $conditions);
    } else {
        $strQuery .= "1=0";
    }
}

$query->execute();
$list = $query->fetchAll(PDO::FETCH_CLASS, "AutoCompletionCPVille");

echo json_encode($list);

两种方法对比

  • 方法1:精准匹配空格转连字符的场景,适合用户明确知道城市名拆分方式的情况;
  • 方法2:兼容性更强,不管城市名里是空格、连字符还是其他分隔符,只要包含所有搜索词就能命中,容错率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:30:22