PHP'de tek bir sorgu ile veriye ait bütün her şeyi çekme
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.
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (8)
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!
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ı?
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.
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.
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; ?>
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.
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);