0

ユーザークエリとデータベースがあります。私のデータベースにはテーブルが含まれています。私が知りたいのは、データベースを照会する方法です。私が考えているのは:

  • クエリをスペースで区切られた配列に区切ります
  • 各単語をループして、LIKE '%{$word}%' OR を実行します
  • その上で、各反復の直前に「AND」を実行します

問題は、正しく動作しないことです。私のクエリに一致する正確な電子メールにさいの目切りはしません。これが私のコードです:

$i=0;
$userQuery = $_POST['q']; // q = "Jonathan gmail"
$sql = "SELECT * FROM addresses WHERE ";
$parts = explode(' ',$userQuery);
$cnt=count($parts);
foreach($parts as $part){
  $part = mysql_real_escape_string($part);
  if($i!==$cnt-1){
        $sql.="(
                addresses.name LIKE  '%".$part."%' OR
                addresses.localpart LIKE  '%".$part."%' OR
                addresses.domain LIKE  '%".$part."%'
            ) AND
        ";
    } else {
        $sql.="(
                addresses.name LIKE  '%".$part."%' OR
                addresses.localpart LIKE  '%".$part."%' OR
                addresses.domain LIKE  '%".$part."%'
            )
        ";
    }
    $i++;               
}

}

私の質問は、このロジックの何が問題なのですか? 正確そうです。

4

3 に答える 3

0

ちょっとこのようなもの:

foreach($parts as $key => $part){
  $part=mysql_real_escape_string($part);
  $sql .= sprintf("(
                addresses.name LIKE %s OR
                addresses.localpart LIKE  %s OR
                addresses.domain LIKE %s
            )", $part);

  if ($key!=($cnt-1)) {
    $sql .= " AND ";
  }
}
于 2013-06-01T19:46:54.180 に答える
0

初期化する前に $i 変数を使用しています。また、REGEXP を使用するためのより良い方法になるかもしれません。何かのようなもの:

// $search_terms = '%Jonathan%|%gmail%'
$sql = "addresses.name REGEXP  $search_terms OR addresses.localpart REGEXP  $search_terms    OR addresses.domain REGEXP  $search_terms";

REGEXPの詳細

于 2013-06-01T19:47:10.820 に答える
0

まず第一に、これは単一の単語で壊れます。2 番目: これは、SQL 攻撃から安全であること以外はすべてです。

今 - 私はそれを行う方法

$parts = preg_split('/[\s,]+/',$userQuery);
$sql=array();
foreach($parts as $part) {
  $part=mysql_real_escape_string($part); //Or whatever works with your DB access framework
  $sql[]="(addresses.name LIKE '%$part%' OR addresses.localpart LIKE '%$part%' OR addresses.domain LIKE '%$part%')";
}
$sql=implode(' AND ', $sql);
$sql="SELECT * FROM addresses WHERE $sql";
于 2013-06-01T19:41:29.083 に答える