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
Levent Yıkılmaz 15 Ekim 2015, 18:18
Paylaşımınız için teşekkür ederim.
Yanıtla
0
Mehmet Yıldırım 25 Ekim 2015, 12:47
pdo hatalarını nasıl yazdırabiliriz.
Yanıtla
1
Onur DeğerYazar 25 Ekim 2015, 14:57
@Mehmet Yıldırım ;
Konu içeriği güncelledim. PDO hatalarını nasıl yazdırabileceğinizi konu içerisinden görebilirsiniz. İyi çalışmalar.
Yanıtla
0
talat güneş 02 Kasım 2015, 14:20
$ad=Talat;
$sorgu=db->prepare(SELECT from USERS WHERE name=:ad);
$sorgu->bindParam(:ad,$ad);

giden sql sorgusunu görebileceğim bir komut var mı?

noutputu şu şekilde verecek olan:
SELECT from USERS WHERE name=Talat
...gib???

**tek tırnakları kaldırdım mesajdan.
Yanıtla
0
talat güneş 02 Kasım 2015, 14:21
prepare ve bindParam kullanarak hazırladığım giden RAW sql sorgusunu görebileceğim bir komut var mı?
Yanıtla
0
Onur DeğerYazar 02 Kasım 2015, 15:01
@Talat Güneş;
Böyle bir komut olduğunu sanmıyorum. phpmyadminde komutlar gösteriliyor fakat orada ne işlem yaptıysanız onun komutları gösteriliyor(ekleme, silme, güncelleme). Bu konuda pek bişey bulamadım araştırmamda. Ancak yineden yeni bir şeyler bulursam paylaşırım.
Yanıtla
3
Diğer İnsan 01 Ekim 2016, 21:04
Gerçekten de çok teşekkür ederim. Sizin sayenizde nasıl PDO kullanılacağıın anladım. Tekrar çok teşekkür ederim. Başarılar dilerim..
Yanıtla
0
Veli KÜRK 17 Ekim 2016, 13:10
paylaşımınız için teşekkürler faydalı bir yazı olmuş.
Yanıtla
0
abdulkadir 12 Kasım 2016, 17:29
merhaba ben insert işlemini yaptım fakat çözemediğim bir durum söz konusu.

menülerim var ve menü ekle diye bir bölümüm var şimdi ben sizin göstermiş olduğunuz gibi yaptığımda menu-ekle.php çağırdığımda bile ekleme yapıyor. direk olarak ekleme işlemi başarılı olarak geliyor ve veritabanına ekliyor
0
onur değerYazar 13 Kasım 2016, 15:35
Merhaba,
tam olarak sorunun ne olduğunu anlamadım.
2
Murat 11 Aralık 2016, 22:06
if ile kontrol ettırt ozman eklemez

ornek ad formu postlandımı yazdır vs
Yanıtla
0
Eray Tekin 22 Kasım 2016, 01:45
Hocam iyi günler ve iyi çalışmalar ben bir konuya değineceğim.

Pdo ile class veri tabanı fonksiyonu hazırlayabilirmisiniz.

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 0 + 7 = ?
Onur Değer - Kişisel Blog © 2015 - 2016 | Tüm hakları saklıdır. DMCA.com Protection Status