try {
$menuAdlari = array();
$dilsor = $db->query("SELECT * FROM dil");
$dilcek = $dilsor->fetchAll(PDO::FETCH_ASSOC);
foreach ($dilcek as $dil) {
$dilKisa = $dil['dil_kisa'];
$menuAdiDil = $_POST['menuad' . $dilKisa];
$menudil = $_POST['menudil' . $dilKisa];
$id = $_POST['id' . $dilKisa];
$menuSlug = seo($menuAdiDil);
$menuAdlari[] = array(
'menuAdiDil' => $menuAdiDil,
'menuSlug' => $menuSlug,
'menudil' => $menudil,
'id' =>$id
);
}
$menuust = isset($_POST['menuust']) ? $_POST['menuust'] : 0;
$menusabit = $_POST['menusabit'];
$menuurl = $_POST['menuurl'];
$menusira = $_POST['menusira'];
$menusite = $_POST['menusite'];
$menupanel = $_POST['menupanel'];
$menupanelmenu = $_POST['menupanelmenu'];
$idrand = $_POST['idrand'];
$mendil = $_POST['menudil'];
$id = $_POST['id'];
// Veritabanından mevcut kayıtlar
$stmt = $db->prepare("SELECT * FROM menu WHERE idrand = :idrand AND menudil=:menudil ");
$stmt->execute(array(':idrand' => $idrand, ':menudil' => $mendil));
$existing_menu = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt->bindValue(':menuust', $menuust, PDO::PARAM_STR);
$stmt->bindValue(':menusabit', $menusabit, PDO::PARAM_STR);
$stmt->bindValue(':menuurl', $menuurl, PDO::PARAM_STR);
$stmt->bindValue(':menusira', $menusira, PDO::PARAM_STR);
$stmt->bindValue(':menusite', $menusite, PDO::PARAM_STR);
$stmt->bindValue(':menupanel', $menupanel, PDO::PARAM_STR);
$stmt->bindValue(':menupanelmenu', $menupanelmenu, PDO::PARAM_STR);
$stmt->bindValue(':menubanner', $resimyol, PDO::PARAM_STR);
$stmt->bindValue(':idrand', $idrand, PDO::PARAM_STR);
// Eğer mevcut kayıt yoksa
if (!$existing_menu) {
foreach ($menuAdlari as $menuAdi) {
$stmt = $db->prepare("INSERT INTO menu (idrand, menuust, menusabit, menuad, menuslug, menuurl, menusira, menudil, menusite, menupanel, menupanelmenu, menubanner ) VALUES (:idrand,:menuust, :menusabit, :menuad, :menuslug, :menuurl, :menusira, :menudil, :menusite, :menupanel, :menupanelmenu, :menubanner )");
$stmt->bindValue(':menuust', $menuust, PDO::PARAM_STR);
$stmt->bindValue(':menusabit', $menusabit, PDO::PARAM_STR);
$stmt->bindValue(':menuurl', $menuurl, PDO::PARAM_STR);
$stmt->bindValue(':menusira', $menusira, PDO::PARAM_STR);
$stmt->bindValue(':menusite', $menusite, PDO::PARAM_STR);
$stmt->bindValue(':menupanel', $menupanel, PDO::PARAM_STR);
$stmt->bindValue(':menupanelmenu', $menupanelmenu, PDO::PARAM_STR);
$stmt->bindValue(':menubanner', $resimyol, PDO::PARAM_STR);
$stmt->bindValue(':idrand', $idrand, PDO::PARAM_STR);
$stmt->bindValue(':menuad', $menuAdi['menuAdiDil'], PDO::PARAM_STR);
$stmt->bindValue(':menuslug', $menuAdi['menuSlug'], PDO::PARAM_STR);
$stmt->bindValue(':menudil', $menuAdi['menudil'], PDO::PARAM_STR);
$stmt->execute();
}
} else {
$stmt = $db->prepare("UPDATE menu SET menuust = :menuust, menusabit = :menusabit, menuurl = :menuurl, menusira = :menusira, menusite = :menusite, menupanel = :menupanel, menupanelmenu = :menupanelmenu, menubanner = :menubanner WHERE idrand = :idrand AND menudil = :menudil AND id = :id");
$stmt->bindValue(':menuust', $menuust, PDO::PARAM_INT);
$stmt->bindValue(':menusabit', $menusabit, PDO::PARAM_STR);
$stmt->bindValue(':menuurl', $menuurl, PDO::PARAM_STR);
$stmt->bindValue(':menusira', $menusira, PDO::PARAM_INT);
$stmt->bindValue(':menusite', $menusite, PDO::PARAM_INT);
$stmt->bindValue(':menupanel', $menupanel, PDO::PARAM_INT);
$stmt->bindValue(':menupanelmenu', $menupanelmenu, PDO::PARAM_INT);
$stmt->bindValue(':menubanner', $resimyol, PDO::PARAM_STR);
$stmt->bindValue(':idrand', $idrand, PDO::PARAM_STR);
$stmt->bindValue(':menudil', $mendil, PDO::PARAM_STR);
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
}
} Update ve Insert işlemlerini aynı anda yapmak istiyorum
3
●154
- 26-04-2023, 18:44:19merhabalar formdan gelen menu tablosunda bulunan idrand sabit verilerim var güncelleme işlemi sırasında idrand aynı olanların menudil kısımlarını kontrol edecek ve menudil aynı olanları güncellerken aynı olmayanlarını yeni bir satır olarak eklemsini istiyorum aşağıda bulunan kodu çalıştırmak istiyorum ama her seferinde bütün menüyü tekrar ekliyor yardımcı olursanız sevinirim.
- 27-04-2023, 03:04:33INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;
c sütünü için uniq index oluşturun, insert işleminide c değeri zaten tabloda varsa UPDATE den sutunları tek işlemde güncelleyebilirsiniz.
bu arada verdiğiniz kod da insert foreach içinde update foreach içinde değil
insert on duplicate : https://dev.mysql.com/doc/refman/8.0...duplicate.html - 27-04-2023, 20:41:26Kodu aşağıdaki gibi düzelttim ama güncelleme işlemini yapmıyor verileri tekrar kayıt işlemi yapıyor hatayı nerede yapıyorum bulamadım yardımlarını bekliyorum. şimdiden teşekkürler ederim
try { $menuAdlari = array(); $dilsor = $db->query("SELECT * FROM dil"); $dilcek = $dilsor->fetchAll(PDO::FETCH_ASSOC); foreach ($dilcek as $dil) { $dilKisa = $dil['dil_kisa']; $menuAdiDil = $_POST['menuad' . $dilKisa]; $menudil = $_POST['menudil' . $dilKisa]; $menuSlug = seo($menuAdiDil); $menuAdlari[] = array( 'menuAdiDil' => $menuAdiDil, 'menuSlug' => $menuSlug, 'menudil' => $menudil ); } $stmt = $db->prepare("INSERT INTO menu (idrand, menuust, menusabit, menuad, menuslug, menuurl, menusira, menudil, menubanner, menusite, menupanel, menupanelmenu) VALUES (:idrand, :menuust, :menusabit, :menuad, :menuslug, :menuurl, :menusira, :menudil, :menubanner, :menusite, :menupanel, :menupanelmenu) ON DUPLICATE KEY UPDATE idrand = VALUES(idrand), menuust = VALUES(menuust), menusabit = VALUES(menusabit), menuad = VALUES(menuad), menuslug = VALUE(menuslug), menuurl = VALUES(menuurl), menusira = VALUES(menusira), menudil = VALUES(menudil), menubanner = VALUES(menubanner), menusite = VALUES(menusite), menupanel = VALUES(menupanel), menupanelmenu = VALUES(menupanelmenu)"); $idrand = $_POST['idrand']; $menuust = isset($_POST['menuust']) ? $_POST['menuust'] : 0; $menusabit = $_POST['menusabit']; $menuurl = $_POST['menuurl']; $menusira = $_POST['menusira']; $menusite = $_POST['menusite']; $menupanel = $_POST['menupanel']; $menupanelmenu = $_POST['menupanelmenu']; $stmt->bindValue(':idrand', $idrand, PDO::PARAM_STR); $stmt->bindValue(':menuust', $menuust, PDO::PARAM_STR); $stmt->bindValue(':menusabit', $menusabit, PDO::PARAM_STR); $stmt->bindValue(':menubanner', $resimyol, PDO::PARAM_STR); $stmt->bindValue(':menuurl', $menuurl, PDO::PARAM_STR); $stmt->bindValue(':menusira', $menusira, PDO::PARAM_INT); $stmt->bindValue(':menusite', $menusite, PDO::PARAM_INT); $stmt->bindValue(':menupanel', $menupanel, PDO::PARAM_INT); $stmt->bindValue(':menupanelmenu', $menupanelmenu, PDO::PARAM_INT); foreach ($menuAdlari as $menuAdi) { $stmt->bindValue(':menuad', $menuAdi['menuAdiDil'], PDO::PARAM_STR); $stmt->bindValue(':menuslug', $menuAdi['menuSlug'], PDO::PARAM_STR); $stmt->bindValue(':menudil', $menuAdi['menudil'], PDO::PARAM_STR); // execute the statement for each iteration of the loop $stmt->execute(); } - 30-04-2023, 00:09:09
$menuAdlari = array(); $dilsor = $db->query("SELECT * FROM dil"); $dilcek = $dilsor->fetchAll(PDO::FETCH_ASSOC); foreach ($dilcek as $dil) { $dilKisa = $dil['dil_kisa']; $menuAdiDil = $_POST['menuad' . $dilKisa]; $menudil = $_POST['menudil' . $dilKisa]; $menuSlug = seo($menuAdiDil); $menuAdlari[] = array( 'menuAdiDil' => $menuAdiDil, 'menuSlug' => $menuSlug, 'menudil' => $menudil ); } foreach ($menuAdlari as $menuAdi) { $stmt = $db->prepare("INSERT INTO menu (idrand, menuust, menusabit, menuad, menuslug, menuurl, menusira, menudil, menubanner, menusite, menupanel, menupanelmenu) VALUES (:idrand, :menuust, :menusabit, :menuad, :menuslug, :menuurl, :menusira, :menudil, :menubanner, :menusite, :menupanel, :menupanelmenu) ON DUPLICATE KEY UPDATE menudil = :menudil "); $stmt->bindValue(':idrand', $_POST['idrand'], PDO::PARAM_STR); $stmt->bindValue(':menuust', (isset($_POST['menuust']) ? $_POST['menuust'] : 0), PDO::PARAM_STR); $stmt->bindValue(':menusabit', $_POST['menusabit'], PDO::PARAM_STR); $stmt->bindValue(':menubanner', $menubanner, PDO::PARAM_STR); //menubanner degiskeninin tanimlamasi eksik $stmt->bindValue(':menuurl', $_POST['menuurl'], PDO::PARAM_STR); $stmt->bindValue(':menusira', $_POST['menusira'], PDO::PARAM_INT); $stmt->bindValue(':menusite', $_POST['menusite'], PDO::PARAM_INT); $stmt->bindValue(':menupanel', $_POST['menupanel'], PDO::PARAM_INT); $stmt->bindValue(':menupanelmenu', $_POST['menupanelmenu'], PDO::PARAM_INT); $stmt->bindValue(':menuad', $menuAdi['menuAdiDil'], PDO::PARAM_STR); $stmt->bindValue(':menuslug', $menuAdi['menuSlug'], PDO::PARAM_STR); $stmt->bindValue(':menudil', $menuAdi['menudil'], PDO::PARAM_STR); $stmt->execute(); }doğru kod sıralaması yukarıdaki şekilde, guncellenmesi gereken veriler sizin tercihinize kalmıştır,
daha öncede yazmıştım, dökümantasyon linkini de vermiştim. bu yazacaklarımın hepsi aslında o dökümantasyonda da yazıyor. size neyin nasıl yapılacağını dökümantasyonlar verir. dökümantasyonu okuyup çözemiyorsanız, o durumla ilgili daha başka veya geride kalan bir problemler vardır. neyse biraz daha on duplicate key update olayını açıklmaya çalışayım.
on duplicate update in çalışması için en az bir tane uniq indexi olan sutun(column) olmak zorunda, (kullanım amacına göre birden fazla sutunda aynı uniq indexe baglanabilir )
uniq sutun demek veri degeri tablo icinde sadece bir kere olabilir, benzersiz demektir.
çok basit bir çalışma mantığı vardır; uniq veri tekrarlanamaz kuralından yola çıkarak çalışır. tablonuzda hangi veriler ne şekilde olur bilmiyorum, kullandığım veri değerleri sadece örnektir.
örneğin tablodaki bir sırada(row) idrank degeri 5 ise baska bir siradaki(row) idrank degeri 5 olamaz. daha once idrank 5 olan veri tabloda bulunduğu için tekrar idrank 5 eklenemez ve uniq olmayan baska sutunlarda degerleri yukarıdaki sekilde guncelleyebilirsiniz.
kolaylıklar dilerim