
İçerikler
Çok sık karşılaştığım ve cevapladığım, iki Tarih arasındaki verilerin nasıl listeleneceğini bu yazımda anlatmaya çalışacağım. Bu zamana kadar anlatmamış olmamın nedeni de; çok basit bir mantığının olması ve temel bilgilere sahip olan herkesin yapacağını düşünmemdi. Maalesef ki bu düşüncelerimde yanıldığımı gördüm. Genel olarak armut piş ağzıma düş durumunun bulunması, üretkenlik ve yaratıcılık konusunda eksikliğin hat safhada olması, öğrenilen ve bilinen kod dizisinden yeni uygulamalar hazırlanamamasına neden oluyor. (O kadar doldum ki bu sitemde bulunmam gerekiyordu.)
Tarih işlemleri, time(); ve date(); ile gerçekleştiğinden dolayı, bu yazımda iki tarih türüyle nasıl işlem yapılacağını anlatacağım.
Veri Tabanına date(); Fonksiyonu İle Kayıt Edilmiş, İki Tarih Arası Verileri Listeleme
Öncelikle tarih bilgisini almak için, HTML5 ile gelen input type=”date” özelliğini kullanacağız. Bu inputtan gelecek olan değer; Yıl – Ay – Gün Formatından olduğundan dolayı hazırlayacağım örnekte veri tabanında Yıl – Ay – Gün formatında verilerin kayıtlı olduğunu varsayacağım.
Eğer kendi veri tabanınızda kayıtlar, Gün – Ay – Yıl şeklinde kayıtlıysa; explode() ile inputtan gelen değeri bölüp, veri tabanınızdaki kayıtlı formata getirerek bu aramayı gerçekleştirebilirsiniz.
İlk olarak HTML Form alanını oluşturalım. Sonrasında kodlamaya geçerek bu işlemin nasıl yapılacağını görelim.
<form action="" method="POST"> <div>Başlangıç Tarihi: <input type="date" name="tarih1"></div> <div>Bitiş Tarihi: <input type="date" name="tarih2"></div> <button>Verileri Listele</button> </form>
Örnek öncesinde söylemiş olduğum gibi tarih alanlarını HTML5’ten yararlanarak hazırlıyoruz. Burada başlangıç ve bitiş olarak iki adet input oluşturuyoruz. Böylelikle alacağımız iki tarih ile listelenecek verilerin aralığını belirlemiş oluyoruz.
Bu işlem için gerçekleştireceğimiz veri tabanını da aşağıdaki gibi olacaktır. Veri tabanı yapısını temel alarak örnek kodlamasına geçelim.
İlk olarak; başlangıç tarihinin, bitiş tarihinden büyük olmasını istemediğimizden dolayı bununla ilgili koşulumuzu yazıyoruz.
if($_POST["tarih1"] > $_POST["tarih2"]){ echo " Başlangıç Tarihi Bitiş Tarihinden Büyük Olamaz. "; }else{ // Kayıtları Listeleme Alanı }
Yukarıda yer alan kodla, Formdan gelen başlangıç ve bitiş tarihini aldık. Başlangıç değerinin bitiş değerinden büyük olmaması için bu kontrolü yaptık. Else kısmında ise, listeleme işlemini gerçekleştireceğiz.
$Veriler = $db->prepare("SELECT * FROM makale WHERE ktarih >= ? and ktarih <= ? ORDER BY id DESC"); $Veriler->execute(array( $_POST["tarih1"], $_POST["tarih2"] )); foreach($Veriler as $Cek){ echo $Cek["baslik"]."\n"; }
Yukarıdaki sorgumuzda yer alan ktarih >= ? and ktarih <= ? İfadesiyle, başlangıç ve bitişi tanımlamış olduk. Makalenin başında da belirtmiş olduğum gibi sadece WHERE kısmında neye ihtiyacımızın olduğunu belirtiyoruz.
Veri Tabanına time(); Fonksiyonu İle Kayıt Edilmiş, İki Tarih Arası Verileri Listeleme
Bu listeleme türü diğerine göre biraz teferruatlıdır. Buradaki teferruat, inputtan gelecek olan değeri ilk önce time(); değerine çevirmemizden kaynaklanacaktır. İlk örnekte yer alan HTML Form alnını kullanarak kodlamaya geçelim.
Bu işlem için gerçekleştireceğimiz veri tabanını da aşağıdaki gibi olacaktır. Veri tabanı yapısını temel alarak örnek kodlamasına geçelim.
İlk olarak POST’tan gelen verileri tim(); değerine çevirelim. Sonrasında ilk örnekte yapmış olduğumuz başlangıç, bitişten büyük mü? Sorgusunu yazalım.
$tarih1 = explode('-',$_POST["tarih1"]); // POST'tan gelen başlangıç değerini parçalıyoruz. $tarih2 = explode('-',$_POST["tarih2"]); // POST'tan gelen bitiş değerini parçalıyoruz. $tarih1Cevir = mktime (0, 0, 0,$tarih1["1"],$tarih1["2"],$tarih1["0"]); // Başlangıç tarihini Time değerine çeviriyoruz. $tarih2Cevir = mktime (23, 59, 59,$tarih2["1"],$tarih2["2"],$tarih2["0"]); // Bitiş tarihini Time değerine çeviriyoruz.
Burada dikkat edilmesi gerekilen en önemli nokta, başlangıç tarihi tanımlanırken mktime fonksiyonuna saat-dakika-saniye bilgisine 0, 0, 0 yazılmasıdır. Bunun nedeni, başlangıç tarihinin gece yarısı 00:00 saatinden başlamasıdır.
Diğer dikkat edilmesi gerekilen en önemli nokta da, bitiş tarihi tanımlanırken mktime fonksiyonunda saat-dakika-saniye bilgisine 23, 59, 59 yazılmasıdır. Bunun nedeni, bitiş tarihinin gece yarısı 23:59:59 saatinden son bulmasıdır.
İnputtan gelen değerleri time(); fonksiyonuna başarılı bir şekilde çevirdikten sonra ilk olarak başlangıç, bitişten büyük mü? Sorgusunu yapalım, sonrasındaysa listeleme sorgusunu yazalım.
if($tarih1Cevir > $tarih2Cevir){ echo " Başlangıç Tarihi Bitiş Tarihinden Büyük Olamaz."; }else{ // Kayıtları Listeleme Alanı }
Yukarıda hazırlamış olduğumuz kodla, inputtan gelip time değerine çevirmiş olduğumuz değişkenleri; başlangıç, bitişten büyük mü? Sorgusuna yazıyoruz. Else kısmındaysa listeleme işlemini gerçekleştireceğiz.
$Veriler = $db->prepare("SELECT * FROM makale WHERE time >= ? and time <= ? ORDER BY id DESC"); $Veriler->execute(array( $tarih1Cevir, $tarih2Cevir )); foreach($Veriler as $Cek){ echo $Cek["baslik"]."\n"; }
Yukarıdaki sorgumuzda yer alan time >= ? and time <= ? İfadesiyle, başlangıç ve bitişi tanımlamış olduk. Makalenin başında da belirtmiş olduğum gibi sadece WHERE kısmında neye ihtiyacımızın olduğunu belirtiyoruz.
Bu şekilde, iki türlü kayıtlı olan tarih bilgisine ait listelemeyi yaptık. İlk örnekte tarih formatını, inputtan gelen tarih biçimine göre hazırladım. Eğer sizin veri tabanınızda bu tarih formatı yerine gün-ay-yıl olarak kayıtlıysa, ikinci örnekteki gibi explode ile bölmeniz gerekmektedir. Sonrasında gelen parçalı değişkenleri gün-ay-yıl şeklinde sıralayıp listeleme işlemini gerçekleştirebilirsiniz.
Ayrıca iki tarih arasında listeleme yaparken, ayrıca belirtilen kelime bazındaki verilerin listelenmesini istiyorsanız; PDO ile Site İçi Arama İşlemi | PDO Like dersindeki bilgilerle burada yer alan bilgileri birleştirebilirsiniz. İlk paragrafta yazmış olduğum üretkenlikte bunu gerektirir.