PHP ile PDO türü veri bağlantılı class (sınıf) kullanımı
Merhaba yazılarım durmadan devam ediyor bukadar kısa zamanlarda bukadar yazı yazabileceğim benim bile aklımda değildi, bu yazımda kendi projelerimde kullanmak için yazdığım çok kullanışlı sizin de beğeneceğinizi umduğum PDO veritabanı class'ını nasıl kullanıldığını anlatmaya çalışacağım.
Bildiğiniz üzere PDO, PHP 5 öncesi sürümler tarafından desteklenmez sunucunuz güncel değilse güncelleyiniz, ayrıca artık yeni yazdığınız projelerde PDO kullanın etraftaki paylaşımlardan gördüğüm kadarı ile halen mysql_connect kullanarak veritabanına bağlananlar var, ya birgün php yeni sürümde artık mysql_connect desteği yok derse hüsrana uğrayacak veya PHP eski sürümlerinin kurulu olduğu host aramaya başlayacaksınız.
Neden class kullanmalı?
Nedeni çok basit class sayesinde birçok kodları tekrar tekrar yazmak yerine class'a gödereceğimiz küçük komutlarla aynı işlemi yaparız hem PHP ilerde atıyorum 10 yıl sonra yeni bir veri bağlantı türü geliştirirse yeni olan türe göre yazılmış başka bir class ile anında tüm sitemizdeki bağlantı türünü değiştirmiş oluruz.
Neler yapacağız?
PHP ile yazdığım bu class'ı kullanarak veritabanına bağlanıp veri çekmek, eklemek, güncellemek, silmek, sayısal işlemleri ve çoklu veriyi sayfalama gibi işlemleri yapacağız dosyaları indirmekle başlayalım dosyalarda örnek için index.php class kodların olduğu dbclass.php ve örneklerde kullandığım veritabanı tablo verleri için renklikodlar.sql dosyaları var.
PDO dbclass Dosyaları buradan indirebilirsiniz.
PDO dbclass sınıfının kullanımı
Öncelikle Class'ı kullanmak için veritabanı dosyasını Mysql'e yükleyin sonra dbclass.php'yi projemize dahil (include) etmemiz gerekli sonra da sınıf nesnemizi oluşturup gerekli işlemleri kayıt çekme, silme güncelleme v.b yaptıktan sonra veritabanı ile işimiz bitince kapatmamız gerekiyor bunu yapmak için aşağıdaki kodu kullanacağız.
<?php
ob_start();
$dbhost = "localhost";
$dbuser = "root"; //Veritabanı Kullanıcı Adı
$dbpass = "root"; //Veritabanı Şifresi
$dbdata = "renklikodlar"; //Veritabanı Adı
include("dbclass.php"); //veritabani class dosyamızı dahil ediyoruz
$bag = new db(); // db class'imizla $bag nesnemizi olusturduk
//Kullanılacak olan işlem türü kodları buraya yazılacak
$bag->kapat();// $bag nesnemizi kapattik
ob_end_flush();
?>
Kopyala
Kodlardan anlaşıldığı gibi ilerleyen açıklamalardaki örnekler 12. satırda çalışacaktır yazının devamında tekrar bu kodları vermeyeceğim.
Class'ı kullanarak tek kayıt çekme
Bu sınıfta (class'ta) Tek Kayıt çekme ile ilgili 3 seçeneğimiz var ASSOC,OBJ ve NUM size kolay gelen seçeneği kullanın.
Örnek kullanım şekli.
cek("SEÇİM", "TABLO", "SÜTUNLAR", "KOŞUL", array(KOŞULDEĞERLERİ));
Kopyala
Örnekte SEÇİM yazan yerde ASSOC,OBJ veya NUM kullanın size kalmış.
TABLO yazan yere veritabanında bağlanmak istediğiniz tablo adını yazın.
SÜTUNLAR bu bağlantıda tablodaki hangi sütunlara bağlanacaksanız virgülle ayırın veya tümüne bağlanılacaksa * yazın
KOŞUL olan yere sql sorgusunda kullanılan koşullar yazılacak.
KOŞULDEĞERLERİ bu diziye koşulların değerleri koşul sırasına göre yazılacak
Koşullardan bazı sql örnekleri, KOŞUL ve KOŞULDEĞERLERİ nasıl yazılacak anlamanız için.
- "WHERE baslik LIKE ?", array("%manset%") //baslik sütununda manset kelimesi geçen kaydı alır
- "ORDER BY id DESC", array() //id değerine göre listeleme ASC veya DESC
- "WHERE id=?", array(12) //bizim belirttiğimiz bir id numarası koşulu
- "WHERE id>? AND okuma>? AND okuma<?", array(5,8,10)) // id 5 ten büyük okuma 8 ile 10 arası kaydı getirir
ASSOC ile $sonuc[ "id" ] şeklinde kullanarak veri çekmek
$sonuc = $bag->cek("ASSOC", "haberler", "id,baslik,haber,tarih", "ORDER BY id DESC", array());
echo "Haber id: ".$sonuc["id"]."<br>Başlık: ".$sonuc["baslik"]."<br>Haber: ".$sonuc["haber"]."<br>Tarih: ".$sonuc["tarih"];
Kopyala
OBJ ile $sonuc->id şeklinde kullanarak veri çekmek
$sonuc = $bag->cek("OBJ", "haberler", "id,baslik,haber,tarih", "ORDER BY id DESC", array());
echo "Haber id: ".$sonuc->id."<br>Başlık: ".$sonuc->baslik."<br>Haber: ".$sonuc->haber."<br>Tarih: ".$sonuc->tarih;
Kopyala
NUM ile $sonuc[ 0 ] şeklinde kullanarak veri çekmek
$sonuc = $bag->cek("NUM", "haberler", "id,baslik,haber,tarih", "ORDER BY id DESC", array(5,8,10));
echo "Haber id: ".$sonuc[0]."<br>Başlık: ".$sonuc[1]."<br>Haber: ".$sonuc[2]."<br>Tarih: ".$sonuc[3];
Kopyala
PDO class ile çoklu kayıt çekmek
Buraya kadar olan kodlar tek bir kaydı çekmek içindi şimdi de çoklu kayıt çekmek için bu kodları nasıl kullanırız ona bakalım.
Kodlar aynı olduğu için tek kayıtlarda olduğu gibi 3 seçeneği de yazmama gerek yok sadece neleri değiştirip toplu halde kayıt çekilir ona bakalım.
Örnek kullanım aynı hic değişmeyecek tablo adı sütunlar koşullar koşul değerleri de istekleriniz doğrultusunda belirtilecek burada değişim yapacağımız yer SEÇİM yazan yer.
cek("SEÇİM", "TABLO", "SÜTUNLAR", "KOŞUL", array(KOŞULDEĞERLERİ));
Kopyala
SEÇİM olan yere yazmamız gereken kayıt şekline göre ASSOC_ALL, OBJ_ALL ve NUM_ALL olacak, sonra çoklu kayıt olduğundan döngüye alarak tek tek kayıtları sayfaya yazdırıyoruz aslında tek kayıttaki şekline sadece _ALL sözcüğünü ekliyoruz.
$sonuc = $bag->cek("OBJ_ALL", "haberler", "id,baslik,haber,tarih", "ORDER BY id ASC", array());
foreach($sonuc as $satir) {
echo "Haber id: ".$satir->id."<br>Başlık: ".$satir->baslik."<br>Haber: ".$satir->haber."<br>Tarih: ".$satir->tarih;
echo "<hr>";
}
Kopyala
Benim en sevdiğim kullanım $satir->id şeklinde olduğu için OBJ_ALL olan örneği verdim siz SEÇİM'de ASSOC_ALL, OBJ_ALL veya NUM_ALL kullanarak aynen tek kayıt kodlarında olduğu gibi ($satir[ "id" ] , $satir->id veya $satir[ 0 ]) şeklinde yazdırma seçimleri elde edebilirsiniz.
KOŞUL ve KOŞULDEĞERLERİ tek kayıtlarda geçerli olanlar burda da geçerlidir.
Class buraya kadar fetch(PDO::FETCH_ASSOC) şeklindeki en çok kullanılan sonuç kümelerini kendi içinde tamamlayarak geri döndürdü, olur ya başka bir sonuç kümesine ihtiyacınız olursa diye sonuç kümesini kendiniz belirleyebileceğiniz kod aşağıdaki şekilde yazılacak.
$sonuc = $bag->cek("", "haberler", "id,baslik,haber,tarih", "ORDER BY id DESC", array());
$rs = $sonuc->fetch(PDO::FETCH_OBJ);
echo "Haber id: ".$rs->id."<br>Başlık: ".$rs->baslik."<br>Haber: ".$rs->haber."<br>Tarih: ".$rs->tarih;
Kopyala
OBJ_ALL gibi bir SEÇİM belirtmedik onun yerine $sonuc->fetch(PDO::FETCH_OBJ); ile istenilen sonuç kümesini belirttik.
PDO class ile çoklu kayıt çekmek ve sayfalamak
Sayfalama mantığı aynı çoklu kayıtta olduğu gibi (ASSOC_ALL, OBJ_ALL ve NUM_ALL, sorgular, koşullar v.s) sadece birkaç ekleme yapacağız.
sayfala("SEÇİM", "TABLO", "SÜTUNLAR", "KOŞUL", array(KOŞULDEĞERLERİ), SAYFABAŞIKAYIT, SAYFANO, "?sayfa=", ÖNCESONRA);
Kopyala
SAYFABAŞIKAYIT buraya anladığınız gibi bir sayfada gösterilecek olan kayıt sayısını yazıyoruz.
SAYFANO o anda bulunduğumuz sayfa numarası bunu devam eden örnekte goreceğiniz gibi $_GET[ "sayfa" ] ile alacağız.
?sayfa= burası adres satırımızı temsil eden yer adresle gönderdiğiniz başka veriler varsa ?id=5&okuma=7&sayfa= şeklinde düzenlenmeli
ÖNCESONRA buraya da sayfa numaraları için bir özellik yaptım (ilk onceki [ -10 ]123[ 4 ]567[ +10 ] sonraki son) kırmızı olan yerde kac sayfa çıkması gerekiyorsa onu yazın 3 yazarsanız parantez içindeki gibi olacaktır bu sayede sayfalama numaraları sayfadaki alana sığdırılabilir olacak.
sayfala functionu array() (dizi) olarak geri döner "veriler","sayfalar","toplamsayfa","toplamkayit" gibi bunların içinden veriler olanda bir array() dizidir ve istenilen kayıtları bu diziyi döngüye alarak yasfaya yazdıracağız.
// $_GET["sayfa"] ile hangi sayfada olduğumuzu alıyoruz bir sayı girilmemişse veya veri boş gelirse 1 sayıyoruz.
$sayfa = isset($_GET["sayfa"]) ? (int) $_GET["sayfa"] : 1;
//yazdırma SEÇİMİ (OBJ_ALL) kullandık sayfa başı (5) kayıt sonraki linklerin deseni (?sayfa=) sayfalama numaraları (3)lü sıra olsun
$sonuc = $bag->sayfala("OBJ_ALL", "haberler", "id,baslik,haber,tarih", "ORDER BY id ASC", array(), 5, $sayfa, "?sayfa=", 3);
// $sonuc["veriler"] dizi olduğu için döngü kurduk
foreach($sonuc["veriler"] as $satir) {
echo "Haber id: ".$satir->id."<br>Başlık: ".$satir->baslik."<br>Haber: ".$satir->haber."<br>Tarih: ".$satir->tarih;
echo "<hr>";
}
// Sayfalama yapacak olan kodlarımız
echo "<div class='sayfala'>";
echo $sonuc["sayfalar"];//sayfa sayilarini yazdirir (ilk onceki [-10]123[4]567[+10] sonraki son) seklinde
echo "</div><br>";
// Bazen kayıt sayısı sayfa sayısı gerekli olabilir kullanabileceklerimiz
echo $sonuc["toplamsayfa"]. " sayfada toplam " .$sonuc["toplamkayit"]. " kayit var, " .$sayfa. ". sayfadasınız.";
Kopyala
Sayfa numaraları güzel bir görüntü oluşturmadı class='sayfala' var kodlarda dikkatinizi çektiyse sayfaya asağıdaki css kodunu ekleyin kendinize göre düzenleyebilirsiniz renkleri v.s
<style>
.sayfala {
margin-top: 10px;
color: #000;
}
.sayfala, li {
cursor:pointer;
margin-right: 8px;
font-size: 12px;
display: inline-block;
padding: 5px 9px;
background-color: #efefef;
border: 1px solid #ccc;
border-radius: 3px
}
.sayfala, li:hover, li.current {
color: #000;background-color: #c9d2da;
} </style>
Kopyala
Kayıt sayımı ve sayısal işlemler
Şimdi de haberler tablosunda kaç kayıt var kaç kez okundular veya başlığı manşet olan veriler kaçtane gibi sayısal işlemleri yapalım burada tek kayıt çekmede kullandığımız mantığı kullanıyoruz ufak değişikliklerle.
cek("SEÇİM", "TABLO", "SÜTUNLAR", "KOŞUL", array(KOŞULDEĞERLERİ));
Kopyala
SEÇİM sayısal işlemler için ASSOC,OBJ veya NUM yerine KAYITSAY yazılıyoruz
SÜTUNLAR sayım yapacağımız türe göre SUM(okuma) , COUNT(id) gibi
TABLO, KOŞUL , KOŞULDEĞERLERİ önceki örneklerde olan mantıkla çalışıyor
Konuyu uzatarak bilgili arkadaşları ince detaylarla sıkmamak için örnekleri bir arada veriyorum
//haberler tablosunda kac kayit var
$say1 = $bag->cek("KAYITSAY", "haberler", "COUNT(id)", "", array());
echo "Tabloda " .$say1 . " haber var<br>";
//haberler tablosundaki okuma sutununda olan sayilari toplar
$toplam = $bag->cek("KAYITSAY", "haberler", "SUM(okuma)", "", array());
echo "Haberler " .$toplam. " defa okundu<br>";
//haberler tablosunda okuma sayısı 4 olan kac kayit var
$say2 = $bag->cek("KAYITSAY", "haberler", "COUNT(id)", "WHERE okuma=?", array(4));
echo "Okuma sayısı 4 olan " .$say2 . " haber bulundu<br>";
//baslik alaninda (Basligi 1) kelimesi gecen kac kayit var
$say3 = $bag->cek("KAYITSAY", "haberler", "COUNT(id)", "WHERE baslik LIKE ?", array("%Basligi 1%"));
echo "(Basligi 1) kelimesi gecen " .$say3 . " haber bulundu<br>";
Kopyala
Kayıt ekleme
Kayıt eklemek çok basit bir şekilde tamamlanıyor, kayıt eklendikten sonra eklenen kaydın id nosu döndürür aksi halde false döner ve ona göre işlem yapar veya uyarı veririrz.
ekle("TABLO", "sutun,sutun", array("sutundeğeri", "sutundeğeri"));
Kopyala
TABLO sadece veri gireceğimiz tablo adını yazıyoruz sütun ve sütun değerlerini veriyoruz
//haberler tablosunun baslik,haber,tarih ve okuma sütunlarına veriler ekleyerek bir kayıt oluşturalım
$ekle = $bag->ekle("haberler", "baslik,haber,tarih,okuma", array("Haberin Basligi", "Haber icerigi", date("Y-m-d H:i:s"), 0));
//$ekle bize yeni kaydın id no yu verecektir false dönerse kayıt varsa gibi durumlar için kontrolu yapalım
if ($ekle){
echo "Haber " .$ekle. " nolu id'e eklendi";
}else{
echo "Kayit eklenmedi";
}
Kopyala
Var olan kaydın güncellenmesi
Var olan kaydı güncelleme gerektiğinde kullanılacak kod örneği.
guncelle(TÜR, "TABLO", "SÜTUNLAR", "KOŞUL", array(SÜTUNDEĞERLERİ,KOŞULDEĞERLERİ));
Kopyala
TÜR , bir veya birden çok (koşullara bağlı) sütun içeriğini değişmek için 0 yazıyoruz.
// id numarası 10 olan kaydı güncelleyelim
$guncel = $bag->guncelle(0, "haberler", "baslik,haber", "WHERE id=?", array("Değişen Başlik", "Değişen Haber Iceriği", 10));
if ($guncel){
echo $guncel. ": haber guncellendi";
}else{
echo "haber guncellenmedi";
}
Kopyala
İşlem başarılı olduğu durumda guncelle functionu güncellediği kayıt sayısını döndürür aksi halde false olarak döner.
TÜR , (sayac haber okuma sayisi) gibi sutunlarda kullandigimiz önceki degere +1 eklemek için buraya 1 yazıyoruz böylece eski değeri 12 olan bir veri 1 artıyor yada artmasını istediğiniz kadar.
//id'si 10 olan haberin okuma sütunundaki sayıyı 1 arttıalım
$guncel = $bag->guncelle(1, "haberler", "okuma", "WHERE id=?", array(1, 10));
if ($guncel){
echo $guncel. ": haberin okuma sütunundaki sayı 1 arttırıldı";
}else{
echo "haber guncellenmedi";
}
Kopyala
İşlem başarılı olduğu durumda guncelle functionu güncellediği kayıt sayısını döndürür aksi halde false olarak döner.
Bir kaydı silmek için
Bir kaydı silmek için kullanılacak function örneği.
sil("TABLO", "KOŞUL", array(KOŞULDEĞERLERİ));
Kopyala
Açıklamam gereken detay olduğunu sanmıyorum üsttekileri okuyarak buraya geldiyseniz zaten bunlari biliyorsunuz kullanım şekli oldukça açık anlaşılır vaziyette sanırım onun için birkaç örnek kodu toplu şekilde veriyorum.
//haberler tablosunda id'si 10 olan kaydı sil
$sil = $bag->sil("haberler", "WHERE id=?", array(10));
if ($sil){
echo $sil. ": haber silindi";
}else{
echo "kayit YOK";
}
//haberler tablosunda id'si 12 ve 15 olan kayıtları sil
$sil = $bag->sil("haberler", "WHERE id=? AND id=?", array(12, 15));
if ($sil){
echo $sil. ": haber silindi";
}else{
echo "kayit YOK";
}
//haberler tablosundaki baslik alaninda manset kelimesi gecen kaylari silmek için
$sil = $bag->sil("haberler", "WHERE baslik LIKE ?", array("%manset%"));
if ($sil){
echo $sil. ": haber silindi";
}else{
echo "kayit YOK";
}
Kopyala
Doğrudan sorgu çalıştırmak
Genel anlamda Class hemen hemen tüm sık kullanılan sorgu türlerini çalıştırsa bile bazen farklı sorgu türleri kullanmak isteyebileceğinizi düşünerek bu functionu da ekledim sınıf tarafına.
Mesela bir tablodaki tüm veriyi boşaltmak AUTO_INCREMENT verileri sıfırlamak ve buna benzer class ta bulunmayan işlemler için kullanabilirsiniz siz sorguyu yazın PDO taraflı diğer işlemleri class yapacaktır.
Örnek kullanım
sorgu("SQL Sorgusunu koşular", array(KOŞULDEĞERLERİ));
Kopyala
Bir tablodaki tüm verileri boşaltmak için kullanılacak sorgu örneği.
$bag->sorgu("TRUNCATE TABLE haberler", array());
Kopyala
Doğrudan sorgu çalıştırmak için SQL cümlesini siz yazarsınız koşullarda yine ? kullanilir array ile değerler gönderilir.
Fakat burda yazdırma sınıfı belirtmediğimiz için sonuna ->fetch(PDO::FETCH_ASSOC) gibi ifadeler ekleyerek sonuçları $sorgu[ "baslik" ] seklinde yada diğer şekiller gibi yazdıracağımızı belirtmemiz gerekli.
Tek veri icin fetch(PDO::FETCH_ASSOC), fetch(PDO::FETCH_OBJ), fetch(PDO::FETCH_NUM) coklu veri icin fetchAll(PDO::FETCH_ASSOC), fetchAll(PDO::FETCH_OBJ), fetchAll(PDO::FETCH_NUM) sorguda count(*) veya sum(okuma) varsa fetchColumn() gibi PDO ile gelen ifadeleri belirtmemiz gerekli.
haberler tablosundan id no 5 olan kaydı alalım
//haberler tablosundan id no 5 olan kaydı alalım
$sorgu = $bag->sorgu("SELECT id,baslik,haber FROM haberler WHERE id=?", array(5))->fetch(PDO::FETCH_OBJ);
echo $sorgu->baslik;
Kopyala
Doğrudan sorgu çalıştırma durumu için birde döngülü örnek yapalım tablodaki verileri alalım
//haberler tablosundan okuma değeri 7 den büyük kayıtları alalım döngü ile sayfaya yazalım
$sorgu = $bag->sorgu("SELECT id,baslik,haber,tarih FROM haberler WHERE okuma>? ORDER BY id DESC", array(7))->fetchAll(PDO::FETCH_OBJ);
foreach($sorgu as $satir) {
echo "Haber id: ".$satir->id."<br>Başlık: ".$satir->baslik."<br>Haber: ".$satir->haber."<br>Tarih: ".$satir->tarih;
echo "<hr>";
}
Kopyala
Dikkat ettiyseniz sınıf functionu kodun sonuna ->fetchAll(PDO::FETCH_OBJ); gibi üstte verdiğim ifadelerden birini yazdık, bunu buraya yazmayıp alt satırda yazabilirdik sonuç aynı olacaktır.
$sorgu = $bag->sorgu("SELECT id,baslik,haber,tarih FROM haberler WHERE okuma>? ORDER BY id DESC", array(7));
$sorgu = $sorgu->fetchAll(PDO::FETCH_OBJ);
foreach($sorgu as $satir) {
echo "Haber id: ".$satir->id."<br>Başlık: ".$satir->baslik."<br>Haber: ".$satir->haber."<br>Tarih: ".$satir->tarih;
echo "<hr>";
}
Kopyala
Öyle sanıyorum ki bu php class PDO ile veritabanına bağlanarak yapmak istediğiniz her türlü veri çekme,güncelleme,silme,sayısal işlemler gibi ihtiyaçlarınızı fazlasıyla karsılayacaktır.
Yazı biraz uzun gibi görünebilir, class'ın yapabileceği işlemleri 2 sayfaya ayırmak istemedim toplu halde olmaları sizin için daha kolay olacaktır.
Benden bukadar kullanması size kalmış bir durum başka bir yazıda görüşmek üzere Hoşçakalın.
Mehmet İbrahim
Bir konuda yardım isteyeceğim. DB ve Dbclass doslarını include ettiğimizde çıktı HTML sayfamızda 6 satırlık boşluk oluşuyor. Bunu nasıl giderebiliriz?
Sorun büyük ihtimalle UTF 8 Bom veya Bom olmadan kodlanan dosyalardan kaynaklı indidiğin dosyaların kodlaması sadece UTF 8 sendeki dosyalar "Bom Olmadan UTF 8 Olarak" Kodlandı Notepad++ programıyla açarak üst menüde (Kodlama/Bom Olmadan UTF 8 Olarak Kodla) veya sadece (UTF 8 Olarak Kodla) daha doğrusu senin dosyaların nasıl kodlanmış ona da aynı menüden bakıp Dbclass dosyanı da aynı kodlamaya çevir
Not
Aynı sorunu cPanel dosya yöneticisinde zip arşivi olarak yükleyince dosyalarda senin soruna benzer bir sorun yaşadım arşivi açarken server taraflı bozulma olmuştu bunu da belirteyim dedim..
Ama yine de sizde bu durumdan dolayı dediğinize göre tekrar deneyeceğim. Sonuçla ilgili bilgi veririm.
Dediğin gibi yaptım, UT8 e Dönüştür seçeneğini kullandım ve kaydedim sayfayı yeniledim, tüm boşluklar yok oldu.
Teşekkürler...
Birçok sitede PDO kullanımıyla ilgili yazılar okudum ama bu sayfadaki kadar işime yarayan ve anlayabildiğim olmadı.
Yıllardır PHP bilmeme rağmen diğer sayfalardaki sayfalama kodlarını bir türlü doğru çalıştıramadım ama buradakinde doğru objeleri ve tablo adını değiştirip hemen listeye ulaştım.
Şimdi eski sayfamdaki CSS leri bu kodların içine uygulama işim kaldı sadece.
Class çok kullanışlı ve günümüzde bile hala en doğru yöntem buradaki.
Mesela çoğu yerde prepare kullanmayı bile göstermemişlerdi.
Tekrar teşekkür eder, saygılar sunarım...
Bu veritabanı sınıfını kullanarak ufak bir site yapmaya başladım.
Fakat şöyle bir sorunum var.
Çoklu veri çekmek hakkındaki kodunuzu aynen kullandım, veriyi çektim, listeledim fakat veri yoksa kayıt yok dedirtemedim bir türlü.
*************************************************
***********************************************
Yukarıdaki kodu kullandım.
Buna kayıt yoksa kayıt yok nasıl dedirtiriz.
Neresine ne ekleyeeğiz, beceremedim.
Örnek verdiğiniz kodun hemen altında aşağıdaki kontrolü yaparsanız istediğiniz olur
Veritabanı sınıfındaki aklıma takılan bir konuyu dile getirmek için yazıyorum. Bir öneri veya çözümü olanın yazmasını rica ederim.
Sayfalama sorgusunda sayfa adlı bir değişken oluşturup, ona göre URL den GET ile sayfayı alıp sayfalama işlemi yapılıyor.
Fonksiyon içerisinde URL deki sayfa değerine olmayan bir sayfa yazılırsa ilk sayfaya git gibi kontroller var ama farklı durumlar kontrol edilemiyor gibi görüyorum veya benim yaptığım bir hata olabilir diye düşünüyorum.
Örneğin : 5 sayfalık bir sayfalamada alttaki bilgilendirme kısmında
şeklinde yazan yere
yazdırmak için URL deki sayfa sayısının yanına bu 200000000000000000000000000000000000 değerini yazıp enter a basmak yetiyor.
Bir hata yoksa benim kullandığım sayfada öyle oluyor.
Çok da önemli bir sorun değil ama ne yapabilirim acaba diye aklıma takıldı, o yüzden yazdım, belki ben bir yerini bozmuşumdur dedim.
Fikri olan var mıdır?
Saygılar...
alttaki ile değiştirin
artık bulunduğunuz sayfayı yazdırmak için $_GET ile alınan değer yerine, şu an $sonuc["simdikisayfa"] sayfadasınız şeklinde yazdırabilirsiniz
Kolaygelsin
şeklinde düzelttim, sorun ortadan kalktı.
Artık URL den birşey girilse de sayfada yazılamıyor, güzel oldu.
Teşekkür ederim.
benim sorum kategoriye göre sayfalama yapsak yani koşullu sayfalama nasıl yaparız böyle bir fonksiyon yazabilirmisiniz db class a
şimdiden yardımlarınız için teşekkür ederim
Koşulu sorgunun kendisinde tanımlamanız gerekli
$sonuc = $bag->sayfala("OBJ_ALL", "haberler", "id,baslik,haber,tarih", "ORDER BY id ASC", array(), 5, $sayfa, "?sayfa=", 3);
sorgusunda ORDER BY id ASC yerine WHERE kategori=? ORDER BY id ASC ve array() içinde de kategori id nosunu alırsanız istediğiniz olacaktır altaki kod örnektir
$sonuc = $bag->sayfala("OBJ_ALL", "haberler", "id,baslik,haber,tarih", "WHERE kategori=? ORDER BY id ASC", array(57), 5, $sayfa, "?sayfa=", 3);
alttaki örnekte ise çift koşul kullanıldı
$sonuc = $bag->sayfala("OBJ_ALL", "haberler", "id,baslik,haber,tarih", "WHERE kategori=? AND okunma>? ORDER BY id ASC", array(57, 10), 5, $sayfa, "?sayfa=", 3);
çalışmalrınız ve kısa sürede cevap vermeniz çok güzel gerçekten. tekrar saoğolun kolay gelsin...
dediğinizi yaptım fakat şöyle bir sorunla karşılaştım
########
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.*******.com$
RewriteRule ^(.*)$ http://*******.com/$1 [L,R=301]
RewriteRule ^([0-9a-zA-Z-_]+).html$ index.php?do=konu&link=$1
RewriteRule ^kategori/([0-9a-zA-Z-_]+)(/?)$ index.php?do=kategori&link=$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([0-9a-zA-Z-_]+)(/?)$ index.php?do=$1
##########
böyle bir htaccess dosyası var bende normalde kategoriye göre verileri sayfalatmadığımda gayet güzel sayfalama yapıyor. ama
kategoriye göre sayfalama yaptığımda maalesef 2. sayfaya tıkladığımda
******/vazoda-cicek?go=kategori_urunler&sayfa=2
oluyor ama veri tabanından resimler gelmiyor ve tıklanmamış gibi oluyor. Acaba Bu sorun için bana yardımcı olabilirmisiniz. Saygılarımla
gibi oluyor anlatmaya çalıştığım bunu nasıl çözeriz acaba
Kodları gönderin bir bakayım bu şekilde ben de karıştım ya php tarafında kategori adini alırken hatanız var ya da htaccess dosyan php tarafı ile uyumlu olmuyor
Kodları gönderiyorum mailinize Allah razı olsun saolun
Yine bir PDO sorusuyla karşınızdayım.
PDO Veritabanı Sınıfını daha önce birkaç siteme eklemiştim. Fakat yönetim paneli yapmaya üşendiğim için veri ekleme kısmını kullanmamıştım.
Veri Ekleme konusunda bir yerde takıldım, kafam durdu sanırım.
mysql_query deki gibi id yerine NULL falan yazıyor muyuz?
Kaydedilecek değerleri değişkenlere atadığım için array kısmındaki değişkenleri nasıl yazacağımı becerememiş olabilirim.
array daki değişkenleri '$degisken_adi','$degisken_adi','$degisken_adi' şeklinde mi,
yoksa direkt olarak $degisken_adi,$degisken_adi,$degisken_adi şeklinde mi
yazmakta hata yapmış olabilirim.
Sorgu hatası da vermiyor. Veya ben hataları kapatmışsam ondan vermiyordur.
Sorgum Şöyle :
Muhtemelen saçma bir hata yaptım ve ondan çalışmıyordur.
Senden bir yorum ve öneri alabilir miyim Mehmet Ustam.
Saygılar...
HATALI: '$degisken_adi'
DOĞRU: $degisken_adi
tüm array larda olduğu gibi , virgül ile de ayrılmalı değişkenler.
Sorgunuzdaki değişken adlarını doğru yazdığınızdan emin olun boş veri geliyor olabilir.
id yerine NULL falan yazmanız gerekmez AUTO_INCREMENT olarak belirtilen id alanını mysql veri ekleme anında kendi bir sonraki noya günceller.
Çözüme ulaşmak için Sorgunuzun önüne // ekleyip kapatın tüm değişkenleri echo ile sayfaya yazdırıp gelen verilerin doğru mu sağlamasını yapın veritabanında urun_kat,urun_date,urun_adi,urun_resim,urun_metin,urun_ekleyen alanlarının bir kısmı (NOT NULL) boş olamaz ayarlanıp ta veri boş gelirse sorun olabilir, ayrıca bu şekilde gerçekten sorgunun olduğu yere gelip gelmediğinizi de tespit etmiş olursunuz belki formu gönderirken hatalı bir adrese yönlendiniz.
Mutlu yıllar Kolaygelsin