v2.5.2
Giriş yap

Php çoklu veri kaydında array olarak kaydetme problemi

yazilimyolcusu
615 defa görüntülendi

Merhabalar. Şu kodlarda ufak bir problem var. Aşağıdaki kodlar ile çoklu veri kaydı yapmak istediğimde aşağıdaki resimde olduğu gibi kayıt yapıyor. Verileri kayıt edemiyorum, doğru bir şekilde. İki ürünü kayıt edebiliyorum ama "array[0]" gibi kayıt yapıyor. Resme bakabilirsiniz.

<?php
if (isset($_POST['formbir'])) {
    $aliciadisoyadi   = $_POST['aliciadisoyadi'];
    $alicifirma       = $_POST['alicifirma'];
    $Sehir            = $_POST['Sehir'];
    $aliciilce        = $_POST['aliciilce'];
    $alicieposta      = $_POST['alicieposta'];
    $siparisnotlari   = $_POST['siparisnotlari'];
    $urununstokkodu   = $_POST['urununstokkodu'];
    $urununstoksayisi = $_POST['urununstoksayisi'];
    $sorgulistele = $db->query("SELECT * FROM sepeteeklenenurunler");
  
  if($sorgulistele) {
    $say = $sorgulistele->rowCount();
    if($say > 0) {

      $sayi = 0;
      while($sayi < $say) {

    $siparisitamamla = $db->query("INSERT INTO sepetonaylanan 
    (sepetonaylanan_adisoyadi, sepetonaylanan_firmaadi, sepetonaylanan_sehiradi,
      sepetonaylanan_ilcesemt, sepetonaylanan_eposta,
      sepetonaylanan_siparisnotlari, sepetonaylanan_urun_stokkodu,
      sepetonaylanan_urun_stoksayisi) 
      VALUES ('$_POST[aliciadisoyadi][$sayi]',
      '$_POST[alicifirma][$sayi]', '$_POST[Sehir][$sayi]', '$_POST[aliciilce][$sayi]', 
      '$_POST[alicieposta][$sayi]', 
      '$_POST[siparisnotlari][$sayi]', '$_POST[urununstokkodu][$sayi]', 
      '$_POST[urununstoksayisi][$sayi]')");
      $sayi++;
      }
      if($siparisitamamla) {
        echo "tamam";
      } else {
        echo "olmadı";
      }
    }
    }
  }
  
  ?>

https://resimyukle.org/i/c2j15

Cevap yaz
Cevaplar (5)
coder
908 gün önce

Tekrar Merhaba.

Cevabından şunu anladım. Umarım doğru anlamışımdır.
Stok kodu farklıysa bu ürünler ayrı ayrı satırlara kaydedilsin ancak sipariş veren kişi aynı ve temel bilgileri aynı.

Eğer istediğin buysa aşağıdaki kodu hazırladım.

Not:

  • Kodda eğer bir ürün seçilmişse bir ürün kaydediyor. Daha fazla seçiliyse seçli olanlar kaydediliyor.
  • Şehir isimleri Sayı olarak kaydediliyor kendine göre düzenlersin.
  • Soruna gelecek olursak bence urunler, uyeler ve uye_siparisleri diye bir tablo olmalı. uye_siparisler tablosunda üye_id'si ve üye'nin sipariş ettiği ürün_id'si tutulmalı. Mysql sorgusunda Inner Joın kullanarak üyenin sipariş ettiği ürünlere daha kolay ulaşabilirsin diye düşünüyorum. Bu konuda tecrübeli arkadaşlar daha fazla yardımcı olabilir.

kablosuzkedi'nin Youtube kanalında "Alışveriş Sepeti" ile ilgili bir eğitim serisi var. Bakmak isterseniz:
kablosuzkedi - PHP ile Alışveriş Sepeti Yapımı

index.php

// Bağlantı dosyanızı include etmeyi unutmayın.

<form action="tamamlanansiparisler.php" method="POST">
    
    <div class="row d-flex justify-content-center  pt-5 mb-5">

        <?php 
            $sepeturunlerigoster = $db->query("SELECT * FROM sepeteeklenenurunler");
            while ($urunekle = $sepeturunlerigoster->fetch()) {
        ?> 

        <div class="col-lg-3">
            <div class="card box-shadow mb-4">
                <img class="card-img-top img-thumbnail border-white" src="assets/images/resim.jpg">
                <div class="card-body">
                    <h5 class="card-title display-4" style="font-size: 24px">
                        <b><?php echo $urunekle["urun_adi"]; ?></b>
                    </h5>
                    <p class="card-text border-bottom text-muted pb-3">
                        Stok Sayısı : <?php echo $urunekle["urun_stoksayisi"]; ?>
                    </p>
                    <div class="d-flex justify-content-between align-items-center">
                        <small class="text-muted">
                            Stok Kodu : <?php echo $urunekle["urun_stokkodu"]; ?>
                        </small>
                        <div class="form-group form-check">
                            <input type="checkbox" class="form-check-input" name="urununstokkodu[]" value="<?php echo $urunekle['urun_stokkodu']."|".$urunekle["urun_stoksayisi"]; ?>" checked>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <?php } ?>
          
        <div class="col">
            <div class="card box-shadow mb-4">
                <div class="card-body">
                    <div class="form-group">
                        <label>Alıcı Adı Soyadı</label>
                        <input type="text" class="form-control" name="aliciadisoyadi">
                    </div>
                    <div class="form-group">
                        <label>E-posta Adresiniz</label>
                        <input type="text" class="form-control" name="alicieposta">
                    </div>
                    <div class="form-group">
                        <label>Firma Adı</label>
                        <input type="text" class="form-control" name="alicifirma">
                    </div>
                    <div class="form-group">
                    <label>Şehir</label>
                        <select class="form-control" name="sehir">
                            <option value="0">- Şehir Seçiniz -</option>
                            <option value="1">Adana</option>
                            <option value="2">Adıyaman</option>
                            <option value="3">Afyonkarahisar</option>
                            <option value="4">Ağrı</option>
                            <option value="5">Amasya</option>
                        </select>
                    </div>
                    <div class="form-group">
                        <label>İlçe / Semt</label>
                        <input type="text" class="form-control" name="aliciilce">
                    </div>
                    <div class="form-group">
                        <label>Sipariş Notunuz</label>
                        <textarea class="form-control" rows="3" name="siparisnotlari"></textarea>
                    </div>
                    <button type="submit" class="btn btn-info w-100 mt-1">Siparişi Tamamla</button>
                </div>
            </div>
        </div>

    </div>
    
</form>

tamamlanansiparisler.php

<?php
// Bağlantı dosyanızı include etmeyi unutmayın.

if ($_POST){

    foreach($_POST["urununstokkodu"] as $stokkodu):

        // urununstokkodu inputuyla hem stok kodunu hem de stok sayısını alıyorum. | işaretiyle form kısmında birleştirdim . 
    
        //Burada | işaretiyle parçalıyorum.
        $parcala = explode("|", $stokkodu);

        $stokKodu = $parcala[0];
        $stokSayisi = $parcala[1];

        $siparisitamamla = $db->prepare("INSERT INTO sepetonaylanan SET 
            sepetonaylanan_adisoyadi		= :adisoyadi,
            sepetonaylanan_firmaadi			= :firmaadi,
            sepetonaylanan_eposta 			= :eposta,
            sepetonaylanan_sehiradi			= :sehiradi,
            sepetonaylanan_ilcesemt			= :ilcesemt,
            sepetonaylanan_urun_stokkodu 	= :stokkodu,
            sepetonaylanan_urun_stoksayisi 	= :stoksayisi,
            sepetonaylanan_siparisnotlari 	= :siparisnotlari
        ");

        $siparisitamamla->execute([ 
            ":adisoyadi"	  => $_POST['aliciadisoyadi'],
            ":firmaadi"		  => $_POST['alicifirma'],
            ":eposta"		  => $_POST['alicieposta'],
            ":sehiradi"		  => $_POST['sehir'],
            ":ilcesemt"		  => $_POST['aliciilce'],
            ":stokkodu"       => $stokKodu,
            ":stoksayisi"	  => $stokSayisi,
            ":siparisnotlari" => $_POST['siparisnotlari']
        ]);

    endforeach;

    if($siparisitamamla){
        echo "İşlem Başarılı";
    }else{
        echo "İşlem Başarısız";
    }
}
yazilimyolcusu
909 gün önce

Kodlar çalışıyor ama tek satır kayıt yapıyor. Benim istediğimin örneğini elle hazırladım resmi aşağıda. yani tek post ile iki satır ürün; sepette üç ürün varsa üç satır ürün kayıt edecek. Yani resimde, müşteriye ait olan: eposta, şehir, ilçe vs. bilgiler aynı ama ürün özellikleri farklı. İlk satırdaki ürünün stok kodu "7"; ikinci ürünün stok kodu 8 farkettiyseniz. Eğer 5 ürün varsa sepetimde, ben form'u post ettiğimde o 5 ürün 5 satırda kayıt olacak. Daha doğrusu ben size şöyle bir akıl danışayım. Şimdi ben ürünleri tek tek kayıt etmezsem, müşterinin ne ürün aldığını, özelliklerini, hangi kullanıcının ne aldığını nasıl kayıt edebilirim. Aklıma bu geliyor. Acaba form kısmında mı bir hata yapıyorum. Kodları aşağıya koyuyorum.
https://www.hizliresim.com/hmxhavj

<form action="tamamlanansiparisler.php" method="POST">

<div class="alici-kisiselbilgiler-div">


<div class="alici-adi-soyadi-yazisi">
Adı - Soyadı
</div>
<div class="alici-adi-soyadi-input">
<input type="text" name="aliciadisoyadi[]" />
</div>


<div class="firma-adi-yazisi">
Firma
</div>
<div class="firma-adi-input">
<input type="text" name="alicifirma[]" />
</div>


<div class="sehir-adi-yazisi">
Şehir
</div>
<div class="sehir-adi-input">
<select name="sehir[]">
<option value="0">Şehir Seçiniz</option>
<option value="1">Adana</option>
<option value="2">Adıyaman</option>
<option value="3">Afyonkarahisar</option>
<option value="4">Ağrı</option>
<option value="5">Amasya</option>
<option value="6">Ankara</option>
<option value="7">Antalya</option>
<option value="8">Artvin</option>
<option value="9">Aydın</option>
<option value="10">Balıkesir</option>
<option value="11">Bilecik</option>
<option value="12">Bingöl</option>
<option value="13">Bitlis</option>
<option value="14">Bolu</option>
<option value="15">Burdur</option>
<option value="16">Bursa</option>
<option value="17">Çanakkale</option>
<option value="18">Çankırı</option>
<option value="19">Çorum</option>
<option value="20">Denizli</option>
<option value="21">Diyarbakır</option>
<option value="22">Edirne</option>
<option value="23">Elazığ</option>
<option value="24">Erzincan</option>
<option value="25">Erzurum</option>
<option value="26">Eskişehir</option>
<option value="27">Gaziantep</option>
<option value="28">Giresun</option>
<option value="29">Gümüşhane</option>
<option value="30">Hakkâri</option>
<option value="31">Hatay</option>
<option value="32">Isparta</option>
<option value="33">Mersin</option>
<option value="34">İstanbul</option>
<option value="35">İzmir</option>
<option value="36">Kars</option>
<option value="37">Kastamonu</option>
<option value="38">Kayseri</option>
<option value="39">Kırklareli</option>
<option value="40">Kırşehir</option>
<option value="41">Kocaeli</option>
<option value="42">Konya</option>
<option value="43">Kütahya</option>
<option value="44">Malatya</option>
<option value="45">Manisa</option>
<option value="46">Kahramanmaraş</option>
<option value="47">Mardin</option>
<option value="48">Muğla</option>
<option value="49">Muş</option>
<option value="50">Nevşehir</option>
<option value="51">Niğde</option>
<option value="52">Ordu</option>
<option value="53">Rize</option>
<option value="54">Sakarya</option>
<option value="55">Samsun</option>
<option value="56">Siirt</option>
<option value="57">Sinop</option>
<option value="58">Sivas</option>
<option value="59">Tekirdağ</option>
<option value="60">Tokat</option>
<option value="61">Trabzon</option>
<option value="62">Tunceli</option>
<option value="63">Şanlıurfa</option>
<option value="64">Uşak</option>
<option value="65">Van</option>
<option value="66">Yozgat</option>
<option value="67">Zonguldak</option>
<option value="68">Aksaray</option>
<option value="69">Bayburt</option>
<option value="70">Karaman</option>
<option value="71">Kırıkkale</option>
<option value="72">Batman</option>
<option value="73">Şırnak</option>
<option value="74">Bartın</option>
<option value="75">Ardahan</option>
<option value="76">Iğdır</option>
<option value="77">Yalova</option>
<option value="78">Karabük</option>
<option value="79">Kilis</option>
<option value="80">Osmaniye</option>
<option value="81">Düzce</option>
</select>
</div>


<div class="ilce-adi-yazisi">
İlçe / Semt: *
</div>
<div class="ilce-adi-input">
<input type="text" name="aliciilce[]" />
</div>


<div class="eposta-yazisi">
E-Posta Adresi: *
</div>
<div class="eposta-input">
<input type="text" name="alicieposta[]" />
</div>


<div class="siparisnotlari-yazisi">
Şiparişiniz İle İlgili Not Bırakabilirsiniz
</div>
<div class="siparisnotlari-textarea">
<textarea name="siparisnotlari[]"></textarea>
</div>


<?php
$sepeturunlerigoster = $db->query("SELECT * FROM sepeteeklenenurunler");
while ($urunekle = $sepeturunlerigoster->fetch()) {
?>

<div class="sepetionayla-fiyatgosterimi-div">

<div class="sepetimurunleri-sayfasi-stokkodu">Stok Kodu:
<?php echo $urunekle['urun_stokkodu']; ?>
<input type="text" name="urununstokkodu[]" value="<?php echo $urunekle['urun_stokkodu']; ?>" />
</div>

<div class="sepetimurunleri-sayfasi-stoksayisi">Stok Adedi:
<?php echo $urunekle['urun_stoksayisi']; ?>
<input type="text" name="urununstoksayisi[]" value="<?php echo $urunekle['urun_stoksayisi']; ?>" />
</div>

</div>

<?php } ?>


</div>

<div class="siparisitamamla">
<input type="submit" value="Siparişi Tamamla" />
</div>

</form>
coder
909 gün önce

Merhaba.
Aşağıdaki kod bende istediğiniz gibi çalışıyor.

Not: Aşağıdaki tablo sütun isimlerini burada taşma yaptığından dolayı kısa yazdım.

tablo

id (int)adisoyadi (varchar)eposta (varchar)firmaadi (varchar)sehiradi (varchar)ilcesemt (varchar)stokkodu (varchar)urun_stoksayisi (varchar)siparisnotlari (varchar)
1Ahmet[email protected]A Firması A.ŞİstanbulFatih520Ürün Açıklamasıdır
2Ahmet[email protected]A Firması A.ŞİstanbulFatih930Ürün Açıklamasıdır

index.php

<form action="sipariskaydet.php" method="POST">

	<input type="text" name="aliciadisoyadi[]" placeholder="Alıcı Adı Soyadı">
	<input type="text" name="alicifirma[]" placeholder="Alıcı Firma">
	<input type="text" name="alicieposta[]" placeholder="Alıcı Eposta">
	<input type="text" name="sehir[]" placeholder="Şehir">
	<input type="text" name="aliciilce[]" placeholder="Alıcı İlçe">
	<input type="text" name="urununstokkodu[]" placeholder="Ürün Stok Kodu">
	<input type="text" name="urununstoksayisi[]" placeholder="Ürün Stok Sayısı">
	<input type="text" name="siparisnotlari[]" placeholder="Sipariş Notları"><br><br>

	<input type="text" name="aliciadisoyadi[]" placeholder="Alıcı Adı Soyadı">
	<input type="text" name="alicifirma[]" placeholder="Alıcı Firma">
	<input type="text" name="alicieposta[]" placeholder="Alıcı Eposta">
	<input type="text" name="sehir[]" placeholder="Şehir">
	<input type="text" name="aliciilce[]" placeholder="Alıcı İlçe">
	<input type="text" name="urununstokkodu[]" placeholder="Ürün Stok Kodu">
	<input type="text" name="urununstoksayisi[]" placeholder="Ürün Stok Sayısı">
	<input type="text" name="siparisnotlari[]" placeholder="Sipariş Notları">

	<input type="submit" value="kaydet">

</form>

sipariskaydet.php

if ($_POST){

	$sorgulistele = $db->query("SELECT * FROM sepeteeklenenurunler");

	if($sorgulistele){
		$say = $sorgulistele->rowCount();
		
		if($say > 0) {
			
			$sayi = 0;
			
			while($sayi < $say) {
				$siparisitamamla = $db->prepare('INSERT INTO sepetonaylanan SET 
					sepetonaylanan_adisoyadi		= :adisoyadi,
					sepetonaylanan_firmaadi			= :firmaadi,
					sepetonaylanan_eposta 			= :eposta,
					sepetonaylanan_sehiradi			= :sehiradi,
					sepetonaylanan_ilcesemt			= :ilcesemt,
					sepetonaylanan_urun_stokkodu 	= :stokkodu,
					sepetonaylanan_urun_stoksayisi 	= :stoksayisi,
					sepetonaylanan_siparisnotlari 	= :siparisnotlari'
					
				);
				  
				$siparisitamamla->execute([
					":adisoyadi"	  => $_POST['aliciadisoyadi'][$sayi],
					":firmaadi"		  => $_POST['alicifirma'][$sayi],
					":eposta"		  => $_POST['alicieposta'][$sayi],
					":sehiradi"		  => $_POST['sehir'][$sayi],
					":ilcesemt"		  => $_POST['aliciilce'][$sayi],
					":stokkodu"		  => $_POST['urununstokkodu'][$sayi],
					":stoksayisi"	  => $_POST['urununstoksayisi'][$sayi],
					":siparisnotlari" => $_POST['siparisnotlari'][$sayi]
				]);
				  
				$sayi++;
			}

			if($siparisitamamla){
				echo "İşlem Başarılı";
			}else{
				echo "İşlem Başarısız";
			}
		}
	}
}
yazilimyolcusu
910 gün önce

Kayıt ekleniyor. Stokkodu alanı ve stokkodusayısı "1" olarak ekleniyor. Yalnız eklemek istediğim ürün 1'den fazla yani 2 tane ürünü aynı anda kaydetmek istiyorum. yani şu şekilde olması gerekli. Kaydet butonuna bastığımda, sepetteki bu iki ürün kayıt edilecek.

İsim Firma Şehir İlçe E-Posta Stokkodu - Stok Sayısı

Ahmet - Ahmet a.ş - İstanbul - Falanca İlçe - ahmetinpostası@ahmetinpostasi.coom - 5 - 20
Ahmet - Ahmet a.ş - İstanbul - Falanca İlçe - ahmetinpostası@ahmetinpostasi.coom - 9 - 30

Bir de şöyle bir hata alıyorum 7-8 satırdan.

PHP Notice: Undefined offset: 1 in

coder
910 gün önce

Merhaba.

Şu şekilde deneyin.
Eksik olanları kendiniz ekleyin.

<?php

if (isset($_POST)){

	$sorgulistele = $db->query("SELECT * FROM sepeteeklenenurunler");

	if($sorgulistele){
		$say = $sorgulistele->rowCount();
		
		if($say > 0) {
			
			$sayi = 0;
			
			while($sayi < $say) {
				$siparisitamamla = $db->prepare('INSERT INTO sepetonaylanan SET 
					sepetonaylanan_adisoyadi = :adisoyadi,
					sepetonaylanan_firmaadi	 = :firmaadi,
					sepetonaylanan_sehiradi	 = :sehiradi,
					sepetonaylanan_ilcesemt	 = :ilcesemt'
				);
				  
				$siparisitamamla->execute([
					":adisoyadi" => $_POST['aliciadisoyadi'][$sayi],
					":firmaadi"	 => $_POST['alicifirma'][$sayi],
					":sehiradi"	 => $_POST['sehir'][$sayi],
					":ilcesemt"	 => $_POST['aliciilce'][$sayi]
				]);
				  
				$sayi++;
			}

			if($siparisitamamla){
				echo "İşlem Başarılı";
			}else{
				echo "İşlem Başarısız";
			}
		}
	}
}

?>