如何在PDO多字查询中使用通配符?

时间:2013-03-24 02:15:18

标签: search pdo wildcard

我正在开展的项目需要多字搜索......就像搜索'Sprint Apple iPhone'一样。如果这些单词中的任何一个与我的数据库中的列匹配,则必须显示整行的内容。

相信我现在已经从SQL注入中得到了保护,但可能是错误的。我现在要解决的主要问题是我一次只能搜索一个单词,例如“Sprint”或“Apple”或“iPhone”,但如果我输入整个查询,则不会显示任何结果。< / p>

部分查询可以使用例如'Sprin'或'Ap'或'iPho'...不确定我哪里出错了。我在StackOverflow上看了几个适用于单个单词查询但无法找到多字解决方案的例子。

感谢任何帮助!
    

<font size="+3" face="Verdana">xxxx</font>
<br><br>
<form name="form" action="xxxx.php" method="get">
<input type="text" name="q" size="60" />
<input type="submit" name="Submit" value="Search">
</form>

<table>

<?

$var = $_GET['q'];

try {
$conn = new PDO('mysql:host=localhost;dbname=xxxx', $username, $password);
$stmt = $conn->prepare("SELECT * FROM phones WHERE carrier LIKE :search OR        
manufacturer LIKE :search OR model LIKE :search");
$stmt->execute(array('search' => "%$var%"));

$result = $stmt->fetchAll();

if ( count($result) ) {
foreach($result as $row) {
echo "<tr>";
echo "<td>" .$row['carrier']. "</td>";
echo "<td>" .$row['manufacturer']. "</td>";
echo "<td>" .$row['model']. "</td>";
echo "</tr>";    
}
} 
else {
echo "No results found.";
}
} 
catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
?>
</table>  

2 个答案:

答案 0 :(得分:1)

考虑构建查询后多字关键字的外观:

SELECT ... WHERE somefield LIKE '%apple iphone%'
                                  ^^^^^^^^^^^^

你不能简单地将一堆单词转储到LIKE块中并期望它能够正常工作。充其量,你必须做一些按摩:

... WHERE somefield LIKE '%apple%' AND somefield LIKE '%iphone%'
                           ^^^^^                        ^^^^^^

但是对于任何“长”查询字符串来说,这非常非常难看。

为简化起见,您只需切换到fulltext index

即可
... WHERE somefield MATCH(somefield) AGAINST ('apple iphone')          

答案 1 :(得分:0)

我自己解决了这个问题,它实际上并不是一个使用代码的解决方案,而是将Carrier,Manufacturer和Model自动组合到数据库中的1列,当它们最初插入数据库时​​,然后匹配这一列反对用户提供的搜索查询。