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

时间:2017-08-17 15:29:29

标签: php mysql search mysqli sql-like

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

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匹配那些搜索查询,无论涉及哪些特殊字符?

1 个答案:

答案 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,非常棒,为您处理这一切。我总是依赖别人为我做这些事情,而不是编写我自己的实现。你会遇到这样的麻烦。还有很多关于不重新发明新类型的文章,这基本上就是你正在做的事情。类型有问题。类型需要测试。这种东西在其他实现中经过了很好的测试,而不是你的。