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);
}
}
?>
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
'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
@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