Anasayfa KonularKonuPHP Data Objects (PDO) Kullanımı

PHP Data Objects (PDO) Kullanımı

16 Eylül 2015, 22:26 Php Dersleri Ve Kodları 11 Yorum
0
PHP Data Objects (PDO) Kullanımı

PDO nedir?

PHP'deki veritabanlarına erişmek için hafif ve tutarlı bir arayüz tanımlar. Bu sınıf arayüz tanımı bulunan her veritabanı ile rahatlıkla çalışabilir.

Veritabanı bağlantısı nasıl yapılır?

 

<?php 
	## Veritabanı bağlantısı
	$host = "localhost";
	$hesap = "root";
	$sifre = "";
	$vt_adi = "haber";
	try{
		$baglan = new PDO ("mysql:host=$host;dbname=$vt_adi;charset=utf8",$hesap,$sifre);
	}
	catch(PDOException $e){
		echo $e->getMessage();
	}
	
	## Karakter seti ayarla
	$baglan->exec("SET CHARACTER SET utf8");
	$baglan->exec("SET NAMES utf8");
?>

exec() Metodu

SQL deyimini çalıştırır ve etkilenen satır sayısını döndürür. Ekleme, silme, güncelleme işlemlerinde kullanılır. Ancak bu SQL işlemleri güvenli değildir.

Örnek exec() kullanımı


<?php 
	## Veri Ekleyelim
	$haber_ekle = $baglan->exec("INSERT INTO haberler(haber_baslik,haber_detay) VALUES ('Deneme Haber Başlık','Deneme Haber Detay')");
	
	## Etkilenen satır sayısını döndürelim
	echo $haber_ekle." haber eklendi.";
?>

Aynı işlemler silme ve güncelleme içinde geçerlidir.

ÖNEMLİ!


<?php 
	$haber_sil = $baglan->exec("DELETE FROM haberler WHERE haber_id = '1'");
	if(!$haber_sil){
		//Yanlış Kullanım! Bu verinin silinmediği bilgisini vermez.
	}
	
	if($haber_sil == FALSE){
		//Doğru kullanım, veri silinmediğinde FALSE sonucu döner
	}
?>

query() Metodu

SQL sorugusunu çalıştırıp, tablodaki verileri bir dizi olarak geri döndürür.

$sonuc->query(SQL,sonuc biçimi) herhangi bir sonuç biçimi girilmezse varsayılan olarak PDO::FETCH_BOTH kullanılır.

Kullanılan sonuç biçimleri

PDO::FETCH_ASSOC = Sütun isimlerine göre bir değer döndürür.

PDO::FETCH_BOTH = Varsayılandır. Hem sütun isimlerine hemde indislere göre bir değer döndürür.

PDO::FETCH_BOUND = Sütun değerlerini bindColumn() ile PHP değişkenlerine aktarır ve TRUE değeri döner.

PDO::FETCH_NUM = Sütun numaralarına göre indisli bir dizi dönderir.

En çok kullanılabicek sonuç biçimlerini listeledim.

Prepare() Metodu

Prepare() çalıştırılmak üzere bir SQL sorgusun hazırlar. Prepare() metodu bind_param(), execute(), bindColumn(), bindValue() metdolarıyla birlikte çalışabilir. Prepare() metodu ile SQL sorgularınız son derece güvenli çalışmaktadır. Prepare() metodu ile iki türlü tanımalama yapılır. Biri ":" ile diğeri ise "?" ile tanımlama yapılır. Burada sadece fikir vermesi amacıyla bir örnek vereceğim. Detaylı örneği ise execute() metodunu kullanırken vereceğim.

? işareti ile kullanım


<?php 
	$sorgu = $baglan->prepare("SELECT * FROM haberler WHERE haber_id = ?");
?>

: işareti ile kullanım


<?php 
	$sorgu = $baglan->prepare("SELECT * FROM haberler WHERE haber_id = :id");
?>

bindParam() Metodu

bindParam() metodu prepare() metodu ile hazırlanan SQL sorgusunda ? veya :isim ile belirtilen parametrelerin hazırlanmasında kullanılır. Kısacası bir kayıt yapacağınız zaman bu verilerin tiplerini kendimiz belirleyebiliriz (string ifade, integer ifade vb.).

bindParam() metodunda kullanılan veri tipleri

PDO::PARAM_INT = SQL integer (sayısal) veri türünü ifade eder.

PDO::PARAM_STR = char, varchar gibi ifadelerdir.

PDO::PARAM_NULL = NULL (boş) bir değeri ifade eder.

: işareti için bir örnek;


<form action="" method="post">
	<input type="text" name="kullanici_adi" />
	<input type="password" name="sifre" />
	<button type="submit">Giriş Yap</button>
</form>


<?php 
	if($_POST){
	$k_adi = trim($_POST["kullanici_adi"]);
	$k_sifre = trim($_POST["sifre"]);
	if($k_adi && $k_sifre){
		$sorgu = $baglan->prepare("SELECT * FROM uyeler WHERE ad = :kullanici_adi and sifre = :password");
		$sorgu->bindParam(':kullanici_adi', $k_adi, PDO::PARAM_STR);
		$sorgu->bindParam(':password', $k_sifre, PDO::PARAM_STR);
		$sorgu->execute(); //Sorguyu çalıştır.
		if($sorgu->rowCount() > 0){ //rowCount() ile etkilenen satır sayısını bulduk.
			echo "giriş başarılı!";
		}
		else{
			echo "giriş başarısız!";
		}
	}
	else{
		echo "Boş alan bırakmayınız...";
	}
}
?>

execute() Metodu

prepare() sorgusu ile hazırlanan bir SQL sorgusunu çalıştırır. Aldığı ikinci bir parametre ilede ? veya :deger parametrelerini değişkenlere bağlar.

execute() için birinci örnek;


<?php 
	$sorgu = $baglan->prepare("SELECT * FROM haberler");
	$sorgu->execute();	
?>

execute() için ikinci örnek;


<?php 
	$kullanici_adi = trim($_POST["kullanici_adi"]);
	$sifre = trim($_POST["sifre"]);
	$sorgu = $baglan->prepare("SELECT * FROM uyeler WHERE kullanici_adi = ? && sifre = ?");
	$sorgu->execute(array($kullanici_adi,$sifre));
?>

execute() için üçüncü örnek;


<?php 
	$kullanici_adi = trim($_POST["kullanici_adi"]);
	$sifre = trim($_POST["sifre"]);
	$sorgu = $baglan->prepare("SELECT * FROM uyeler WHERE kullanici_adi =:ad && sifre =:password");
	$sorgu->execute(array(
		':ad' => $kullanici_adi,
		':password' => $sifre
	));
?>

bindColumn() Metodu

Bu metod ile sütun başlıklarına istediğimiz değişkenleri atayarak kullanabiliriz.

bindColumn() örnek kullanımı;


<?php 
	$haber_id = 10;
	$sorgu =  $baglan->prepare("SELECT * FROM haberler WHERE haber_id = ?");
	$sorgu->execute(array($haber_id));
	$sorgu->bindColumn('haber_baslik',$degiskenim);
	$sorgu->fetch(PDO::FETCH_BOUND);
	echo $degiskenim;
?>

Yukarıda kullandığımız fetch() metodu ile sonuçları farklı biçimlerde elde edebiliriz.

Select (Seçme) İşlemi


<?php 
	$haberler = $baglan->query("SELECT * FROM haberler");
	$haber = $haberler->fetch(PDO::FETCH_ASSOC);
	echo $haber["haber_baslik"];
?>

 
Select (Seçme) İşlemi Çoklu

<?php 
	$haberler = $baglan->query("SELECT * FROM haberler",PDO::FETCH_ASSOC);
	foreach($haberler as $haber_yaz){
		echo $haber_yaz["haber_baslik"]."<br />";
	}
?>

 
Insert (Ekleme) İşlemi

<?php 
	$haber_baslik = trim($_POST["haber_baslik"]);
	$haber_detay = trim($_POST["haber_detay"]);
	$haber_ekle = $baglan->prepare("INSERT INTO haberler (haber_baslik,haber_detay) VALUES(?,?)");
	$ekle = $haber_ekle->execute(array($haber_baslik,$haber_detay));
	if($ekle == TRUE){
		echo 'Haber başarılı bir şekilde eklendi';
	}
	else{
		echo 'Haber eklenirken bir hata oluştu.';
	}
?>

 
Delete (Silme) İşlemi

<?php 
	$haber_id = trim($_GET["haber_id"]);;
	$haber_sil = $baglan->prepare("DELETE FROM haberler WHERE haber_id = ?");
	$sil = $haber_sil->execute(array($haber_id));
	if($sil == TRUE){
		echo "Haber başarılı bir şekilde silindi.";
	}
	else{
		echo "Haber silinirken bir hata oluştu.";
	}
?>

Update (Güncelleme) İşlemi

<?php 
	$haber_baslik = trim($_POST["haber_baslik"]);
	$haber_detay = trim($_POST["haber_detay"]);
	$haber_id = trim($_GET["haber_id"]);
	$haber_guncelle =  $baglan->prepare("UPDATE haberler SET 
	haber_baslik = ?,
	haber_detay = ? WHERE haber_id = ?");
	$guncelle = $haber_guncelle->execute(array($haber_baslik,$haber_detay,$haber_id));
	if($guncelle == TRUE){
		echo "Haber başarılı bir şekilde güncellendi.";
	}
	else{
		echo "Haber güncellenirken bir hata oluştu.";
	}
?>

errorInfo() ile Hataları Yazdırma

<?php 
	$sql = $baglan->prepare('SELECT * FROM haberler');
	$sql->execute();
	if($sql->errorCode() == 0){
		//hata yoksa yapılacak işlemler
	}
	else{
		$hata = $sql->errorInfo();
		echo($hata[2]); // Hatayı ekrana yazdır.
	}
?>

Veritabanı bağlantısı sonlandırma

<?php 
	$baglan = null;
?>

 
Güvenlik
Mysql'de dışarıdan gelen bilgileri ancak filitreleyerek veritabanına kaydediyor ya ya veritabanında değişiklikler yapabiliyorduk. Ancak PDO'da öyle bir sıkıntı yok. Örnek vermek gerekirse;

site.com/index.php?uye_id=10 burada ID'si 10 olan üyenin bilgilerini MYSQL ile düzenlemek isteseydik büyük bir ihtimal ile SQL injeksiyon yerdik. Ancak PDO'da prepare() ile böyle bir durum söz konusu değildir.

PDO kullanımını oldukça geniş anlatmaya çalıştım. Umarım faydalı olur, iyi çalışmalar.

Sonraki konu Blog Yazmak ile ilgili bilgiler vermektedir.
Başlıca Yorumlar
Yanıtla
0
hikmet nuri 04 Mayıs 2017, 14:15
veri tabanı görüntüsü atarmsın haber sitesinin

Yorum Yap

Ad - Soyad (Gerçek ad ve soyadınızı giriniz) Varsa İnternet Sitesi ÖR: (http://onurdeger.com.tr) Görüşünüz
Güvenlik Sorusu 8 + 8 = ?
Onur Değer - Kişisel Blog © 2015'ten bu yana... | Tüm hakları saklıdır. DMCA.com Protection Status