我有以下简单的搜索查询代码:
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'(反之亦然),或者如果他们正在寻找'慕尼黑','Münich'也应该出现在列表中。
有没有办法让MySQL匹配那些搜索查询,无论涉及哪些特殊字符?
答案 0 :(得分:0)
您希望使用名为&#34;参数化查询&#34;的内容。大多数语言都有它们,它们用于保护输入并防止攻击。
在您习惯它们之后,它们也非常容易使用。
您可以从这样的简单查询开始
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")
并使用?
替换所有实际数据。
然后绑定每个参数。
$stmt->bind_param("s", $city);
然后拨打$stmt->execute();
可在此处找到更多信息:http://php.net/manual/en/mysqli.prepare.php
大学一次,我们的教授让我们使用了一个没有参数化查询的库,所以我自己编写了一个实现。 Doctrine,非常棒,为您处理这一切。我总是依赖别人为我做这些事情,而不是编写我自己的实现。你会遇到这样的麻烦。还有很多关于不重新发明新类型的文章,这基本上就是你正在做的事情。类型有问题。类型需要测试。这种东西在其他实现中经过了很好的测试,而不是你的。