2017-07-07 8 views
2

私はデータベースからsite_keywordsをすべて$ keywordにsite_keywordsを使って検索しようとしていました。しかし、エラーや出力は表示されません。PHPのmysqlクエリで配列を使用する方法?

$user_query = $_REQUEST['user_query']; 
$search=preg_split('/\s+/',$user_query); 
$keywords = join(",",$search); 
$query = "select * from sites where site_keywords in ('%$keywords%') order by rank DESC "; 

誰でもこの手伝いできますか?

+2

あなたのスクリプトは、[SQLインジェクション攻撃]の危険にさらされている(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)を見てください[リトル・ボビー・テーブル](http://bobby-tables.com/)でも起こったこと[あなたが入力を逃れているなら、それは安全ではない!](http://stackoverflow.com/questions/5741187/sql-injection- that-gets-around-mysql-real-escape-string)[prepared parameterized statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)を使用してください。 –

+0

mysqli_query()を使用してクエリを実行してください。 – urfusion

+0

'$ _REQUEST ['user_query']'は配列ですか? –

答えて

3

参加(破)関数内のいくつかの不足している単一引用符があります。これらの引用符なし

$user_query = $_REQUEST['user_query']; 
$search=preg_split('/\s+/',$user_query); 
$keywords = join("','",$search); 
$query = "select * from sites where site_keywords in ('%$keywords%') order by rank DESC "; 

問合せ:

...where site_keywords in ('one,two,three')... 

があるとして、これは、任意の出力またはエラーを生成しません。有効な結果はありません。検索クエリは1つの長い文字列として扱われます。これらの引用符付き

問合せ:ここ

...where site_keywords in ('one','two','three')... 

各クエリが正しく、複数の検索値に分割されます。

+0

user_query = "これが疑わしい"とすると、join関数を使用している場合、$ keywordsは '、' a '、' doubt '、' in '、this - クエリが検索していない持っているとこれ。前と後を追加している場合、クエリは失敗します。それではどうしたらいいですか? – user8214181

0
$query = "select * from sites where site_keywords in (".implode(",",$keywords).") order by rank DESC "; 
0

IN行うには、「ファジー」あなたのような何かをする必要があります検索、リテラル検索を行います。

$query = "SELECT * FROM sites WHERE ".implode(" OR ", array_fill(0,count($search),"site_keywords LIKE ?"); 
//Query looks like SELECT * FROM sites WHERE site_keywords LIKE ? OR site_keywords LIKE ? 

$search = array_map(function ($v) { 
    return "%$v%"; 
},$search); 

今結合のために、それはあなたが使用しているものによって異なります。

//MySQLi 
$stmt = mysqli_prepare($connection, $query); 
mysqli_stmt_bind_param($stmt, array_fill(0,count($search),"s"), ...$search); //Note, you may bet some issues with references here. 
mysqli_stmt_execute($stmt); 

//PDO 
$stmt = $connection->prepare($query); 
for ($i = 0;$i< $search;$i++) { 
    $stmt->bindValue($i+1,$search[$i]); 
} 
$stmt->execute(); 
0

SQLインジェクションを防止するために、常にプリペアドステートメントを使用してください。次のコードは、問題を解決するための出発点として使用できます(PDOライブラリhttp://php.net/manual/en/book.pdo.phpが必要です)。

$user_query = $_REQUEST['user_query'];      // you should better use $_GET or $_POST explicitly 
$user_query = preg_replace('#\s{2,}#', ' ', $user_query); // replace multiple spaces with a single space 
$keywords = explode(' ', $user_query);      // create the keywords array 
$placeholders = array_fill(0, count($keywords), '?');  // create the placeholders array 

$sql = 'SELECT * 
     FROM sites 
     WHERE site_keywords IN (' . implode(', ', $placeholders) . ') 
     ORDER BY rank DESC'; 

$stmt = $db->prepare($sql); 
$stmt->execute($keywords); 
$result = $stmt->fetchAll(); 
関連する問題