如何从 MySql 中检索忽略特殊字符的信息?

How do I retreive information from MySql ignoring special characters?

我有以下简单的搜索查询代码:

function explode_search($squery, $column, $db, $link) {
global $conn;

$ven = explode(' ', safeInput(str_replace(',', '', $squery)));
$ven2 = array_map('trim', $ven);
$qy = ''.$column.' LIKE "%'.implode('%" AND '.$column.' LIKE "%', $ven2).'%"';

$query = 'SELECT DISTINCT '.$column.', id, work_composer FROM '.$db.' WHERE '.$qy.' ORDER BY '.$column.' LIMIT 100';
$result = mysqli_query($conn, $query);
while ($row = mysqli_fetch_assoc($result))  {

    echo '<div><span class="mdmtxt" style="margin-bottom:5px;"><a href="'.$link.'.php?id='.$row['id'].'">'.$row[$column].'</a></span> <span class="mdmtxt" style="opacity:0.6;">('.fixcomp(cfid($row['work_composer'], 'cffor_composer', 'composer_name')).')</span></div>';
}   
}

(safeInput 函数删除了 ' 和 " 以及其他可能存在的问题)

它在一定程度上工作正常。

当有人寻找 'Stephane' 时,我希望他们也能找到 'Stéphane'(反之亦然),或者如果他们正在寻找 'Munich','Münich' 应该出现也在列表中。

有没有办法让 MySQL 匹配那些搜索查询,而不考虑涉及的特殊字符?

您想使用所谓的 "Parameterized Query"。大多数语言都有它们,它们用于保护输入和防止攻击。

在您习惯了它们之后,它们也非常易于使用。

您从像这样的简单查询开始

$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")

然后您将所有实际数据替换为 ?s。

然后绑定每个参数。

$stmt->bind_param("s", $city);

然后调用$stmt->execute();

可在此处找到更多信息:http://php.net/manual/en/mysqli.prepare.php

有一次在大学里,我们的教授让我们使用一个没有参数化查询的库,所以我自己写了一个实现。 Doctrine 非常棒,可以为您处理所有这些。我总是依赖别人为我做这些事情,而不是自己编写实现。那样你会惹上麻烦的。还有很多关于不重新发明新类型的文章,这基本上就是您正在做的。类型有问题。类型需要测试。这种事情在其他实现中得到了很好的测试,而不是你的。