2016-04-06 14 views
0

Bir sorunum var, INSERT ... ON DUPLICATE KEY UPDATE satır güncelleştirme yerine yeni bir kayıt ekliyor, kullandığım tabloyu bir birincil anahtar hem de ve benzersiz bir anahtar. Bu yüzden bunun neden olduğu konusunda kafam karıştı.DUPLICATE ANAHTARI benzersiz anahtar ile güncelleştirme yerine yeni kayıt ekler

Tablo

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 

SORGU

$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

"ON UPDATE" değerindeki değerleri değiştirmiyorsunuz - [buraya bakın] (http://dba.stackexchange.com/questions/110781/insert-on-duplicate-key-update-not-working) gibi--i-bekliyoruz. Ayrıca [INSERT..ON DUPLICATE UPDATE için mysql belgelerini verin] (http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html) bir okuma: değil 1'den fazla benzersiz anahtar ile 'DUPLICATE UPDATE'DE 'kullanın. Temiz görünebilir, ancak Ürün Adının benzersiz olmasını istiyorsanız, kodunuzda bunu işlemekten çok daha iyisiniz. Daha sonra çift ürünü yükleyebilir ve güzel bir hata mesajıyla kullanıcıya gösterebilirsiniz. – Kenney

+1

'Resturant_ID bigint (255) NOT NULL' Bu çok büyük ve orantısız bir süre, koç ve depolama alanı alacaktır. Köşeli parantez içindeki sayı, gerçek değerin kendisinin değil, değerinin * uzunluğunu * tanımlar, böylece bu sayıyı 255 haneye kadar çıkacak şekilde ayarlarsınız. Bir karşılaştırma olarak 8'den fazlasına ihtiyacınız olduğundan şüphe duyuyorsunuz, [unix zaman damgası] (https://en.wikipedia.org/wiki/Unix_time), 1970'den beri her saniye olan sadece 10 basamak uzunluğunda. – Martin

+0

@Martin Web sitesi şu anda 90 imtiyaz sahibi olan bir franchise için üretildiğinden ve büyümeye devam etmekte olduğu için büyümeye devam ediyor. Bazı franchise her biri 50'den fazla restoran var. Ama ne demek istediğimi anladım – jerneva

cevap

2

sözdizimi sadece bana kapalı görünüyor. Belki de SQL'i yazmayı ve önce konsolda veya MySQL çalışma tezgahında mı test etmeyi deneyin? Bu deneyin: mysqli parametreleri adlı destekler

$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); 

Ya da belki ? sekiz kez ve bağlayıcı şeyler iki kez ... değil kapalı olduğundan emin eli eğer ... [yine] Güncellenmiş

başına Martin'in geribildirim.

+1

OPs bağlantısı bir MySQLi bağlantısı olduğunda, PDO sözdizimini kullanıyorsunuz. – Martin

+0

Soru işaretleri mysqli hazırlanmış ifadeler için doğrudur. – Martin

+0

haha, neredeyse orada - 'sssd' yinelenen değişkenleri dahil etmek için genişletmek gerekir :-) – Martin

İlgili konular