Yıllara göre veri çekmek, tek sorgu da mümkün mü?
Yazilar tablomdan yil sütununa göre ayrı ayrı kartlarda o yılın başlıklarını listeletmek istiyorum.
$buyil= date("Y");
$yillikyazilar = $db->vericek('yazilar', "where yil=?", array($buyil), "order by id desc");
Örneğin yukarıda ki sorguda bu yılın yazılarının başlıklarını 2021 yazıları diye adlandırdığım kartıma çekiyorum.
<div class="card-header">
<!-- bu yıl : 2021 yılının yazıları kartı -->
<h3 class="card-title"><?= $buyil; ?> Yılı Yazılarımız</h3>
</div>
<div class="card-body">
<?php
for ($i = 0; $i < count($yillikyazilar); $i++) {
?>
<li> <?= $yillikyazilar[$i]["baslik"]; ?></li>
<?php } ?>
</div>
Her card için ayrı ayrı mı veri çağırmalıyım ? bunun kolay yolu yok mu?
son 4 yıl için cardlar yapıp 5. card da da geri kalan tüm yılların başlıklarını çağırmak istiyorum?
nasıl yapabilirim? Yardımınızı rica ediyorum.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (6)
İlk önce yılları al
$query = $db->query(" SELECT yil FROM yazilar GROUP BY yil", PDO::FETCH_ASSOC);
Sonra yılları sırala. 2. bir sorgu ile card body içinde ilk sorgumuzdan gelen yıl verisine göre verileri çek
<?php foreach ($query as $row): ?>
<div class="card-header">
<h3 class="card-title"><?= $row['yil']; ?> Yılı Yazılarımız</h3>
</div>
<div class="card-body">
<?php
$query2 = $db->query(' SELECT * FROM yazilar WHERE yil = '.$row['yil'].' ', PDO::FETCH_ASSOC);
?>
<?php foreach ($query2 as $row2): ?>
<li><?=$row2['baslik']?></li>
<?php endforeach ?>
</div>
<?php endforeach ?>
Doğru anladıysam şöyle de yapabilirsin.
Select'te seçim yaptığın an url'e yıl değeri gelecek bunu kontrol ederek card'ları getirebilirsin
<form method="GET">
<select name="yil" onChange="window.location.href=this.value" class="form-control">
<?php foreach ($yillar as $yil): ?>
<option value="<?=http://localhost/veriler?yil='.$yil["yil"].'?>"><?=$yil['yil']?></option>
<?php endforeach ?>
</select>
</form>
Bu şekilde get değerini al ve sorguda kullan.
if (isset($_GET['yil'])) {
$yil = $_GET['yil']
}
else{
$yil = '2021';
}
$query = $db->query(" SELECT yil FROM yazilar WHERE yil = $yil GROUP BY yil", PDO::FETCH_ASSOC);
@eminkurt teşekkür ederim sayenizde yaptım.
Ama cardlar çok uzadı, daha uygun bir çözüm arıyorum.
Bu konuda da bana yol gösterir misiniz?
Şöyle bir şey yapmak istiyorum.
card-header kısmına option value ile yılları döndürüyorum.
Burdan yani aşağı açılır listeden yılı seçtiğimde card-body kısmına
yazı başlıklarını getirsin istiyorum.
sanırım foreach ile döndürdüğüm yıllardan hangi yılı seçtiğimi algılaması için javascript gerekiyor ama örnek bulamadım.
group by dyil
olarak sorguyu düzellendim.
<div class="card-body">
<?php
for ($i = 0; $i < count($yillikyazilar); $i++) {
?>
<li> <?= $yillikyazilar[$i]["yil"]; ?> Yılı
<ul>
<li><?= $yillikyazilar[$i]["baslik"]; ?></li>
</ul>
</li>
<?php } ?>
</div>
Çıktısında her yıl için tek yazı başlığı çekiyor. Yıllara göre o yılın tüm yazıları listeli olarak gelmiyor?
for
yerine foreach
de kullandım sonuç yine aynı.