2016-03-26 6 views
0

Ich habe nach Antworten auf diese alle über das Internet sieht, und vorbereitete Anweisungen und binden params kommen (Ich habe keine Ahnung, was das Zeug ist)MYSQLI - WO IN Array

Grundsätzlich habe ich ein Komma ich möchte für jedes dieser Elemente in einer Spalte der Datenbank suchen getrennte Liste

$list = 'food, drink, cooking'; 

Ok, jetzt ... Klingt einfach, nicht wahr?

$query = "SELECT * FROM table WHERE stuff IN ('$list')"; 
$runquery = mysqli_query($connection, $query); 
while($row = mysqli_fetch_array($runquery,MYSQLI_ASSOC)){ 
    $variable = $row; 
} 

Dann später,

var_dump($variable); 

undefinierte Variable

Warum? Ich kann nichts falsch mit dem Code sehen. Es funktioniert, wenn ich einen bestimmten Wert anlege, und ich habe es mit WHERE stuff=$item getestet - das funktioniert gut.

Also ist es nicht die Variablen/Datenbank, es ist ein Fehler in der IN-Anweisung. Ich verstehe nicht, warum es nicht funktioniert.

Antwort

3

Jedes Element muss in Anführungszeichen es

$list = "'food', 'drink', 'cooking'"; 
$query = "SELECT * FROM table WHERE stuff IN ($list)"; 

Oder wenn Sie

$array = array("food","drink","cooking"); 
$query = "SELECT * FROM table WHERE stuff IN (".implode(',', $array).")"; 
+0

Die Array-Methode wird nicht funktionieren. –

+0

die einfachste Sache, verdammt! danke, das hat das problem perfekt gelöst - und danke an alle anderen die kommentiert haben! – PHPlearnerproject

+0

@PHPlearnerproject Sie müssen erkennen, dass dieser Code nichts mit Perfektion zu tun hat, da er im Wesentlichen anfällig für SQL-Injection ist. –

-2

Ihre Liste ist ein Array hatte $list = 'food, drink, cooking';. Aber Sie können es nicht in WHERE IN einfügen. Sie sollten es vorbereiten: explodieren Sie $list Zeichenfolge, implodieren Sie es dann mit entsprechenden Anführungszeichen und übergeben Sie es an IN-Klausel.

diesen Code Versuchen:

$list = 'food, drink, cooking'; 
$listArray = array_map('trim', explode(',', $list)); 
$listWhere = "('".implode("','", $listArray)."')"; 

$query = "SELECT * FROM table WHERE stuff IN ".$listWhere; 
$runquery = mysqli_query($connection, $query); 
while($row = mysqli_fetch_array($runquery,MYSQLI_ASSOC)){ 
    $variable = $row; 
} 
+0

Ich bin mir nicht sicher, ob das die wahre Bedeutung von * preparing * ist, um einen Wert in eine db-Abfrage zu übergeben, aber ich könnte mich irren ... obwohl WikiPedia nicht perfekt ist, denke ich [diese Beschreibung] (https: // en.wikipedia.org/wiki/Prepared_statement) ist ziemlich genau ... – webeno

+0

Ich meine Abfrage vorbereiten. Der Autor bekommt diese SQL 'SELECT * FROM Tabelle WHERE stuff IN ('essen, trinken, kochen')' und es funktioniert nicht. Er sollte $ list string aufteilen und dann mit entsprechenden Anführungszeichen implodieren und an die IN-Klausel übergeben. –

+0

Ich argumentiere nicht, dass, was ich Ihnen sage, dass das OP keine Ahnung hat, was eine vorbereitete Aussage bedeutet, und was Sie tun, ist * nicht * was wir normalerweise mit vorbereiteten Aussagen meinen, das ist etwas anderes. – webeno

1

ich, dass zu jeder Zeit vermuten, dass die Abfrage nicht eine Zeile zurückgibt, Sie gehen, dass nicht definierte Variable zu erhalten. Wir sehen nicht, dass die Variable irgendwo definiert/initialisiert wird, außer nachdem eine Zeile abgerufen wurde.

Soweit, warum die Abfrage zurückgeben keine Zeile, die Ihrer Suchanfrage entspricht

... WHERE stuff = 'food, drink, cooking' 

, dass ein einzelner Stringliteral ist. Die Abfrage wird nur Zeilen zurückgeben, in denen der Spaltenkram dieser Zeichenfolge entspricht. Die Kommas innerhalb dieser Zeichenfolge sind nur ein Teil des Wertes. Wenn Sie möchten, um Zeilen zu finden, wo Sachen alle Werte enthalten, Ihre Abfrage müßte von der Form sein:

... WHERE stuff IN ('food','drink','cooking') 

Hinweis, dass dies drei separate Stringliterale, durch Kommas getrennt. Die Kommas sind Teil der SQL-Anweisung, nicht Teil des Wertes. Dies würde Zeilen zurückgeben, in denen das Spaltenmaterial "Nahrung" enthält. Oder "trinken". Oder "kochen".

Deshalb ist Ihre Abfrage "nicht funktioniert".

+0

löste es, perfekt! Danke! – PHPlearnerproject