Diziyi Virgül İle Birleştirerek INSERT İşlemi
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; ?>
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (4)
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 tipiINTEGER
ise, bu veri tipi yalnızca rakamları alabildiği içinVARCHAR
veyaTEXT
gibi özel karakterleri de barındıran veri tiplerinden birini tercih etmelisin.
ÖNCELİKLE mesaj_alan_id İNT sa TEXT veya varchar yap
boyle bır insert işlemi olmaz ondan hata alıyorsun Sen UPDATE işlemi ile karıştırmıssın
$mesaj = $db->prepare("INSERT INTO mesajlar SET mesaj_gonderen_id = :mesajgonderen, mesaj_alan_id = :mesajalan, mesaj_icerik = :mesajicerik");
DOĞRUSU
$mesaj = $db->prepare("INSERT INTO mesajlar (mesaj_gonderen_id, mesaj_alan_id, mesaj_icerik) VALUES (:mesajgonderen,:mesajalan,:mesajicerik)") ;
$mesaj->execute([
":mesajgonderen" => $mesajgonderen,
":mesajalan" => $alan,
":mesajicerik" => $mesajicerik
]);
ki bence bunca kod yazarak insert update işlemide gereksiz genel olarak bu şekilde kullanılıyor lakin bence kullanılması gereken yöntem bu
$mesaj = $db->prepare("INSERT INTO mesajlar (mesaj_gonderen_id, mesaj_alan_id, mesaj_icerik) VALUES (?,?,?)") ;
$mesaj->execute([$mesajgonderen,$alan,$mesajicerik]);