İç içe for / foreach kullanarak mysql´e çoklu kayıt nasıl yapılır?.
Arkadaşlar merhaba. Sorunumu kısaca anlatmaya çalışayım.
3 Sayfamız var;
1 ve 2. sayfada müşteriler ve ürünler checkbox ile seçiliyor.
1- Müşteri listesi (musteri_id)
2- Ürün listesi (urun_id, urun_fiyat, urun_kdv) ürün fiyatı ve kdv oranını biz belirliyoruz.
3- ilk 2 sayfadan gelen verileri mysql´e kayıt eden sayfa
Mesela ilk sayfadan 1 müşteri, ikinci sayfadan 1 ürün seçip ürün fiyatı ve kdv oranını kendimiz belirliyoruz. 3. sayfada seçilen her müşteri için db´e ürün bilgileriyle kayıt edilecek.
Şimdi sorun seçilen müşteri ve ürünlerin sayısı artınca oluyor.
Müşteri 1´in id´i > 1
Müşteri 2´in id´i > 2
ürün 1´in id´i > 1
ürün 1´in fiyatı > 10 TL
ürün 1´in kdvsi > 8
ürün 2´in id´i > 56
ürün 2´in fiyatı > 15 TL
ürün 2´in kdvsi > 18
ürün 3´ün id´i > 16
ürün 3´ün fiyatı > 190 TL
ürün 3´ün kdvsi > 8
Şimdi 2 müşteri için 3 ürün ve bilgisi mevcut. Her ürün için müşteri id´ini de tutacak şekilde nasıl kayıt yapabilirim. Müşteri ve ürün sayısı değişebilir. 3 gündür deli oldum. Bu sorunu çözebilecek arkadaşa şimdiden teşekkür ederim :D
ürün
Fatih naptın ya. o nasıl uzun bir kodlamadır
üç tabloda çözülür:
1- Ürün tablosu. ID, fiyat , kdv
2- Müşteriler: ID , isim vs.
3- Alışveriş sepeti , ID , ürün_ID, müşter_iID, fiyat, zaman vs.
Esas işlem alışveriş sepeti tablosunda dönecek. kafanda kurduğun yapıyı bilemediğim için böyle bir sistem düşündüm.
Tablo
:D hocam yazdığım sistemin bu bölümü beni öyle bunaltı ki içimi olduğu gibi döktüm buraya :))) biraz karışık oldu sanırım. :)))
Şuan bu bölüm için yaptığım müşteri sayfasından müşteri id´lerini alıp ürün sayfasına taşımak, burdan da müşteri id´leriyle beraber ürün´ü(id,fiyat vs.) seçip kayıt bölümüne taşımak oldu. Buraya kadar sorun yok. Şimdilik elimde çalışan bir sistem olsun tek 3-5 sayfa olsun valla mesele değil :))
Tek sorun kayıt etmek. Sanırım burda matris konusuna baya bir hakimiyet gerekiyor. Aslında implode ile tek satırda kayıt edilip daha sonra explode vs. ile işlenebilir. Ama şimdilik bunu elimden geldiğince basit geçmem gerek.
Sayfalardan gelen veriler şöyle olsun.
musteriler.php
Müşteri 1 id´i > 1
Müşteri 2´id´i > 2
urunler.php
ürün 1 id´i > 8 fiyatı > 10 TL kdvsi > 8
ürün 2 id´i > 13 fiyatı > 34 TL kdvsi > 18
ürün 3 id´i > 3 fiyatı > 14 TL kdvsi > 18
Kafamda ki verilerin sql´de görünmesi gereken şekli şu.(tabi ki sql tablosunda kayit_id otomatik artacak)
Mysql tablomuz şöyle olsun
kayit_id (her kayıt için otomatik artacak)
musteri_id
urun_id
urun_fiyat
urun_kdv
kayit_id(1) musteri_id (1) urun_id (8) urun_fiyat (10 TL) urun_kdv (8)
kayit_id(2) musteri_id (1) urun_id (13) urun_fiyat (34 TL) urun_kdv (18)
kayit_id(3) musteri_id (1) urun_id (3) urun_fiyat (114 TL) urun_kdv (18)
kayit_id(4) musteri_id (2) urun_id (8) urun_fiyat (10 TL) urun_kdv (8)
kayit_id(5) musteri_id (2) urun_id (13) urun_fiyat (34 TL) urun_kdv (18)
kayit_id(6) musteri_id (2) urun_id (3) urun_fiyat (114 TL) urun_kdv (18)
Kayıt işini mecbur for veya foreach´le yapacaz. Benim burda yapamadığım iç içe for döngüsünü kurup insert edememek.İnşallah karışık olmamıştır hocam :D
tablo
ben yine anlamadım. yukarda verdiğim gibi üç tablo yaptın mı ?
yoksa iki tabloda iş ibitirmeye mi uğraşıyorsun.
Yok hocam ben anlatamadım :)
Sql tablomuz tek. Manuel ekleme yaptım. Kayıttan sonra şöyle görünmeli.
Mesela burdan veriyi musteri_id´e göre çekip sadece o id´e sahip müşteriye gösterecem. Kaydı resimdeki gibi yapabilirsem veriyi kolay çekerim orda sorun yok. Tek sorun kayıt.
kayıt
Tek tabloyla yapman imkansız. ürünleri nerde tutacaksın. seninki pratik olmaz. en azından sitede ürünleri listelerken zorlanırsın.
en kolay iki tablo: müşteri ürün satın aldığı sırada bir düğmeye tıklar. tıklanan ürünün özellikleri ürün tablosundan alınıp sepet tablosuna kaydedilir.senin yukarıda veridğin de sepet tablosu olur.
sanırım senin müşteriler aynı anda birkaç ürünü birden ekliyor öyle mi ?
Evet hocam aynı anda birkaç ürün ekleyecek.
dizi
$musteri_id = array(1,2);
$urun_id = array(44,77,99);
$fiyat = array(1200,800,55);
$kdv = array(8,18,8);
?>
Hocam burdaki dizilerin çıktısını şöyle alabilirsem kayıt imkanı olur sanırım.
Çıktı;
1 44 1200 8
1 77 800 18
1 99 55 8
2 44 1200 8
2 77 800 18
2 99 55 8
Mesela ilk 2 diziyi şöyle yazdırdım.
$musteri_id = array(1,2);
$urun_id = array(44,77,99);
$fiyat = array(1200,800,55);
$kdv = array(8,18,8);
foreach($musteri_id as $yaz1){
foreach($urun_id as $yaz2){
echo $yaz1." ".$yaz2."<br>";
}
}
?>
Çıktı;
1 44
1 77
1 99
2 44
2 77
2 99
sql
dizilerle o şekilde halledersin ama veritabanı olmadan yüzlerce ürünü kontrol edemezsin. iç içe SQL döngüsü kurarak halledilir. şimdi oradaki üç ürün yerine 100 ürün olduğunu düşün. içinden çıkılmaz olur. veritabanı şişer.
yukarıda senin yazdığın çalışır. eğer ürünler için veritabanı kullanırsan aşağıdaki gibi olabilir:
$bil=mysql_query("SELECT * FROM urunler WHERE id IN ($hangisi);");
if($bil)
{
while ($urun = mysql_fetch_assoc($bil))
{
foreach($musteri_id as $m)
{
mysql_query("INSERT INTO sepet (`musteri_id`,`urun_id`,`urun_fiyat`,`urun_kdv`) VALUES(´$m´,´$urun[id]´,´$urun[fiyat]´,´$urun[kdv]´)");
}
}
}
kod
Hocam kod için teşekkürler. :)
Şimdi biraz kafam karıştı :D
mysql_query("INSERT INTO sepet (`musteri_id`,`urun_id`,`urun_fiyat`,`urun_kdv`) VALUES(´$m´,´$urun[id]´,´$urun[fiyat]´,´$urun[kdv]´)");
Burdaki $urun[id]´,´$urun[fiyat]´,´$urun[kdv] değerleri $bil sorgusundan mı geldi? Şöyle birşey var. Fiyat ve kdv oranları db´de tutulmuyor. Müşteri burda iki değeride kendisi belirleyecek.
en baştaki $hangisi=implode(´,´,$urun_id); gibi fiyat ve kdv oranlarınıda alıp kayıt edebilir miyiz?