2016-10-10 8 views
0

Ich habe eine Situation, in der ich eine Liste von Namen in einem Array hinzufügen und es in einer SQL-Abfrage verwenden möchte.MySQL SELECT WHERE IN Array

Wie ich es tun:

$names = implode(',', $names); 
$sql = "DELETE FROM product WHERE name NOT IN ($names)"; 

Dies funktioniert ok, wenn ich id verwenden (aber ich kann das hier nicht tun). Problem ist - Name kann ein Komma enthalten (d. H. - benchpress rack, blue) und das bricht diese Abfrage. Gibt es eine Möglichkeit, dieses Problem zu umgehen?

+0

Es bricht wahrscheinlich, weil Ihre Namen nicht zitiert werden. Was ist die Fehlermeldung? Wenn "Bankdrück-Rack, blau" wirklich direkt in Ihrer Anfrage ist, die ungültig ist, müssen Strings zitiert werden. – chris85

+0

Wenn Sie die PDO-Erweiterung verwenden, können Sie ein Array als Parameter für $ name senden. Wenn nicht, implodiere die mit einzelnen Apostafotos. Lass deine Sehne wie folgt aussehen: 'Bankdrücken-Rack, blau', 'Bankdrücken-Rack, rot' usw. –

+0

@LaytonEverson Platzhalter müssen jedoch an die Abfrage angehängt werden, damit das Array binden kann. – chris85

Antwort

1

Versuchen Sie folgendes:

$names = implode("','", $names); 
$sql = "DELETE FROM product WHERE name NOT IN ('$names')"; 

Wenn dies Ihr eigentliche Code ist, würde ich vorschlagen, PDO Schalten, eine Bibliothek verwenden oder Ihre Werte mit mysqli_real_escape_string entkommen. Hier

ist ein Link: http://php.net/manual/en/mysqli.real-escape-string.php

Hier ist ein w3schools Link für vorbereitete Anweisungen, eine anständige Ansicht auf hoher Ebene, wie sie arbeiten: http://www.w3schools.com/php/php_mysql_prepared_statements.asp

Hier ist, wie Sie Ihre Aussage Abfrage wird ausgeführt, wenn Ihr mit PDO :

$query= $conn->prepare("DELETE FROM product WHERE name NOT IN (:names)"); 
$query->bindParam(':names', $names); 
$query->execute(); 

Und für mysqli wird es ähnlich sein, beziehen sich auf die w3schools Link für die Unterschiede.

Ich empfehle dringend, weg von den alten mysql-Treiber und zumindest zu mysqli wechseln.

+1

Wäre nett, ein vorbereiteter Aussagealternativbeispiel hinzugefügt zu haben. :) –

+0

Meine Lösung war: '$ existing_name =" '$ name' "; array_push ($ Namen, $ existing_name);' in der Schleife, um das Array zu erstellen. Es stellte sich als genug. – Xeen

+0

@Xeen Das Beste Ansatz ist, vorbereitete Aussagen zu verwenden. "O'Brien" wird immer noch dies brechen. – chris85