2017-08-17 4 views
0

私は次のような単純な検索クエリのコードを持っている:MySqlから特殊文字を無視して情報を取得するにはどうすればよいですか?

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機能は、「削除され、 "と他の可能problematics)

それはポイントまで無事に動作し

誰かが検索する場合。 「ステファン」の場合は「ステファン」(またはその逆)を探してもらいたい場合や、「ミュンヘン」を探している場合は「ミュンヘン」もリストに表示されます。

MySQLはそれらの検索クエリと一致しますesに関係する特殊文字に関係なく?

+0

バインドされたパラメータを使用した場合、問題のある文字はありません。 – CD001

+0

データベーステーブルの照合をチェックすることもできます。あなたが 'utf8_general_ci'(例えば)を使っているなら、それはアクセントの有無にかかわらず文字と一致するはずです。 *あなたの例では* Stephane *と*Stéphane*はうまくいくはずです。 – CD001

答えて

0

「パラメータ化されたクエリ」と呼ばれるものを使いたいとします。ほとんどの言語にはそれらがあり、入力を保護し、攻撃から保護するために使用されます。

また、使い慣れた後も使いやすいです。

あなたはこの

$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はかなり素晴らしいですが、あなたのためにこれをすべて処理します。私は自分の実装を記述するのではなく、いつも他の誰かが私のためにこのようなことをすることに頼っています。あなたはそのように困ってしまうでしょう。基本的にあなたがやっていることである新しいタイプを再開発しないことについても書かれています。型には問題があります。タイプにはテストが必要です。この種のものは他の実装ではうまくテストされていて、あなたのものではありません。

関連する問題