PDO ile MySQL veritabanına nasıl bağlanıldığını anlatmıştım. Şimdi devamı olarak bir de bağlandığımız veritabanından veri çekmeye yani select işlemini yapmaya çalışacağız.
Tabi bu işlemi yapmak için de birkaç yöntem var. Yine sırayla birkaçından bahsetmeye çalışacağım.
İlk olarak veritabanındakı tüm verileri çekelim:
//Tüm verileri getirecek sorgumuz
$query = $conn->prepare("SELECT * FROM isimler");
//Sorgumuzu çalıştırıyoruz
$query->execute();
//Tüm verileri çekiyoruz
$result=$query->fetchAll();
//JSON formatında yazdırıyoruz
echo json_encode($result, JSON_PRETTY_PRINT);
Dikkat edilmesi gerek nokta sorgumuzu prepare metodu ile yazdıktan sonra execute metodu ile çalıştırıyor olmamız. Bunu yapmazsak sonuç dönmeyecektir. PDO sorguda tüm verileri çekmiş olsanız da daha sonra kullanacağınız metodlarla farklı işlemler yapabiliyorsunuz. Örneğin yukarıdaki kodlarımıza dikkat ederseniz fetchAll() metodunu kullandık. Bu metod bize tüm verileri döndürecektir. Şöyle bir çıktı almış olacağız:
[
{
"id": "81",
"0": "81",
"isim": "Banu",
"1": "Banu",
"soyisim": "Samadova",
"2": "Samadova",
"email": "[email protected]",
"3": "[email protected]"
},
{
"id": "82",
"0": "82",
"isim": "Ai\u015fe",
"1": "Ai\u015fe",
"soyisim": "Samadova",
"2": "Samadova",
"email": "[email protected]",
"3": "[email protected]"
},
{
"id": "84",
"0": "84",
"isim": "Anar",
"1": "Anar",
"soyisim": "Samadov",
"2": "Samadov",
"email": "[email protected]",
"3": "[email protected]"
},
{
"id": "85",
"0": "85",
"isim": "Banu",
"1": "Banu",
"soyisim": "Samadova",
"2": "Samadova",
"email": "[email protected]",
"3": "[email protected]"
},
{
"id": "86",
"0": "86",
"isim": "Ai\u015fe",
"1": "Ai\u015fe",
"soyisim": "Samadova",
"2": "Samadova",
"email": "[email protected]",
"3": "[email protected]"
}
]
Dikkat ederseniz sütun başlıklarına ve sütun numaralarına göre sonuç verdi. Aynı veriyi iki kere çekmiş olduk. Bunu istemiyorsak fetchAll(PDO::FETCH_ASSOC); şeklinde kullanmamız gerekiyor. Bunun dışında sadece fetch() kullanmanız – Sonuç kümesindeki sonraki satırı döndürür.
Örnek olarak kullanalım:
[
{
"id": "81",
"isim": "Banu",
"soyisim": "Samadova",
"email": "[email protected]"
},
{
"id": "82",
"isim": "Ai\u015fe",
"soyisim": "Samadova",
"email": "[email protected]"
},
{
"id": "84",
"isim": "Anar",
"soyisim": "Samadov",
"email": "[email protected]"
},
{
"id": "85",
"isim": "Banu",
"soyisim": "Samadova",
"email": "[email protected]"
},
{
"id": "86",
"isim": "Ai\u015fe",
"soyisim": "Samadova",
"email": "[email protected]"
}
]
Aşağıdaki kullanım şekillerini de deneyebilirsiniz:
PDO::FETCH_ASSOC: Sütun isimlerine göre indisli bir dizi döner.
PDO::FETCH_BOTH (öntanımlı): Hem sütun isimlerine hem de sütun numaralarına göre indislenmiş bir dizi döner. İlk sütunun indisi 0’dır.
PDO::FETCH_BOUND: Sütun değerlerini PDOStatement::bindColumn() ile ilişkilendirilmiş PHP değişkenlerine atar ve TRUE döndürür.
PDO::FETCH_CLASS: İstenen sınıfın özelliklerini sütun isimlerine eşleyerek sınıfın bir örneğini döndürür. Eğer alım_tarzı değiştirgesi PDO::FETCH_CLASSTYPE sabitini içeriyorsa (örn, PDO::FETCH_CLASS | PDO::FETCH_CLASSTYPE) sınıf ismi ilk sütunun değerine göre belirlenir.
PDO::FETCH_INTO: İstenen sınıfın mevcut örneğini sütun isimlerini sınıf özelliklerine eşleyerek günceller.
PDO::FETCH_LAZY: PDO::FETCH_BOTH ve PDO::FETCH_OBJ sabitlerinin birleşimidir.
PDO::FETCH_NUM: Sütun numaralarına göre indislenmiş bir dizi döner. İlk sütunun indisi 0’dır.
PDO::FETCH_OBJ: Özellik isimlerinin sınıf isimlerine denk düştüğü bir anonim nesne örneği döndürür.
Kaynak: http://php.net/manual/tr/pdostatement.fetch.php
Bunların dışında bir de $result=$query->fetchColumn(1);
metodu var. Bu metodu kullanarak parantez içerisinde belirttiğini kolon numarasına göre sonuç döndürecektir:
//veritabanından veri çekiyoruz
$query = $conn->prepare("SELECT * FROM isimler");
//Yukarıdakı sorguyu çalıştırmak için
$query->execute(); //Bir hazır deyimi çalıştırır
$result=$query->fetchColumn(1);
echo json_encode($result, JSON_PRETTY_PRINT);
#Sonuç
//"Anar"
Bir de son olarak sorgumuzda değişken kullanarak nasıl veri çekeceğimize değinmek istiyorum. Kod üzerinden gidecek olursak:
$degisken=82;
//veritabanından veri çekiyoruz
$query = $conn->prepare("SELECT * FROM isimler where id=:id");
//Yukarıda belirtilen parametreye değişkenden gelen değeri set ediyoruz
$result = $query->execute([":id"=>$degisken]);
//veriyi alıyoruz (tek veri döneceği için fetch kullandım daha çok veri dönecekse fetchAll kullanılabilir)
$result=$query->fetch(PDO::FETCH_ASSOC); //Sonuç kümesindeki sonraki satırı döndürür
echo json_encode($result, JSON_PRETTY_PRINT);
Scriptten de görebileceğiniz gibi daha önceki paylaşımımda insert işlemi zamanı sql injection saldırısından korunmak için kullandığımız yöntemi uyguluyoruz. Değişkeni direk sql sorgumuza değil execute metodunda parametremize set ediyoruz. Dolayısıyla daha korunaklı bir select işlemi yapmış oluyoruz.
Select işlemi ile ilgili anlatılacaklar bu kadar. Konu ile ilgili sorularınızı yorum kısmına yazabilirsiniz.
Son olarak tüm scripti bir arada paylaşıyorum:
<?php
$host = "localhost";
$username = "root";
$password = "123456";
$dbname = "myPdoDatabase";
try {
//Yukarıda belirtilen veritabanına bağlan. Her iki halde veritabanı olacak. Ya önceden vardı ya da yeni oluşturuldu.
$conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$degisken=82;
//veritabanından değişkene göre veri çekiyoruz
$query = $conn->prepare("SELECT * FROM isimler where id=:id");
//Yukarıda belirtilen parametreye değişkenden gelen değeri set ediyoruz
$result = $query->execute([":id"=>$degisken]);
//veriyi alıyoruz (tek veri döneceği için fetch kullandım daha çok veri dönecekse fetchAll kullanılabilir)
$result=$query->fetch(PDO::FETCH_ASSOC); //Sonuç kümesindeki sonraki satırı döndürür
echo json_encode($result, JSON_PRETTY_PRINT);
}
catch (PDOException $e) {
echo "Hata kodu: " . $e->getCode() . "<br> Hata mesajı: " . $e->getMessage();
$conn = null;
}
?>
Yorum yapın..