v2.5.2
Giriş yap

Yıllara göre veri çekmek, tek sorgu da mümkün mü?

rephp7
425 defa görüntülendi

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.

Cevap yaz
Cevaplar (6)
eminkurt
929 gün önce

İ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 ?>
eminkurt
929 gün önce

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);
rephp7
929 gün önce

@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.

kartal
929 gün önce
SELECT * FROM yazilar WHERE YEAR(yil) = YEAR(CURDATE()) order by id desc

//yil alanın datatime() olacak
rephp7
929 gün önce

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ı.

eminkurt
930 gün önce

Önce tablodaki yılları groupby ile alman gerekir.

   SELECT YIL_KOLONU FROM TABLO_ADI GROUP BY YIL_KOLONU

Bu şekilde tablondaki yılları elde edersin. Daha sonrasında gelen yılları döndürüp gelen içerikleri alabilirsin.