• 14-09-2016, 00:16:58
    #1
    Neden böyle bir şeye ihtiyaç var diye düşünebilirsiniz belki. Ama acemi ve yeni öğrenen arkadaşlar için böyle bir şey paylaşmak istedim. PDO çok fazla kafa karıştıracak bir şey değil aslında ama öğrenme sürecinde sıkıntı çıkarabiliyor.

    Aşağıdaki sınıf oldukça basit ve kullanışlı. Hemen göstereyim:

    BasitPDO.php
    <?php
    
    /**
     * Basit bir veritabanı sınıfı
     * Sorguları çalıştırır
     * PDO ile fetch, fetchAll, fetchColumn ... gibi metodlar
     * zincirleme çalıştırılabilir ve kullanılabilir.
     * 
     * @link http://demirphp.com
     * @author Yılmaz Demir <demiriy@gmail.com>
     */
    class BasitPDO
    {
    	/**
    	 * PDO sınıfını tutar
    	 * @var void
    	 */
    	public static $pdo;
    	/**
    	 * PDO bağlantısını kurar
    	 * @param void $pdo
    	 */
    	public function __construct(\PDO $pdo)
    	{
    		self::$pdo = $pdo;
    	}
    	/**
    	 * Sorgu çalıştırır
    	 * @param string $query
    	 * @return void
    	 */
    	public static function query($query)
    	{
    		if (!self::$pdo instanceof \PDO) {
    			throw new \Exception('PDO bağlantısı yapılmamış');
    		}
    		$stmt = self::$pdo->prepare($query);
    		$args = array_slice(func_get_args(), 1);
    		if (isset($args[0]) && is_array($args[0])) {
    			$stmt->execute($args[0]);
    		} else {
    			$stmt->execute($args);
    		}
    		return $stmt;
    	}
    }
    Yukarıdaki dosyayı kaydedelim. Öncelikle veritabanı ayarını yapalım.

    Connection.php
    <?php
    $pdo = new \PDO('mysql:host=localhost;dbname=database;charset=utf8', 'kullaniciadi', 'sifre');
    $basit_pdo = new BasitPDO($pdo);
    Ne yapmak istiyorsunuz? Veritabanından bir tek gönderi mi birden fazla gönderi mi çekmek istiyorsunuz? Bütün haberleri çekelim:

    Haberler.php
    require 'Connection.php';
    $haberler = BasitPDO::query('SELECT * FROM haberler WHERE onaylanmis=?', 'evet')->fetchAll();
    
    foreach ($haberler as $key => $haber) {
    	echo $haber['baslik'] . '<br>';
    }
    Haber.php?id=5
    require 'Connection.php';
    $id = $_GET['id'];
    $haber = BasitPDO::query('SELECT * FROM haberler WHERE id=?', $id)->fetch();
    echo $haber['baslik'];
    HaberSayisi.php
    require 'Connection.php';
    $haberSayisi = BasitPDO::query('SELECT * FROM haberler')->rowCount();
    // ya da
    $haberSayisi = BasitPDO::query('SELECT COUNT(id) FROM haberler')->fetchColumn();
    echo $haberSayisi;
    Ekleme/Düzenleme/Silme
    require 'Connection.php';
    $ekle = BasitPDO::query('INSERT INTO haberler (baslik, icerik) VALUES (:baslik, :icerik)', [':baslik' => 'Başlık', ':icerik' => 'İçerik']);
    $duzenle BasitPDO::query('UPDATE haberler SET baslik=:baslik WHERE id=:id', [':baslik' => 'Yeni Başlık', ':id' => $_GET['id']]);
    $sil = BasitPDO::query('DELETE FROM haberler WHERE id=?', $_GET['id']);
    Bu işin onlarca farklı tekniği, kullanım biçimi vs. vardır. Bu sadece bir tanesi. Umarım işinize yarar. Sorularınızı sormaktan çekinmeyin.
  • 18-09-2016, 12:04:03
    #2
    PDO'yu baştan aşağı öğrenebileceğim bir kaynak biliyor musunuz? mysql'dan bıktım artık, PDO'yu öğrenebilirsem her şey daha kolay olacak sanırım.

    yidemir adlı üyeden alıntı: mesajı görüntüle
    Neden böyle bir şeye ihtiyaç var diye düşünebilirsiniz belki. Ama acemi ve yeni öğrenen arkadaşlar için böyle bir şey paylaşmak istedim. PDO çok fazla kafa karıştıracak bir şey değil aslında ama öğrenme sürecinde sıkıntı çıkarabiliyor.

    Aşağıdaki sınıf oldukça basit ve kullanışlı. Hemen göstereyim:

    BasitPDO.php
    <?php
    
    /**
     * Basit bir veritabanı sınıfı
     * Sorguları çalıştırır
     * PDO ile fetch, fetchAll, fetchColumn ... gibi metodlar
     * zincirleme çalıştırılabilir ve kullanılabilir.
     * 
     * @link http://demirphp.com
     * @author Yılmaz Demir <demiriy@gmail.com>
     */
    class BasitPDO
    {
    	/**
    	 * PDO sınıfını tutar
    	 * @var void
    	 */
    	public static $pdo;
    	/**
    	 * PDO bağlantısını kurar
    	 * @param void $pdo
    	 */
    	public function __construct(\PDO $pdo)
    	{
    		self::$pdo = $pdo;
    	}
    	/**
    	 * Sorgu çalıştırır
    	 * @param string $query
    	 * @return void
    	 */
    	public static function query($query)
    	{
    		if (!self::$pdo instanceof \PDO) {
    			throw new \Exception('PDO bağlantısı yapılmamış');
    		}
    		$stmt = self::$pdo->prepare($query);
    		$args = array_slice(func_get_args(), 1);
    		if (isset($args[0]) && is_array($args[0])) {
    			$stmt->execute($args[0]);
    		} else {
    			$stmt->execute($args);
    		}
    		return $stmt;
    	}
    }
    Yukarıdaki dosyayı kaydedelim. Öncelikle veritabanı ayarını yapalım.

    Connection.php
    <?php
    $pdo = new \PDO('mysql:host=localhost;dbname=database;charset=utf8', 'kullaniciadi', 'sifre');
    $basit_pdo = new BasitPDO($pdo);
    Ne yapmak istiyorsunuz? Veritabanından bir tek gönderi mi birden fazla gönderi mi çekmek istiyorsunuz? Bütün haberleri çekelim:

    Haberler.php
    require 'Connection.php';
    $haberler = BasitPDO::query('SELECT * FROM haberler WHERE onaylanmis=?', 'evet')->fetchAll();
    
    foreach ($haberler as $key => $haber) {
    	echo $haber['baslik'] . '<br>';
    }
    Haber.php?id=5
    require 'Connection.php';
    $id = $_GET['id'];
    $haber = BasitPDO::query('SELECT * FROM haberler WHERE id=?', $id)->fetch();
    echo $haber['baslik'];
    HaberSayisi.php
    require 'Connection.php';
    $haberSayisi = BasitPDO::query('SELECT * FROM haberler')->rowCount();
    // ya da
    $haberSayisi = BasitPDO::query('SELECT COUNT(id) FROM haberler')->fetchColumn();
    echo $haberSayisi;
    Ekleme/Düzenleme/Silme
    require 'Connection.php';
    $ekle = BasitPDO::query('INSERT INTO haberler (baslik, icerik) VALUES (:baslik, :icerik)', [':baslik' => 'Başlık', ':icerik' => 'İçerik']);
    $duzenle BasitPDO::query('UPDATE haberler SET baslik=:baslik WHERE id=:id', [':baslik' => 'Yeni Başlık', ':id' => $_GET['id']]);
    $sil = BasitPDO::query('DELETE FROM haberler WHERE id=?', $_GET['id']);
    Bu işin onlarca farklı tekniği, kullanım biçimi vs. vardır. Bu sadece bir tanesi. Umarım işinize yarar. Sorularınızı sormaktan çekinmeyin.
  • 18-09-2016, 14:56:03
    #3
    muhammedaksam adlı üyeden alıntı: mesajı görüntüle
    PDO'yu baştan aşağı öğrenebileceğim bir kaynak biliyor musunuz? mysql'dan bıktım artık, PDO'yu öğrenebilirsem her şey daha kolay olacak sanırım.
    Baştan aşağıya uygulayabileceğin metodlar zaten yazdıklarım arasında. Veri çek, veri listele, ekle, sil, güncelle. Daha ne olsun?

    Ha, çıktı türlerini değiştirmek (assoc, both vs.), istisna kontrolü vs. işlemleri sonrası için.
  • 18-09-2016, 17:14:30
    #4
    mysql verı tabanı olmadan, onun verıne verılerı saklamak ıcın php dosyayımı kullanıyor bu sistem dogru mu anladım hocam
  • 22-09-2016, 06:54:21
    #5
    mikoc adlı üyeden alıntı: mesajı görüntüle
    mysql verı tabanı olmadan, onun verıne verılerı saklamak ıcın php dosyayımı kullanıyor bu sistem dogru mu anladım hocam
    Yok hocam gene database'de işlem yapıyorsun sadece mysql kodlarını kullanmıyorsun.
  • 22-09-2016, 12:29:05
    #6
    PDO'nun bu şekilde kullanılması ; olası sql açılarını da beraberinde getirir. Şu halde klasik mysql_* kullanımından farksız bir biçimde çalışır.
  • 22-09-2016, 12:34:02
    #7
    onurkun adlı üyeden alıntı: mesajı görüntüle
    PDO'nun bu şekilde kullanılması ; olası sql açılarını da beraberinde getirir. Şu halde klasik mysql_* kullanımından farksız bir biçimde çalışır.
    Bunu neye dayanarak söylüyorsunuz? Bu sistemin nasıl çalıştığı hakkında fikriniz var mı yoksa ezbere mi konuşuyorsunuz.

    Bu yazdığım sınıf, sorguyu PDO aracılığıyla hazırlar, sonrasında parametreleri vererek sorguyu çalıştırır. Bu durum SQL Injection açıklarına bir çözümdür.

    800+ satırlık veritabanı sınıfımda bile bu yöntemi kullanıyorum. Lütfen yazdıklarınıza dikkat edin.
  • 22-09-2016, 12:47:24
    #8
    yidemir adlı üyeden alıntı: mesajı görüntüle
    Bunu neye dayanarak söylüyorsunuz? Bu sistemin nasıl çalıştığı hakkında fikriniz var mı yoksa ezbere mi konuşuyorsunuz.

    Bu yazdığım sınıf, sorguyu PDO aracılığıyla hazırlar, sonrasında parametreleri vererek sorguyu çalıştırır. Bu durum SQL Injection açıklarına bir çözümdür.

    800+ satırlık veritabanı sınıfımda bile bu yöntemi kullanıyorum. Lütfen yazdıklarınıza dikkat edin.
    Selamlar, GitHub'da yazdığınız sınıfı inceleme şansım olmadı müsait bir vaktimde ona bakarım. Bahsettiğim olay tam olarak şudur ; http://stackoverflow.com/a/12202218 ve emin olun ezbere konuşmuyorum. Yazdığımız yüksek trafikli ve büyük projelerde deneyim edilip görülmüştür.
  • 22-09-2016, 13:10:15
    #9
    Stackoverflow bağlantısındaki senaryoyu tam okumamışsınız sanırım. Farklı karakter setlerinde ve güncel olmayan PHP & MySQL sürümleri için geçerli. Türkçe için mecburen UTF-8 karakter seti kullanılmak zorunda, bu kendini dayatıyor (ki bu da güvenli olanı). GBK karakter seti sanırım çince karakterleri kapsıyor. Bu yüzden boşuna dert etmeyin.

    Elbette ki bu yöntem 100% güvenli bir yöntem demiyorum Stackoverflow'daki cevaplayan arkadaş gibi. Ancak -şu an- için kullanılabilir en güncel ve güvenli yöntem diyebilirim.

    Sevgiler.