v2.5.2
Giriş yap

Çoklu input insert etme

rephp7
462 defa görüntülendi
$icerik="";
    for ($i=1; $i < 20; $i++) {         
      $y=$db->filter("adi".$i);
         if (!empty($y)) {
               
    $adi[$i]= $db->filter("adi".$i);
    $soyadi[$i]= $db->filter("soyadi".$i);
    $isim[$i]= $adi[$i]." ".$soyadi[$i];

    $yazar_sira[$i]= $db->filter("yazar_sira".$i);
    
  }else{
    break;
  }
    }

    $m_yazar_ekle="";
    for ($i=1; $i < 20; $i++) {  
      if (!empty($adi[$i])) {  
    $m_yazar_ekle = $db->SorguCalistir(

      "INSERT INTO yazarlar",
      "SET yazar=?,adi=?,soyadi=?,yazar_sira=?",
      array($isim[$i],$adi[$i],$soyadi[$i],$yazar_sira[$i])
    );
  }else{
    break;
  }
}

HTML Yapımda şu şekilde

...
<input type="text" class="form-control" placeholder="Yazarın adı…" name="adi1">
<input type="text" class="form-control" placeholder="Yazarın soyadı…" name="soyadi1">
...

<button type="button" class="btn btn-info btn-circle" style="float:right;" onclick="yeniekle()">
    <i class="fa fa-plus"></i>
</button>

inputları ekleyeceğim yazar sayısına göre javascript ile çoğaltıyorum.

function yeniekle() {
  let writersLength = $(".writers").length;

  let icerik = `
  
<input type="text" class="form-control " placeholder=" Yazarın adı…" name="adi${writersLength + 1}">
...

Sonuç hata ile sonuçlanıyor, insert etmiyor.

Hatam nerede çözemedim?

Cevap yaz
Cevaplar (10)
emmir2
787 gün önce
<?php

try {
     $db = new PDO("mysql:host=localhost;dbname=varyant;charset=utf8", "root","");
} catch ( PDOException $e ){
     print $e->getMessage();
}

?>

<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
</head>
<body>

<?php 
if ($_POST) {
    
        $ii = 0;
            if(isset($_POST['name'])){
                foreach ($_POST['name'] as $as) {
                    $islem = $db->prepare("INSERT INTO yazar SET yazar_ad = ?, yazar_soyad = ?");
                    $islem = $islem->execute(array($_POST['name'][$ii],$_POST['surname'][$ii]));
                    $ii++;
                }
            }

    }
?>
<div class="container">
    <form action="" method="POST">
        <div class="block">
            <div class="form-group nameBlock">
                <label for="name1">1. Yazarın adı</label>
                <input type="text" class="form-control" id="name1" placeholder="1. Yazarın adı…" name="name[]">
            </div>
            <div class="form-group surnameBlock">
                <label for="surname1">1. Yazarın soyadı</label>
                <input type="text" class="form-control" id="surname1" placeholder="1. Yazarın soyadı…" name="surname[]">
            </div>
        </div>

        <input type="submit" class="btn btn-success">
    </form>
    <button type="button" class="btn btn-info btn-circle" style="float:right;" onclick="yeniekle()">
        <i class="fa fa-plus"></i>
    </button>
</div>




<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>

function yeniekle() {
    let writersLength = $(".nameBlock").length,
        newWriter = writersLength + 1
    $(".block").append(`
    <div class="form-group nameBlock">
            <label for="name${newWriter}">${newWriter}. Yazarın adı</label>
            <input type="text" class="form-control" id="name${newWriter}" placeholder="${newWriter}. Yazarın adı…" name="name[]">
        </div>
        <div class="form-group surnameBlock">
            <label for="surname${newWriter}">${newWriter}. Yazarın soyadı</label>
            <input type="text" class="form-control" id="surname${newWriter}" placeholder="${newWriter}. Yazarın soyadı…" name="surname[]">
        </div>`)
}

</script>
</body>
</html>
emmir2
782 gün önce

Hocam paylaştığım kodlar sorunsuz kayıt yapıyor tekrar denedim bir sorun mu var diye yok


rephp7
783 gün önce

div çoğaltınca ekrana html içeriği basıyor ama çoğaltılan div deki inputları array içine almiyor.
print_r ($_Post["adi"]);
sonuç: array ([0]=>ali) yer alıyor.

rephp7
787 gün önce

 $adi = isset($_POST['adi']) ? $_POST['adi'] : "" ;
 $soyadi = isset($_POST['soyadi']) ? $_POST['soyadi'] : "" ;
 $yazar_sira = isset($_POST['yazar_sira']) ? $_POST['yazar_sira'] : "" ;
    
    foreach($adi as $key=>$value){
        $m_yazar_ekle = $db->SorguCalistir(
          "INSERT INTO yazarlar",
           "SET adi=?,soyadi=?,yazar_sira=?",
            array($adi[$key],$soyadi[$key],$yazar_sira[$key])
                );
       }

HTML Yapımda şu şekilde

...
<input type="text" class="form-control" placeholder="Yazarın adı…" name="adi[]">
<input type="text" class="form-control" placeholder="Yazarın soyadı…" name="soyadi[]">
...

<button type="button" class="btn btn-info btn-circle" style="float:right;" onclick="yeniekle()">
    <i class="fa fa-plus"></i>
</button>

inputları ekleyeceğim yazar sayısına göre javascript ile çoğaltıyorum.

function yeniekle() {
  let writersLength = $(".writers").length;

  let icerik = `
  
<input type="text" class="form-control " placeholder=" Yazarın adı…" name="adi[]">
...

@abdullahx son yorumuzdan yola çıkarak şöyle bir değişiklik yoluna gittim ama yine başarı elde edemedim.
0 numaralı indise istek atıyor ama array daki diğer indisleri görmüyor.

abdullahx
787 gün önce

Yine de aynı niteliğe sahip inputları çoğaltırken php tarafına dizi olarak gidecek şekilde çoğaltın. Ön yüzde 1. 2. diye kullanıcıya gösterin ama kod yapısında bu 1. 2. mantığını array elementlerinin sırası şeklinde yakalayın. Ajax kullanmanıza gerek yok. Yapmaya çalıştığınız pek makul gelmedi bana açıkçası.

rephp7
787 gün önce

@abdullahx hocam zamanınınız ve emeğiniz için teşekkürler.

yayın başlığı, kategorisi gibi inputların olduğu alanın yanında
yazar bilgilerini de aynı sayfadan detaylı olarak bir defadan göndermek adına ikinci bir yazar ve çoğaltılan yazar bilgileri inputlarım var.
hem yayınlar tablosuna hem de yazarlar tablosuna formdan seçili bilgileri gönderiyorum.
Mantığını çözmek adına basit bir kesiminin kodunu paylaştım. Kodun daha fazlasını paylaşamıyorum.
O yüzden ajax post ile çözmek benim için daha karışık hal alacak.

abdullahx
787 gün önce

Bu mantıkta yaparsan daha kolay olacaktır.

<!doctype html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
</head>
<body>

<div class="container">
    <form action="" id="form">
        <div class="block">
            <div class="form-group nameBlock">
                <label for="name1">1. Yazarın adı</label>
                <input type="text" class="form-control" id="name1" placeholder="1. Yazarın adı…" name="name[]">
            </div>
            <div class="form-group surnameBlock">
                <label for="surname1">1. Yazarın soyadı</label>
                <input type="text" class="form-control" id="surname1" placeholder="1. Yazarın soyadı…" name="surname[]">
            </div>
        </div>

        <input type="submit" class="btn btn-success">
    </form>
    <button type="button" class="btn btn-info btn-circle" style="float:right;" onclick="yeniekle()">
        <i class="fa fa-plus"></i>
    </button>
</div>




<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>

function yeniekle() {
    let writersLength = $(".nameBlock").length,
        newWriter = writersLength + 1
    $(".block").append(`
    <div class="form-group nameBlock">
            <label for="name${newWriter}">${newWriter}. Yazarın adı</label>
            <input type="text" class="form-control" id="name${newWriter}" placeholder="${newWriter}. Yazarın adı…" name="name[]">
        </div>
        <div class="form-group surnameBlock">
            <label for="surname${newWriter}">${newWriter}. Yazarın soyadı</label>
            <input type="text" class="form-control" id="surname${newWriter}" placeholder="${newWriter}. Yazarın soyadı…" name="surname[]">
        </div>`)
}

$("#form").on("submit", function (e) {
    e.preventDefault()
    $.ajax('ajax.php', {
        data: $(this).serialize(),
        method: "POST"
    }).done(response => {
        console.log(response)
    })
})

</script>
</body>
</html>

ajax.php

if ($_POST) {
print_r($_POST);
}
rephp7
788 gün önce

bu şekilde for loop 20 ye kadar input arıyor (adi20, soyadi20) hata döndürüyor tanımsızlar diye.
pdo da benzer bir örnek bulamadım. bu yukardakini de mysql ile yazılmış bir örnekten almıştım. Ama çalışmıor
mantığını da oturtamadım sanırım.

rephp7
789 gün önce

@emmir2, yok öylede olmadı. Script örneğinide konuya ekledim.

Sadece name alanında değil sanırım for döngümde de sıkıntı var. iyice kafam karıştı.

emmir2
789 gün önce

<input type="text" class="form-control" placeholder="Yazarın adı…" name="adi1[]">
<input type="text" class="form-control" placeholder="Yazarın soyadı…" name="soyadi1[]">

Şeklinde deneyin hocam