2017-07-07 3 views
2

Ich habe versucht, alle Site_Keywords aus der Datenbank abrufen, mit dem wo site_keywords in $ Schlüsselwort. Aber es zeigt keinen Fehler oder Ausgabe.Wie verwendet man ein Array in PHP mysql Abfrage?

$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 "; 

Kann mir jemand dabei helfen?

+2

Ihr Skript ist in Gefahr [SQL-Injection-Angriff] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Werfen Sie einen Blick auf was ist mit [Little Bobby Tables] passiert (http://bobby-tables.com/) Sogar [wenn Sie Eingaben entgehen, ist es nicht sicher!] (http://stackoverflow.com/questions/5741187/sql-injection- that-bekommt-around-mysql-real-escape-string) Verwenden Sie [vorbereitete parametrisierte Anweisungen] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php). –

+0

Bitte führen Sie Ihre Abfrage mit 'mysqli_query()' aus. – urfusion

+0

'$ _REQUEST ['user_query']' ist Array? –

Antwort

3

Es gibt einige fehlende einfache Anführungszeichen in der Join (implodieren) Funktion:

$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 "; 

Abfrage Ohne diese Zitate:

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

Dies wird keine Ausgabe oder Fehler nicht erzeugen, da es keine gültigen Ergebnisse Die Suchanfrage wird als eine lange Zeichenfolge behandelt.

Abfrage Mit diesen Zitaten:

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

Hier wird jede Abfrage in mehreren Suchwert korrekt teilen.

+0

Angenommen, user_query = "habe einen Zweifel daran", dann werden $ keywords, wenn wir die Join-Funktion verwenden, "go", "a", "double", "in", "this" - dann sucht die Suchanfrage nicht habe und das. Wenn ich vorher und nachher anhefte, ist die Abfrage fehlgeschlagen. Wie soll ich das dann machen? – user8214181

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

IN eine wörtliche Suche macht, eine „fuzzy“ zu tun, suchen Sie etwas tun müssen:

$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); 

Jetzt für die Bindung, hängt es, was Sie verwenden:

//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

Verwenden Sie vorbereitete Anweisungen, um eine SQL-Injektion zu verhindern. Der folgende Code kann als Ausgangspunkt für die Lösung Ihres Problems verwendet werden (benötigt die PDO-Bibliothek 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(); 
Verwandte Themen