PHP Önceki – Sonraki İçerik Uygulaması

Herkese Merhaba,

Bu derste PHP ve MySQL ile önceki ve sonraki içerik uygulaması yapacağız. Oldukça basit bir işlem. Hemen örnek veritabanımızı oluşturarak başlayalım. İçerikler adında bir tablo oluşturalım. Kodlarımız aşağıdaki gibidir. Tabi bundan önce bir de veritabanı oluşturmamız lazım. blog_ders adında bir veritabanı oluşturuyorum ben. Ve tabiki de daha sonra bu veritabanımı seçiyorum.

CREATE TABLE icerikler(
id INT NOT NULL AUTO_INCREMENT,
baslik VARCHAR(255),
icerik TEXT,
tarih TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id)
)DEFAULT CHARSET=UTF8;

Veritabanımı ve tablomu oluşturduktan sonra şimdi sistemimi denemek için içerisine birkaç tane veri ekleyelim. Veri eklemek için aşağıdaki SQL kodunu kullanabilirsiniz.

INSERT INTO icerikler
(baslik, icerik)
VALUES
("Proje Geliştirirken İstiktarlı İlerleme Yolları", "Örnek bir içeriktir, gerçek içeriklerle hiçbir alakası yoktur."),
("MySQL Foreign Key Kullanımı", "Örnek bir içeriktir, gerçek içeriklerle hiçbir alakası yoktur."),
("Feedly İle Güncel Kalın", "Örnek bir içeriktir, gerçek içeriklerle hiçbir alakası yoktur."),
("Composer Nedir, Ne İşe Yarar, Nasıl Kullanılır ?", "Örnek bir içeriktir, gerçek içeriklerle hiçbir alakası yoktur."),
("Bilinmesi Gereken 7 PHP İpucu", "Örnek bir içeriktir, gerçek içeriklerle hiçbir alakası yoktur."),
("MySQL Önceki - Sonraki İçerik Uygulaması", "Örnek bir içeriktir, gerçek içeriklerle hiçbir alakası yoktur.")

İçeriklerimizi de eklediğimize göre şimdi deneyebiliriz. Örnek olarak şöyle bir uygulama yapalım. Get ile bir ID verisi geldiği zaman o ID’ye sahip blogumuzu ekrana yazdıralım. Tabi bunun öncesinde veritabanı bağlantımızı kurmamız lazım önce. Tüm kodları buraya yazıyorum, inceleyin lütfen.

index.php

<?php

try {
    $db = new PDO("mysql:hostname=localhost; dbname=blog_ders; charset=UTF8;", "root", "");
} catch (PDOException $e) {
    die($e->getMessage());
}

$id = isset($_GET['id']) ? $_GET['id'] : 0; /* Eger GET ile alabildigimiz bir id degeri varsa id degiskenine bu degeri atiyoruz. Eger yoksa id degiskenimize 0 degerini atiyoruz. */

if($id != 0) { /* ID 0 degilse talep edilen bir blog vardir. Bunu ekrana yazdiralim. */
    $query = $db->prepare("SELECT * FROM icerikler WHERE id = ?");
    $query->execute([$id]);
    if($query->rowCount() > 0) { // Eger boyle bir blog varsa...
        $icerik = $query->fetch(PDO::FETCH_ASSOC); // Verimizi Elde Ettik.
        echo "<h3>".$icerik['baslik']."</h3>";
        echo "<p>".$icerik['icerik']."</p>";
    }
}else { /* ID 0 ise herhangi bir blog istenmemistir, anasayfayi gosterebiliriz. */
    echo "Anasayfadasiniz.";
}

Kodlarımız şu anda düzgün bir şekilde çalışıyor. İsterseniz index.php?id=1 gibi bir adrese gidip deneyebilirsiniz. Size id’sini girdiğiniz bloğu ekrana yazdıracaktır.

Şimdi şöyle düşünebilirsiniz. Örnek olarak GET ile aldığımız id değeri 3. Bir sonraki yazımızın id değeri de bu durumda 4 olacak. Direkt olarak sonraki yazı adında bir link oluşturup buna id + 1 değerini verebiliriz. Aslında ilk bakışta çok mantıklı ama örnek olarak 4 id’li verinizin silindiğini veya onaysız bir içerik olduğunu varsayalım. Bu durumda 3 id’li yazıdan sonraki yazı 4 değil de 5 olmalı ya da 3’ten büyük id’ye sahip ilk veri olmalı. Bu durumda işler biraz değişecek.

Şimdi bu işlemimiz düzgün çalıştığına göre hemen önceki ve sonraki konu uygulamasına geçebiliriz. Bunun için kullanacağımız sorguyu aşağıda veriyorum ve hemen onun altında da açıklıyorum. Önceki yazımızı elde etmek için şu SQL kodumuzu kullanacağız.

SELECT * FROM icerikler WHERE id < <em>$_GET['id']</em> ORDER BY id DESC LIMIT 1

Şimdi bu SQL kodumuzu inceleyelim. İçerikler tablosundan veri çekeceğimizi söylüyoruz. Ama bu veriyi bazı koşullara bağlıyoruz. Diyoruz ki id şu an açık olan blogun id’sinden küçük olan veriyi çek. Ama bunun sonrasında iki ifademiz daha var. ORDER BY id DESC ifadesini yazmaktaki amacımız içeriklerin sıralı bir şekilde gelmesi ve LIMIT 1 dememizin sebebi de sadece tek bir veri çekmek istememiz. ORDER BY id olayı kafanızı karıştırmış olabilir. Sonraki paragrafta bunu açıklayacağım. Zaten olayı anlamış olanlar bir sonraki paragrafı atlayabilirler.

Burda bizim şu anki id’mizin 3 olduğunu varsayalım. Dolayısıyla da bir önceki verimizin id’si 2 olacak. Bunu elde etmek için verilerimizi önce bir sıraya soktuk. Büyükten küçüğe bir sıra, dikkat edin yalnız burası önemli. Bunu ORDER BY id DESC yerine ORDER BY id ASC şeklinde yazarsanız size istediğiniz veriyi vermeyecektir. Neyse şimdi devam edelim ve olayın işleyişini inceleyelim. ORDER BY id DESC dedik ve böylece verilerimizin id’leri sırayla şu şekilde gelmeye başladı. 6 – 5 – 4 – 3 – 2 – 1. Koşulumuzda da dedik ki id’si 3’ten küçük olan tek bir veri al. Verilerimiz şu an sıralı olduğu için 3’ten küçük olan ilk veriyi alacak ve bu da doğal olarak 2 id’li veri olacak. Neden ASC kullandığımızda hatalı bir sonuç aldığımız hakkında tek bir fikrim var, belki uzun süredir bilgisayardan kalkmadığım için aklıma başka bir şey gelmemiştir bilemeyeceğim ama fikir çok karışık olduğu için ve tam olarak doğru olduğundan emin olmadığım için bundan bahsetmiyorum. Her ne kadar nefret etsem de bunu ezberlemeniz lazım. Eğer sebebini anlarsam bu yazıyı güncelleyeceğim. Devam edebiliriz.

Önceki içeriği aldığımıza göre şimdi sıra sonraki içeriği almaya geldi. Bunun için yapacağımız şey de aynı sorgunun tam tersini yazmak. Yani ORDER BY id DESC yerine ORDER BY id ASC yazacağız ve bir de id > $_GET[“id”] diyeceğiz. Sorgumuz şu şekilde olacak yani.

SELECT * FROM icerikler WHERE id > <em>$_GET['id']</em> ORDER BY id ASC LIMIT 1

Bu sorgu sonucunda da sonraki içeriğimizin id’sini elde etmiş olacağız. Şimdi bunları link olarak sayfamıza ekleyelim.

Not: Aslında bu iki veriyi tek bir sorguda çekebilirdik ama tek bir sorguda çektiğimiz zaman sorgu süresi yaklaşık olarak 0.0040 civarında iken ayrı ayrı sorgular yaptığımızda toplam süre yaklaşık olarak 0.0025 sn civarında oluyor. Bu yüzden çift sorgu çalıştırmayı tercih ettim.

Sayfamıza eklemek için

echo "

".$icerik['icerik']."

";

satırından sonra şu kodları ekleyelim.

$oncekiQuery = $db->prepare("SELECT * FROM icerikler WHERE id < ? ORDER BY id DESC LIMIT 1");
$oncekiQuery->execute([$id]); // Onceki yazimizi cektik.
if($oncekiQuery->rowCount() > 0) { /* Her zaman onceki ve sonraki yazi olacak diye bir kural yok. O an ilk yazida da olabiliriz. */
    $oncekiId = $oncekiQuery->fetch(PDO::FETCH_ASSOC)['id']; // Verimizi elde ettik.
    echo '<a href="?id='.$oncekiId.'">Onceki Yazi</a>'; // Linkimizi olusturduk.
}
// Ayni islemleri sonraki icin yapiyoruz.
$sonrakiQuery = $db->prepare("SELECT * FROM icerikler WHERE id > ? ORDER BY id ASC LIMIT 1");
$sonrakiQuery->execute([$id]);
if($sonrakiQuery->rowCount() > 0) {
    $oncekiId = $oncekiQuery->fetch(PDO::FETCH_ASSOC)['id'];
    echo '<a href="?id='.$oncekiId.'">Onceki Yazi</a>';
}

İsterseniz şimdi de denemek için 4 id’li veriyi silelim ve ileri geri gidelim. Bakalım 5 ile 3 arasında atlama yapıyor mu başarılı bir şekilde.

DELETE FROM icerikler WHERE id = 4;

Evet ben denedim çalışıyor. Eğer inanmayan varsa kendisi de deneyebilir. 😀 Kısaca önceki ve sonraki içerik uygulaması bu şekilde yapılıyor. Eğer hatalarım varsa, sormak istediğiniz bir şey varsa ya da söylemek istediğiniz bir şey varsa yorum olarak veya mail olarak zhdefe@gmail.com veya iletisim@zahidefe.net adresine gönderebilirsiniz.

Bu arada unutmadan kodlarımızın son halini de buraya yapıştırayım.

<?php

try {
    $db = new PDO("mysql:hostname=localhost; dbname=blog_ders; charset=UTF8;", "root", "123456");
} catch (PDOException $e) {
    die($e->getMessage());
}

$id = isset($_GET['id']) ? $_GET['id'] : 0;

if($id != 0) {
    $query = $db->prepare("SELECT * FROM icerikler WHERE id = ?");
    $query->execute([$id]);
    if($query->rowCount() > 0) {
        $icerik = $query->fetch(PDO::FETCH_ASSOC);
        echo "<h3>".$icerik['baslik']."</h3>";
        echo "<p>".$icerik['icerik']."</p>";
        // Onceki Yazi
        $oncekiQuery = $db->prepare("SELECT * FROM icerikler WHERE id < ? ORDER BY id DESC LIMIT 1");
        $oncekiQuery->execute([$id]);
        if($oncekiQuery->rowCount() > 0) {
            $oncekiId = $oncekiQuery->fetch(PDO::FETCH_ASSOC)['id'];
            echo '<a href="?id='.$oncekiId.'">Onceki Yazi</a>';
        }
        // Sonraki Yazi
        $sonrakiQuery = $db->prepare("SELECT * FROM icerikler WHERE id > ? ORDER BY id ASC LIMIT 1");
        $sonrakiQuery->execute([$id]);
        if($sonrakiQuery->rowCount() > 0) {
            $sonrakiId = $sonrakiQuery->fetch(PDO::FETCH_ASSOC)['id'];
            echo '<a href="?id='.$sonrakiId.'">Sonraki Yazi</a>';
        }
    }
} else {
    echo "Anasayfadasiniz.";
}

İçerik işinize yaradıysa aşağıdaki Thank You butonuna basarsanız çok sevinirim. Herkese iyi çalışmalar, görüşmek üzere.

MySQL, PHP Mustafa Zahid Efe 5 yorum