2016-04-06 4 views
0

Ich habe ein Problem, mein INSERT ... ON DUPLICATE KEY UPDATE fügt einen neuen Datensatz ein, anstatt die Zeile zu aktualisieren, die verwendete Tabelle hat beide einen Primärschlüssel und ein einzigartiger Schlüssel. Also bin ich verwirrt, warum das passiert.ON DUPLICATE KEY fügt neuen Datensatz ein, anstatt mit Unique Schlüssel zu aktualisieren

Tabelle

CREATE TABLE `Product` (
`Product_Id` bigint(255) NOT NULL AUTO_INCREMENT, 
`Resturant_ID` bigint(255) NOT NULL, 
`Product_Desc` text NOT NULL, 
`Product_Name` varchar(100) NOT NULL, 
`Product_Price` decimal(8,0) NOT NULL, 
`Add_On_ID` int(11) NOT NULL, 
PRIMARY KEY (`Product_Id`), 
UNIQUE KEY `Product_Name` (`Product_Name`) 
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 

QUERY

$add_product_errors = array(); 
    if (isset($_POST['add'])) { 
     $item_name = $_POST['item_name']; 
     $desc = $_POST['desc']; 
     $price = $_POST['price']; 
     $rest_id = mysqli_real_escape_string($dbc, $_SESSION['Resturant_ID']); 
     if (empty($_POST['price']) || !filter_var($_POST['price'], FILTER_VALIDATE_FLOAT) || ($_POST['price'] <= 0)) { 
      $add_product_errors['price'] = "Please enter a product price"; 
     } 
     if (empty($_POST['item_name'])) { 
      $add_product_errors['item_name'] = "Please enter a name"; 
     } 
     if (empty($_POST['desc'])) { 
      $add_product_errors['desc'] = "Please enter a product description"; 
     } 
     $query = "INSERT INTO Product(Resturant_ID,Product_Name,Product_Desc,Product_Price) VALUES (?,?,?,?) 
      ON DUPLICATE KEY 
       UPDATE 
       Resturant_ID = VALUES(Resturant_ID) 
      ,Product_Name = VALUES(Product_Name) 
      ,Product_Desc = VALUES(Product_Desc) 
      ,Product_Price = VALUES(Product_Price)"; 
     $run_query = mysqli_prepare($dbc, $query); 
     if (!$run_query) { 
      die(mysqli_error($dbc)); 
     } 
     mysqli_stmt_bind_param($run_query, 'sssd', $rest_id, $item_name, $desc, $price); 
     $execute = mysqli_stmt_execute($run_query); 
     $item_name = strip_tags($_POST['item_name']); 
     $desc = strip_tags($_POST['desc']); 
     //100 - changes the way the decimal displays in database 
     $price = strip_tags($_POST['price'] * 100); 
     if ($execute) { 
      echo "<script> alert('Addrrss Saved')</script>"; 
     } else { 
      echo "<b>Oops! we have an issue </b>"; 
      mysqli_stmt_close($run_query); 
     } 
    } 
    ?> 
+1

Sie ändern nicht die Werte in Ihrem ON UPDATE - [siehe hier] (http://dba.stackexchange.com/questions/110781/insert-on-duplicate-key-update-not-working) -als-ich-erwarte). Auch [gib die MySQL-Dokumentation für INSERT..ON DUPLICATE UPDATE] (http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html) ein read-over: Es wird empfohlen, dies nicht zu tun Verwenden Sie "ON DUPLICATE UPDATE" mit mehr als 1 eindeutigen Schlüssel. Es mag zwar sauber erscheinen, aber wenn Sie möchten, dass der Produktname eindeutig ist, sind Sie in Ihrem Code besser dran. Sie können dann das doppelte Produkt laden und es dem Benutzer in einer netten Fehlermeldung anzeigen. – Kenney

+1

'Resturant_ID bigint (255) NOT NULL' Dies ist zu groß und wird unverhältnismäßig viel Zeit, RAM und Speicherplatz beanspruchen. Die Zahl in Klammern definiert die * Länge * des Wertes und nicht den tatsächlichen Wert selbst. Daher setzen Sie diese Zahl auf bis zu 255 Stellen. bezweifle, dass du mehr als 8 benötigst, zum Vergleich ist der [unix timestamp] (https://en.wikipedia.org/wiki/Unix_time), der jede Sekunde seit 1970 ist, nur 10 Ziffern lang. – Martin

+0

@Martin, weil die Website für eine Franchise, die derzeit 90 Franchises hat, gebaut wird, und wächst immer noch ich machte es absichtlich 255, nur um das Wachstum der Unternehmen zu decken. Einige der Franchiseunternehmen haben jeweils mehr als 50 Restaurants. Aber ich sehe was du meinst – jerneva

Antwort

2

Die Syntax sieht nur auf mich. Versuchen Sie vielleicht, das SQL zu schreiben und es zuerst in der Konsole oder in der MySQL-Workbench oder was zuerst zu testen? Versuchen Sie folgendes:

$query = "INSERT INTO Product(Resturant_ID,Product_Name,Product_Desc,Product_Price) VALUES (?,?,?,?) 
    ON DUPLICATE KEY UPDATE 
     Resturant_ID = ? 
     ,Product_Name = ? 
     ,Product_Desc = ? 
     ,Product_Price = ?"; 

    $run_query = mysqli_prepare($dbc, $query); 
    if (!$run_query) { 
     die(mysqli_error($dbc)); 
    } 
    mysqli_stmt_bind_param($run_query, 'issdissd', $rest_id, $item_name, $desc, $price, $rest_id, $item_name, $desc, $price); 

Oder vielleicht ? acht Mal und verbindliche Dinge zweimal ... nicht sicher aus der Hand, wenn Mysqli Parameter ...

namens unterstützt aktualisiert [wieder] pro Martins Feedback.

+1

Sie verwenden die PDO-Syntax, wenn die OP-Verbindung eine MySQLi-Verbindung ist. – Martin

+0

Fragezeichen sind für mysqli vorbereitete Anweisungen korrekt. – Martin

+0

haha, fast da - du musst das 'sssd' erweitern, um die wiederholten Variablen zu integrieren :-) – Martin

Verwandte Themen