1

私が取り組んでいるプロジェクトでは、複数の単語を検索する必要があります...例として「Sprint Apple iPhone」を検索します。これらの単語のいずれかがデータベースの列と一致する場合、行全体の内容を表示する必要があります。

これで SQL インジェクションから保護されたと思いますが、間違っている可能性があります。私が今解決しようとしている主な問題は、一度に 1 つの単語しか検索できないことです。たとえば、「Sprint」、「Apple」、「iPhone」などですが、クエリ全体を入力すると結果が表示されません。

「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>  
4

2 に答える 2

1

クエリが作成されると、複数単語のキーワードがどのように表示されるかを検討してください。

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

LIKEたくさんの単語を単純にブロックにダンプして、それが機能することを期待することはできません。せいぜい、いくつかのマッサージを行う必要があります。

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

しかし、これは「長い」クエリ文字列に対して非常に醜い非常に高速になります。

簡単にするために、フルテキスト インデックスに切り替えるだけです。

... WHERE somefield MATCH(somefield) AGAINST ('apple iphone')          
于 2013-03-24T02:19:41.100 に答える
0

私は自分で問題を解決しました。実際にはコードを使用した解決策ではありませんでしたが、最初にデータベースに挿入されたときに、キャリア、メーカー、モデルをデータベースの 1 列に自動的に結合し、その 1 列を一致させました。ユーザーが提供した検索クエリに対して。

于 2013-03-24T02:57:07.203 に答える