v2.5.2
Giriş yap

PHP'de tek bir sorgu ile veriye ait bütün her şeyi çekme

ilkertuncer
647 defa görüntülendi ve 1 kişi tarafından değerlendirildi

Merhabalar.

Amamcım şu. Elimde iki tablom var.

Bu tabloarın ilki 'posts' tablosu. Bu tabloda verilerimi tutuyorum. Tablom: https://prnt.sc/NvPTlgaSEL20
Diğer tablom ise 'categories' bu tablomda ise kategorilerimi tutuyorum. Tablom: https://prnt.sc/VKUO1_V2kN3N

Verimi çekerken diğeceğim ki;
Getten gelecek verim ile alakalı her şeyi veeklenmiş kategori adını (başka tablodaki) getir.

İki farklı sorgu ile çekersem, yani kategorisini şu şekilde;

    <?php $categories = $db->query('SELECT categories.*, COUNT(posts.id) as toplamCategory FROM categories
    LEFT JOIN posts ON FIND_IN_SET(categories.id, posts.category_id)
    GROUP BY categories.id DESC')->fetchAll(PDO::FETCH_ASSOC); ?>   
    

Verimi tuttuğum tabloadan veri bilgimi şu şekilde;

    <?php
    
    if (!isset($_GET['url']) || empty($_GET['url'])){
        header('Location:404.php');
    }
    
    $datas = $db->prepare('SELECT * FROM posts WHERE url = ?');
    $datas->execute([
        $_GET['url']
    ]);
    $data = $datas->fetch(PDO::FETCH_ASSOC);
    
    if (!$data){
        header('Location:404.php');
        exit;
    }
    
    ?>

( $data[''] olarak) 2 farklı forach ile çekersem aynı veriyi kaç tane kategori sayısı varsa o kadar çekiyor ve her farklı çektiğinde de kategoiri ismini diğer kategori adlıryla değiştiriyor

Yardımcı olabilirseniz sevinirim.

Cevap yaz
Cevaplar (8)
ilkertuncer
723 gün önce

YARDIM EDEN HERKESE ÇOK TEŞEKKÜR EDERİM. FAKAT HATAMI BAŞKA AÇTIĞIM TAGDA GİDERDİLER.

https://prototurk.com/soru/5898-ileri-duzey-php-bilen-biri-bakabilir-mi

ADLI TAGDA SORUNUN ÇÖZÜMÜ BULUNMAKTADIR.

HERKESE TEŞEKKÜRLER!

rephp7
725 gün önce

sonuncuda SELECT posts.* from posts dener misin?

şu tablo içeriğinin ekran görüntüsünü çeker misin?
categories ve posts tablonda eşleşen kolonlarda hata mı var acaba?

$kat_id nin çıktısı nedir? ben bunu kategori id olarak düşündüğümden post ve kategori kodlarını eşleştirdim. eğer metinse, ve bunu where ile diğer tablodan sayıyla eşleştirdiysek oda hata yaratır.

category_id sütunundaki veri posts tablonda tam olarak eşleşen sütun nedir? birebir eşleşiyorlar mı?

ilkertuncer
725 gün önce

Merhabalar. Dediğinz mantıkta yaptım fakat hala hata alıyorum.

$kat_id = $_GET['url']; sayfaının en üstüne gelecek şekilde yazdım fakat sorgumu farklı şekillerde değiştirirsem şu sonular çıkıyor.

    <?php $categories = $db->query("SELECT posts INNER JOIN categories 
    WHERE categories.id = $kat_id
    ORDER BY posts.id DESC")->fetchAll(PDO::FETCH_ASSOC); ?> 

dersem hatam = Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'INNER JOIN categories WHERE categories.id = deneme-konu ORDER BY posts.id ...' at line 1 in C:\xampp\htdocs\ilkertuncer.com\blog\page.php:38 Stack trace: #0 C:\xampp\htdocs\ilkertuncer.com\blog\page.php(38): PDO->query('SELECT posts IN...') #1 {main} thrown in C:\xampp\htdocs\ilkertuncer.com\blog\page.php on line 38

------------

    <?php $categories = $db->query("SELECT  from posts INNER JOIN categories 
    WHERE categories.id = $kat_id
    ORDER BY posts.id DESC")->fetchAll(PDO::FETCH_ASSOC); ?> 
    
dersem hatam = Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'from posts INNER JOIN categories WHERE categories.id = deneme-konu ORDER B...' at line 1 in C:\xampp\htdocs\ilkertuncer.com\blog\page.php:38 Stack trace: #0 C:\xampp\htdocs\ilkertuncer.com\blog\page.php(38): PDO->query('SELECT from po...') #1 {main} thrown in C:\xampp\htdocs\ilkertuncer.com\blog\page.php on line 38

--------

    <?php $categories = $db->query("SELECT * from posts INNER JOIN categories 
    WHERE categories.id = $kat_id
    ORDER BY posts.id DESC")->fetchAll(PDO::FETCH_ASSOC); ?>
    
dersem ki bu şekilde dememem lazım çünki konu içeriği çekiyorum | hatam = Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'deneme' in 'where clause' in C:\xampp\htdocs\ilkertuncer.com\blog\page.php:38 Stack trace: #0 C:\xampp\htdocs\ilkertuncer.com\blog\page.php(38): PDO->query('SELECT * from p...') #1 {main} thrown in C:\xampp\htdocs\ilkertuncer.com\blog\page.php on line 38

------- 

    Hatalarım Bu şekilde oluyor. Yardımcı olabilirsen çok memnun olurum.
rephp7
726 gün önce

Mantık şu, sayfada $_GET['url'] olarak aldığın değer kategori kodu olmalı.
bunu $kat_id olarak sayfanın başında değişkene atadık. Bu üstte yer almalı. Böylelikle $_get ile aldığımız kategori id sine göre içerik değişecek.

sonra categories ve posts tablolarını inner join ile birbirine bağlayıp where diyerek get ile aldığımız kategorinin idsinin post tablosundaki kategori id-sine eşit olanları al dedik. sonra da order by diyerek post id ne göre verileri sırala dedik.

Bu mantığa göre kodlarını düzenler misin? Mantığı bu. Anca bu elimden geldi.

ilkertuncer
726 gün önce

Maalesef hala aynı hatayı alıyorum.

Düzenlenmiş kodum:

<?php

$categories = $db->query('SELECT posts INNER JOIN categories 
WHERE categories.id = $kat_id
ORDER BY posts.id DESC')->fetchAll(PDO::FETCH_ASSOC);?>
<?php foreach($categories as $category): ?>
    <div class="container mt-4">
<div class="row">
    <div class="col-md-12">
        <div class="card mb-3">
            <div class="card-header">
            <i class="bi bi-folder"></i> Kategori: <a href="<?= '../blog/category/' . seo($kat_id['category_url']) ?>"><?=$kat_id['category_name']?></a>
            <a class="Date"><?=$data['date']?> <i class="bi bi-clock"></i></a>
            </div>
            <div class="card-body">
            <?php $imageURL = '../admin/uploads/'.$data["image"]; ?>
            <div class="mainİmage"><img src="<?php echo $imageURL; ?>" alt="" /></div><br>
                <?=htmlspecialchars_decode($data['content'])?>
            </div>
        </div>
</div>
</div>
<?php endforeach; ?>
rephp7
726 gün önce

categories.id = $kat_id)
şurdaki parantezi silip öyle dener misin? mobilde yazarken silmemişim sende öyle kullanmışsın.
düzelmezse kodun son halini yapıştırır mısın? ekran resminden zor oluyor.

ilkertuncer
726 gün önce

Merhabalar. yardımın için minnettağrım fakat sanırım anlattığın şeyden çok bir şey anlamadım.

Sanrım en alttaki verdiğin kod ile kendi $categories bölümüm değiştirmem lazım.

Her şey aynı şekilde değiştirince hata almaktayım. Değiştirmem gerekn yerler varsa buralar neresi olmalı?

Hatam: https://prnt.sc/Anpu5yh_u8vc

Kodum ve değiştirdğim yerler: https://prnt.sc/pGT5ZZ6OvGT2

Pek bir şey anlamadım maselef. Biraz daha açıklayabilirsen minnettar kalırım.

rephp7
726 gün önce

COUNT(posts.id) yapma inner joinle tabloları bağla
sonra kategori id ni get ile aldığından where kısmında kategori id lerini

$kat_id= $datas[0]["id"] buna bağlı eşitle. böylece iki tablodan sadece post ta tuttugun kategori no ile get ile gelen kategorisi eşit olanları eşleyip sadece onu çekersin.

umarım kısıtlı bilgimle yardımcı olabilmişimdir.

$categories = $db->query('SELECT posts INNER JOIN categories 
WHERE categories.id = $kat_id) 
ORDER BY posts.id DESC')->fetchAll(PDO::FETCH_ASSOC);