v2.5.2
Giriş yap

Diziyi Virgül İle Birleştirerek INSERT İşlemi

coder
685 defa görüntülendi

Merhaba.

Bir multiple select formu var. name'i mesajalan[] olan.
Ben bu formdan gelen değerleri virgül ile birleştirerek mesaj_alan_id sütununa yazdırmak istiyorum.

Ben implode ile denediğimde şu hatayı veriyor.
Data truncated for column 'mesaj_alan_id' at row 1

Bu konuda yardımcı olur musunuz?

<?php if($_POST):

    $mesajgonderen  = $_SESSION["uye_id"];
    $mesajalan      = $_POST["mesajalan"]; // Dizi olarak gelen bu veriyi mesaj_alan_id sütununa virgül ile birleştirerek yazdırmak istiyorum. Örneğin 1,2
    $mesajicerik    = $_POST["mesajicerik"];
    
    $alan = implode(",", $mesajalan);
    
    $mesaj = $db->prepare("INSERT INTO mesajlar SET mesaj_gonderen_id = :mesajgonderen, mesaj_alan_id = :mesajalan, mesaj_icerik = :mesajicerik");
    $mesaj->execute([
        ":mesajgonderen" => $mesajgonderen,
        ":mesajalan"     => $alan,
        ":mesajicerik"   => $mesajicerik
    ]);
    
    $hata = $mesaj->errorInfo();
    echo $hata[2];

else: ?>

    <form action="mesaj-gonder.php" method="post">
    	<div class="form-group">
    		<label for="mesajalan">Alıcı</label>
    		<select class="form-select form-control" name="mesajalan[]"  multiple aria-label="multiple select example">
    			<?php
    				$uyeler = $db->prepare("SELECT * FROM uyeler");
    				$uyeler->execute();
    
    				foreach ($uyeler->fetchAll(PDO::FETCH_ASSOC) as $uye):
    			?>
    				<option value="<?php echo $uye["uye_id"]; ?>"><?php echo $uye["uye_kullanici_adi"]; ?></option>
    			<?php endforeach; ?>
    		</select>
    	</div>
    	
    	<div class="form-group">
    		<label for="mesajicerik">Mesaj İçerik</label>
    		<textarea class="form-control" id="mesajicerik" name="mesajicerik" rows="3"></textarea>
    	</div>
    	<button type="submit" class="btn btn-info w-100 mt-1">Mesajı Gönder</button>
    </form>


<?php endif; ?>
justatakan
1432 gün önce

Aslında sorunun temel noktası aşağıda belirttiğim kod demetinde yer alıyor;

$mesaj = $db->prepare("INSERT INTO mesajlar SET mesaj_gonderen_id = :mesajgonderen, mesaj_alan_id = :mesajalan, mesaj_icerik = :mesajicerik");
$mesaj->execute([
        ":mesajgonderen" => $mesajgonderen,
        ":mesajalan"     => $alan,
        ":mesajicerik"   => $mesajicerik
    ]);

Eğer :icerik şeklinde bir tanımlama yapıyorsan sorgunda, sorgunu execute ederken dizide yer alan anahtarlarda : ifadesini kaldırman gerekiyor.

$mesaj = $db->prepare("INSERT INTO mesajlar SET mesaj_gonderen_id = :mesajgonderen, mesaj_alan_id = :mesajalan, mesaj_icerik = :mesajicerik");
$mesaj->execute([
        "mesajgonderen" => $mesajgonderen, // : işareti kaldırıldı
        "mesajalan"     => $alan, // : işareti kaldırıldı
        "mesajicerik"   => $mesajicerik // : işareti kaldırıldı
    ]);

Yada istersen : ifadesi yerine sorgunda ? kullanarak sıralı veri yönetimi de yapabilirsin.

$mesaj = $db->prepare("INSERT INTO mesajlar SET mesaj_gonderen_id = ?, mesaj_alan_id = ?, mesaj_icerik = ?");
// Sıralı sorgularda execute metodumuzda yer alan dizide herhangi bir anahtar girişine ihtiyaç duymayız. Dizimizde yer alan veriler sorgumuzda yer alan ? bölgelerine sırası ile eklenecektir
$mesaj->execute([ 
        $mesajgonderen, 
        $alan, 
        $mesajicerik 
    ]);

implode kullanımında bir problem göremedim, sadece 1, 2, 3 tarzında yapıcaksan virgüllerin sonunda yer alan boşluğu da implode fonksyonunda belirtmen gerekir.

$alan = implode(",", $mesajalan); // çıkış: 1,2,3
$alan = implode(", ", $mesajalan); // çıkış: 1, 2, 3

Sql sorgusunda INSERT INTO eğer SET ile birlikte kullanılıyorsa UPDATE sorgusu gibi sutun_adı = 'deger' şeklinde kullanılabilir, o kısımda da bir problem görüntüleyemedim.

Kodun son düzenlenmiş haline de aşağıda yer verdim;

<?php if($_POST):

    $mesajgonderen  = $_SESSION["uye_id"];
    $mesajalan      = $_POST["mesajalan"]; // Dizi olarak gelen bu veriyi mesaj_alan_id sütununa virgül ile birleştirerek yazdırmak istiyorum. Örneğin 1,2
    $mesajicerik    = $_POST["mesajicerik"];
    
    $alan = implode(",", $mesajalan);
    
    $mesaj = $db->prepare("INSERT INTO mesajlar SET mesaj_gonderen_id = :mesajgonderen, mesaj_alan_id = :mesajalan, mesaj_icerik = :mesajicerik");
    $mesaj->execute([
        "mesajgonderen" => $mesajgonderen,
        "mesajalan"     => $alan,
        "mesajicerik"   => $mesajicerik
    ]);
    
    $hata = $mesaj->errorInfo();
    echo $hata[2];

else: ?>

    <form action="mesaj-gonder.php" method="post">
    	<div class="form-group">
    		<label for="mesajalan">Alıcı</label>
    		<select class="form-select form-control" name="mesajalan[]"  multiple aria-label="multiple select example">
    			<?php
    			    $uyeler = $db->query("SELECT * FROM uyeler"); // burada istemci tarafından herhangi bir veri kullanmadığın için, direkt olarak query metodundan faydalanabilirsin
    				/*
    				$uyeler = $db->prepare("SELECT * FROM uyeler");
    				$uyeler->execute();
    				*/
    
    				foreach ($uyeler->fetchAll(PDO::FETCH_ASSOC) as $uye):
    			?>
    				<option value="<?php echo $uye["uye_id"]; ?>"><?php echo $uye["uye_kullanici_adi"]; ?></option>
    			<?php endforeach; ?>
    		</select>
    	</div>
    	
    	<div class="form-group">
    		<label for="mesajicerik">Mesaj İçerik</label>
    		<textarea class="form-control" id="mesajicerik" name="mesajicerik" rows="3"></textarea>
    	</div>
    	<button type="submit" class="btn btn-info w-100 mt-1">Mesajı Gönder</button>
    </form>


<?php endif; ?>

Detaylı PDO kullanımı ve örnekleri için buraya göz atabilirsin.

GÜNCELLEME
  • Ek olarak, mesaj_alan_id sütununun , gibi bir karakter içerdiği için veritabanı tarafında virgül gibi özel karakterlere izin veren bir veri yapısı kullanmalısın. Eğer ilgili sütunun veri tipi INTEGER ise, bu veri tipi yalnızca rakamları alabildiği için VARCHAR veya TEXT gibi özel karakterleri de barındıran veri tiplerinden birini tercih etmelisin.