2016-04-15 19 views
0

Ich habe diesen Code, der nicht, und ich bin nicht sicher, warum ...WHERE NOT Syntaxfehler VORHANDEN

if(isset($_GET['id'], $_SESSION['username'])){ 
    $id = $_GET['id']; 
    $user = $_SESSION['username']; 
    $query = $handler->query("INSERT INTO photolikes('User', 'Photo') 
          SELECT '$user', '$id' 
          WHERE NOT EXISTS (SELECT Id FROM photolikes WHERE User='$user' AND Photo=$id)"); 
}else{ 
} 

ist nur angeblich einfügen Benutzer und Foto in eine Tabelle funktioniert, wenn keine solche Dinge gibt es dort in vorher ... danke für jede Hilfe!

+0

was meinst du 'doenst work'? gibst du einen Fehler? Sollte etwas tun und etwas anderes tun oder gar nichts tun? –

+0

@JuanCarlosOropeza Sie haben einen Fehler in Ihrer SQL-Syntax; Sie in die Bedienungsanleitung zu Ihrer MySQL-Server-Version für die richtige Syntax entspricht in der Nähe von '' User‘zu verwenden, 'Photo') SELECT ...... – Den

+0

' INSERT INTO photolikes ('User', 'Photo') '.. ... Backticks um Spaltennamen, nicht Anführungszeichen; und kein 'FROM tabellenname' in Ihrem ersten' SELECT' –

Antwort

2

The SELECT fehlt die FROM Klausel, wenn Klausel verwendet wird, ein WHERE erforderlich ist.

das ist das Problem.

Es gibt ein paar Möglichkeiten, es zu beheben.

Für eine schnelle Lösung, können Sie FROM DUAL vor dem WHERE hinzufügen.

Wenn Sie nicht möchten, dass Ihre MySQL-Abfragen wie Oracle-Abfragen aussehen, können Sie eine Inline-Ansicht als Zeilenquelle verwenden.

Anstelle von FROM DUAL könnten Sie FROM (SELECT 1) i verwenden.

Das ist die weniger-Oracle-mehr-MySQL-ähnliche Art und Weise es zu fixieren. So würde ich es machen.

Sie könnten auch jede Tabelle oder Sicht verweisen, die Sie gibt genau eine Zeile garantiert werden. (Es kann nicht null Zeilen sein, und es kann nicht zwei Reihen sein


Ein paar andere Hinweise:.

In MySQL, Bezeichner (zB Spaltennamen) können mit Graviszeichen Zeichen maskiert werden , aber nicht einfache Anführungszeichen. Identifiers müssen nur entkommen, wenn sie Zeichen enthalten, die (in unescaped Identifier) ​​nicht erlaubt sind, oder wenn die Kennung Konflikte mit einem reservierten Wort.

INSERT INTO photolikes(`User`, `Photo`) 
         ^^^ ^

auch erscheint der Code zu sein anfällig für SQL-Injection.Potentiell unsichere Werte, die incorp sind Oder in den Text einer SQL-Anweisung eingegeben werden, sollte ordnungsgemäß maskiert werden. Ein noch besseres Muster besteht darin, vorbereitete Anweisungen mit Bind-Platzhaltern zu verwenden.

+0

Das hat funktioniert, danke. Aber warum hat das Hinzufügen von DUAL funktioniert? – Den

+0

@Den, Sie können 'WHERE' ohne' FROM' nicht verwenden. Sie brauchen also eine "Tabelle" für die FROM-Klausel, die genau eine Zeile hat, obwohl Sie keine Daten daraus lesen. –

+0

@Den: DUAL ist ein Dummy-Tabellenname, der in MySQL verfügbar ist. Aus dem MySQL-Referenzhandbuch ... "Sie dürfen DUAL als Dummy-Tabellenname in Situationen angeben, in denen keine Tabellen referenziert werden: DUAL ist rein für die Bequemlichkeit von Leuten, die verlangen, dass alle SELECT-Anweisungen FROM und möglicherweise andere haben sollten Klauseln. MySQL kann die Klauseln ignorieren. MySQL benötigt FROM DUAL nicht, wenn keine Tabellen referenziert sind. " [http://dev.mysql.com/doc/refman/5.7/en/select.html](http://dev.mysql.com/doc/refman/5.7/en/select.html) – spencer7593

0
INSERT INTO photolikes(`User`, `Photo`) 
    SELECT '$user', '$id' 
    FROM <someTable> 
    ^^^^ you miss the FROM 
    WHERE NOT EXISTS (SELECT Id 
         FROM photolikes -- Here you didnt forget. 
         WHERE User='$user' AND Photo=$id)") 
+0

'someTable' könnte ein Dummy-Subselect sein wie' (select 1) dummy' –

+0

Den Code geändert in :("INSERT INTO photolikes (User, Photo)" SELECT '$ user ', $ id VON Foto WHERE NICHT VORHANDEN (Wählen Sie ID VON photolikes WHERE Benutzer =' $ user 'UND Photo =' $ id ') "); Jetzt macht es das gleiche 10 Mal ... – Den

+0

und funktioniert nach der Änderung?Sie müssen auch ändern "Benutzer", "Foto" Für '\' User \ ', \' Photo \ '' –