PDO Hakkında Birkaç Soru

Merhaba arkadaşlar:
PDO hakkında birkaç sorum var sizlere.

- $db = new PDO("..."); şeklinde bir bağlantı oluşturduk. Ayar dosyamızı index'e include ettiğimiz halde bağlantı değişkenine ulaşmak için global $db şeklinde yazmamız gerekiyor mu? Çünkü ben ayar dosyamı dahil ettiğim halde fonksiyon içinde global $db yazmayınca ulaşamıyorum bağlantı değişkenine.

- Kullanıcıdan ya da formlardan ID gibi bir değer gelmiyorsa prepare() kullanmak doğru mu yoksa query() mi kullanılmalı?

- execute() ile bindParam() arasındaki fark nedir? Ben php.net sitesinde inceledim ama pek bir şey anlayamadım.

- Listeleme yaparken performans bakımından foreach mı daha performanslı yoksa while mi?

Örnek ayar.php sayfam. Sizce hata var mı?

<?php
	ob_start();
	session_start();
	header("Content-Type: text/html; charset=utf-8");

	### Hataları Gizle ###
	error_reporting(1);

	### Bağlantı Değişkenleri ###
	$host 	= "localhost";
	$user 	= "root";
	$pass 	= "";
	$dbase 	= "pdoblog";

	### MySql Bağlantısı ###
	try{
		$db = new PDO("mysql:host=$host;dbname=$dbase;charset=utf8", $user, $pass);
		$db->query("SET CHARACTER SET utf8");
	}catch(PDOException $e){
		echo "Bağlantı sağlanamadı!<br>".$e->getMessage();
	}
	
	
	### Genel Ayarlar ###
	$AyarBul = $db->prepare("SELECT * FROM ayarlar");
	$AyarBul->execute();
	$Ayar = $AyarBul->fetch(PDO::FETCH_ASSOC);
	

	### Sabitler ###
	define("PATH" , realpath("."));
	define("SITE_DURUM" , $Ayar["site_durum"]);
	define("SITE_URL" , $Ayar["site_url"]);
	define("SITE_LIMIT" , $Ayar["site_sayfa_limit"]);
	define("SITE_MAKALE_EKLE" , $Ayar["site_makale_ekleme"]);
	define("TEMA_URL" , "temalar/".$Ayar["site_tema"]);
	define("TEMA" , $Ayar["site_tema"]);
?>

 

1. Verdigin kod ornegine bakarak global ile isin yok diyebilirim. Dikkat etmen gereken, degiskenlerin database baglantisi yaptigin satirdan once tanimlanmis / eklenmis olmasi gerekiyor. global'a cevabimin sonunda tekrar deginecegim. Bu arada verdigin kod ornegine deginmisken error_reporting(1) hatalari gizlemiyor, error_reporting(0) gizliyor. Buraya goz atmani oneririm.

2. $db->prepare("SELECT * FROM ayarlar"); bunun icin prepare() kullanmana gerek yok. Cunku disaridan gelen herhangi bir veri / deger sorgu icerisine eklemiyorsun. Direk olarak query() kullanabilirsin / kullanmalisin.

3. execute(), prepare() hazirlamis oldugun sorguyu veritabanina gonderir / calistirir. bindParam() ise prepare() ile hazirlamis oldugun sorguda ki degiskenlere guvenli bir sekilde (SQL injection bir cok yazilimda malese hala onemli bir problem) deger atamani saglar. Elbette bindParam() yerine direk olarak bir dizi (array) olarak execute() icerisine gerekli degisken ve degerlerini atayip, direk olarak sorgunu calistirirsin.

4. Bu kadar ufak tefek seylere takilma (ornegin foreach mi daha hizli yoksa while mi gibi). Bunun yerine yazdigim kod nasil daha anlasilir / okunakli olur diye dusun. A mi yoksa B fonksiyonu mu daha performansli yerine (ozellikle arada nano saniyeler oynuyorsa) hangisi kodunu daha okunakli bir hale getirir diye sorman daha uygun. Bu anlamda kesinlikle foreach.

Bu arada global'i genel olarak kullanmaktan kacin. Hatta oyle ki, kullanmani gerektirmeyecek sekilde yazilimini hazirlaman gerekiyor. global 'in OOP'de yeri yok / olmamali.

Öncelikle cevaplarınız için teşekkür ederim.
error_reporting(1) hataları görmek için 1 yapmıştım.

- Kullanıcıdan veri gelmiyor ancak veri tabanından bir değer geliyorsa. Örneğin makale_onay = 1 olan veriler listelensin gibi bir sorgulama yapmak isteyelim. Bunun için prepare kullanmak gerekiyor mu? Bu şekilde.

<?php
$makale_onay = 1;
$kayit = $db->prepare("SELECT * FROM makaleler WHERE makale_onay = :makale_onay ORDER BY makale_id DESC");
$kayit->bindParam("makale_onay", $makale_onay, PDO::PARAM_INT);
$kayit->execute();
?>



- Global'ı bende kullanmak istemiyorum ama ayar.php index.php'ye include edilmiş olsun. Ben de sistem.php içerisindeki bir fonksiyon içerisiden $db değişkenine erişmek istiyorum. Ama fonksiyon içerisinde global $db yazmadan erişemiyorum aşağıdaki hatayı veriyor. global $db eklenince hata gidiyor.
index.php

<?php
	require_once("sistem/ayar.php");
	require_once("sistem/sistem.php");
?>

sistem.php

<?php
function Anasayfa(){
	global $db;

	$makaleBul = $db->prepare("SELECT * FROM makaleler WHERE makale_anasayfa = :makale_anasayfa AND makale_onay = :makale_onay ORDER BY makale_id ASC");
	$makaleBul->bindParam("makale_anasayfa", $makale_anasayfa, PDO::PARAM_INT);
	$makaleBul->bindParam("makale_onay", $makale_onay, PDO::PARAM_INT);
	$makaleBul->execute();
		
	foreach( $makaleBul->fetchAll(PDO::FETCH_ASSOC) as $makale){	
		echo $makale["makale_baslik"];		
	}
}
?>

- Ayrıca mysql_real_escape_string gibi fonksiyonları halen kullanabiliyor muyuz?

Cevap Yaz

Cevap yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git