2012-04-15 12 views
0

Hallo zu aktualisieren, ich bin mit dieser Abfrage Probleme haben:MySQL nicht auf doppelte Schlüssel

$size = isset($_POST['size']) 
    ? "'".mysql_real_escape_string($_POST['size'])."'" 
    : "NULL"; 

$color = isset($_POST['color']) 
    ? "'".mysql_real_escape_string($_POST['color'])."'" 
    : "NULL"; 

if (is_numeric($_POST['productID']) && is_numeric($_POST['amount'])) 
{   
    mysql_query("INSERT INTO usercart VALUES ('', '" 
    .mysql_real_escape_string($_SESSION['user_ID'])."', '" 
    .mysql_real_escape_string($_POST['productID'])."', " 
    .$size." , ".$color." , '".mysql_real_escape_string($_POST['amount'])."')" 
    ." ON DUPLICATE KEY UPDATE amount = amount + '" 
    .mysql_real_escape_string($_POST['amount'])."'") or die(mysql_error()); 
} 

In meiner MySQL-Tabelle einen eindeutigen Index "product" auf productID, userID, size und color namens ich habe. Aber wenn ich diese Abfrage ausführe, fügt sie nur ein, anstatt den Betrag zu aktualisieren. Lesen der MySQL-Dokumentation Ich kann und sollte den Indexnamen nicht angeben müssen.

Ich habe jetzt stundenlang damit herumgespielt. Also weiß irgendjemand was los ist?

+0

Können Sie die Einträge, die jetzt doppelt vorhanden sind, in der Tabelle usercart w.r.t auflisten. Der Index? Und überprüfen Sie, dass der Index auch Eindeutigkeit erfordert? –

+0

Die Struktur: http: //img221.imageshack.us/img221/3494/dbuniqueerror01rjw.jpg Und die Einträge: http://img217.imageshack.us/img217/6959/dbuniqueerror02.jpg – Madmenyo

+0

Beide Einträge erstellt werden Verwenden Sie die gleiche Abfrage wie oben beschrieben. Wie Sie sehen können, die exakt gleichen Werte. – Madmenyo

Antwort

0

NULL immer einzigartig angesehen wird. Wenn Sie also entweder Farbe oder Größe auf null setzen, wird das Tupel, das Sie einfügen, als einzigartig betrachtet, soweit es Ihre einzigartigen Einschränkungen betrifft.

+0

Also, wie kann ich das umgehen? Ich brauche die Tabelle zu aktualisieren, selbst wenn die Werte NULL sind. Ich ändere die DB lieber nicht, um Nullen zu akzeptieren, und gebe "null" als Zeichenfolge oder etwas ein, um sie zu ersetzen. – Madmenyo

+0

Dies ist in der Tat die Antwort: Größe und Farbe NICHT NULLFähig zu machen und dafür einen gefälschten Wert zuzulassen (zB 0 und 'none'). Extra: Wenn Sie das Datenmodell nicht ändern können, können Sie NOT NULL in der Anwendung erzwingen, zB durch 'COALESCE (safequote ($ color), 'None')' – wildplasser

+0

NULL ist immer eindeutig, das ist genau so. Mit den Änderungen, die Sie gerade erwähnt haben, können Sie Ihr Problem lösen. Ich kenne keinen anderen Weg. Warum möchten Sie die NULL-Werte beibehalten? –

0

Es scheint, dass Sie einen Surrogatschlüssel "cart_id" haben, der auch automatisch als erstes Feld inkrementiert wird. Ihr Fragment wird wahrscheinlich dazu führen, dass das DBMS versucht, user_id in das erste Feld einzugeben, das cart_id lautet. Versuchen Sie einen bestimmten Einsatz verwendet, die cart_id Weglassen, wie:

INSERT INTO usercart(user_id, product_id, ...) 
VALUES (user_id, product_id, ...) 
    ; 
+0

Nein, das funktioniert nicht: INSERT INTO usercart (userID, productID, size, color, amount) VALUES ('".mysql_real_escape_string ($ _ SESSION [' user_ID '])."', '".mysql_real_escape_string ($ _ POST [ 'ProduktID']). "‘". $ Größe. "". $ Farbe.“, ' ".mysql_real_escape_string ($ _ POST [ 'Menge'])."') \t \t \t \t ON DUPLICATE KEY UPDATE Menge = Betrag + '".mysql_real_escape_string ($ _ POST [' Betrag '])."' – Madmenyo

+0

Obwohl es nicht die Lösung für Ihr Problem ist, ist es immer noch ratsam, die Felder zu benennen, anstatt auf die Reihenfolge der Felder zu vertrauen. – wildplasser

+0

Ow, und warum ist das? Ich habe es immer so benutzt. Ich kann der Reihenfolge der Felder vertrauen, solange ich sie nicht ändere. In diesem Fall funktioniert die Benennung der Felder auch nicht, wenn das Feld keinen Standardwert hat. – Madmenyo

Verwandte Themen