v2.5.2
Giriş yap

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

rephp7
536 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");
PHP

Ö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>

PHP

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
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Cevaplar (6)
eminkurt
1300 gün önce

İlk önce yılları al

    $query = $db->query(" SELECT yil FROM yazilar GROUP BY yil", PDO::FETCH_ASSOC);
PHP

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 ?>
PHP
eminkurt
1300 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>
PHP

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);
PHP
rephp7
1300 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
1300 gün önce
SELECT * FROM yazilar WHERE YEAR(yil) = YEAR(CURDATE()) order by id desc

//yil alanın datatime() olacak
PHP
rephp7
1300 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>
PHP

Çı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
1301 gün önce

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

   SELECT YIL_KOLONU FROM TABLO_ADI GROUP BY YIL_KOLONU
SQL

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