Aramayan Bulamaz
×
PHP & MySQL kategorisine ait içerikleri görüntülemektesiniz.
PHP Data Object - PDO

PHP de veri tabanına bağlanma ve sorgu çalıştırmayı anlatmıştım.
Klasik veri tabanı bağlantısı mysql_connect() komutu ile yapılıyor, sorgu çalıştırma mysql_query() ile yapılıyor fakat pdo yapısı biraz farklı. PDO php 5.2 den sonra gelen bir veri tabanı sorgu sınıfı, yani nesne tabanlı bir yapı.
En güzel özelliği çoklu veri tabanı desteği olması. Oracle, SQL Server, MySQL gibi farklı veritabanlarına bağlanabilme özelliği sunuyor. Ayrıca kendi içerisinde sql injection koruması olan bir sınıftır.

$db = new PDO('mysql:host=localhost;dbname=veritabanı adı', 'kullanıcı adı', 'sifre'); PDO sınıfını db değişkenine bağlı olarak oluşturduk, sorgularımızı bu sınıfa bağlı methodlar ile yapacağız.

query() methodu genel olarak tüm sorgularda kullanılır.
exec() methodu bilgi girişi, güncelleme, silme gibi veri tabanına değer göndermede kullanılır.
prepare() methodu query() methodundaki gibi tüm sorguları çalıştırmada kullanılır fakat buna ek olarak bir de execute() methodu kullanılır, prepare ile yapılan sorgunun uygulanması için.
fetch() methodu; tek bir sonuç getirmek için kullanılır, query ile çalıştırılmışsa sorgu query den sonra, prepare ile çalıştırılmışsa sorgu execute methodundan sonra kullanılır.

Veritabanından dataların sayılarını getirmek istediğimizde fetch(PDO::FETCH_NUM) kullanılır.

Örnek olarak bir sorgu çalıştırayım, sorguyu query ile yapacağım. $sorgu = $db->query('select * from blog where id=1')->fetch(); Veritabanından id değeri 1 olan konuyu getiren sorguyu yazdık. Bu şekilde de yapabilirdik $sorgu = $db->query('select * from blog where id=1'); $sorgu->fetch(); İkisi de aynı işlemi yapıyor. echo $sorgu['blog_baslik'];
İ

PHP Nesne Tabanlı Programlama

Nesne tabanlı programlama, yazılım geliştirmek için kullanılan bir teknolojidir. OOP yani object-oriented programming, Türkçe karşılığı nesne tabanlı programlama, sağladığı standartlarla bileşen (component) programlamasını kolaylaştırmaktadır. C# temelinde nesne tabanlı bir dildir. Çok sayıda nesne hazır olarak C# içerisinde bulunur ve bu nesneler kullanılarak program yazılır. Ayrıca kendimiz de bir sınıf yazabiliriz.

OOP üç prensibe sahiptir.

Encapsution Inheritance Polymorphism

Encapsulation: Nesne hakkındaki bilgiler ve işlemlerdir. Metot ve özellik olarak adlandırılan bu işlemler nesnenin niteliklerini ortaya çıkartır. Bir arabanın rengi ve büyüklüğü gibi.

Inheritance: Nesnenin başka bir nesne üzerine, bir üst nesneden etkilenerek, kurulmasıdır. Bir bilgisayarın parçalardan oluşması ve parçalarında bilgisayarın tam nesnesinden etkilenmesi.

Polymorphism: Belirli bir işlemin bir çok nesne tarafından kullanılmasıdır.

PHP de Nesne Tabanlı Programlama

PHP de nesne tabanlı programlamayı anlayabilmek için ilk önce PHP'nin temel yapı taşları olan fonksiyonlar ve değişkenler konusunda tam bir bilgiye sahip olmak gerek.

Bir sınıf oluşturmak için class komutunu kullanırız.

sinif.php isminde bir dosya oluşturalım

<?php class bilgisayar{ } ?>

sınıfımızın içi boş bundan sonra buraya değişken tanımlaması ve fonksiyondan başka bir şey yapamayız, yapacağımız her işlem için fonksiyon yazmamız gerek. Burada mantık şu, yazacağımız sınıfa özel olan fonksiyonu yazıp gerektiği yerde gereken fonksiyonu çağırmamız gerek, veritabanı sınıfı yazıp içine grafiksel istatistik çıkaran bir fonksiyon yazmamız uygun olmaz.

<?php class bilgisayar{ public $marka, fiyat; function marka_tanimla($yenimarka){ $this->marka = $yenimarka; } function marka_goster(){ return $this->marka; } } ?>

Mysql\'de Kullanıcıları Konu Sayılarına Göre Listeleme

İki farklı tablomuz var, birinde açılan konular, diğerinde ise kullanıcılar.
Sistemde hangi kullanıcı konu açıyorsa o kullanıcının id bilgisi de konuların bulunduğu tabloda tutuluyor.
Konular Tablosunda
id, baslik, icerik, yayin, kullanici_id alanları var
Kullanıcılar Tablosunda
k_id, kullanici_adi, sifre, yetki alanları var

Biz yetki durumu 1,2 ve 3 olan kullanıcıları yayında bulunan konu sayılarına göre konu sayısı en fazla olan en üstte çıkacak şekilde göstermek istiyoruz.

Ben bunu çok uzun bir yöntemle yapmıştım, konuların bulunduğu yerden kullanıcı idlerini ve o kullanıcıların konu sayılarını ayrı ayrı alıp dizi değişkenine atayıp sıralayıp foreach ile döngüye sokup o şekilde sadece üç kullanıcı gelecek şekilde uzun sorgular topluğu şeklinde yapmıştım, daha kısa bir yöntem arıyordum ve Kerim Yılmaz (Ayazoğlu) kardeşim sayesinde çözdüm.

Tek bir sql sorgusu
select distinct(b.kullanici_id),k.kullanici_adi, (select count(id) from konular where kullanici_id=k.p_id) as toplam from kullanicilar kinner join konular b on b.kullanici_id=k.k_id where b.yayin=1 and k.yetki=1 or k.yetki=2 or k.yetki=3 order by toplam desc limit 3 sorguyu şu şekilde açıklayayım, tablo ilişkilendirmesi yaptık, bu konuda anlatmıştım tablo ilişkilendirmeyi, distinct ile veriyi tekrarsız çekiyoruz.
Konular tablosunda konusu olan kullanıcıları seçmiş olduk, ekran yazdırmak istediğimiz alanları seçtik sadece veritabanından, kullanici_adi, konu sayıları ve kullanıcı idleri.
select işlemi yaparken içerde parantez içinde bir select sorgusu daha kullandık, bura da count ile konuların sayılarını aldık ve hangi kullanıcının konu sayısını alacağımızı where koşuluyla belirttik daha sonra aldığımız bu sayıları toplam isimli bir alana aktardık ve toplam alanındaki değere göre tersten sıralayarak sadece 3 kişi gelecek şekilde kişileri seçmiş olduk.
sorguyu phpMyAdmin de çalıştırınca resimdeki g

PHP\'de Fonksiyon Hazırlama, Çağırma ve Kullanma

Fonksiyonlar verilen, istenilen ya da o sırada üretilen bilgiyi bize daha sonradan işlenmiş bir şekilde sunarlar.
Mesela bir fonksiyona istediğimiz özellikte bir tablo yaptırabiliriz, ya da çarpım tablosu vs gibi şeyler yaptırabiliriz.
Genel olarak kullanım şekli:
function FonksiyonIsmi(){ echo "Niyazi Alpay"; }

bu fonksiyon çağırıldığında ekrana Niyazi Alpay yazdıracaktır.

FonksiyonIsmi();

şeklinde çağırılır.

Fonksiyon ile daha farklı işlemler yapılabilir bu çok basit bir işlemdi, sadece adımızı yazdırdık ekrana.

Çarpım tablosu yaptırmak istersek eğer fonksiyonumuz şu şekilde olacak:

function CarpimTablosu(){ echo '<table border="1" align="center">'; for($i=0; $i<10; $i++){ echo '<tr>'; for($k=1; $k<=10; $k++){ echo '<td>'.($i+1).' x '.$k.' = '.($i+1)*$k.'</td>'; } echo '</tr>'; } echo '</table>'; } CarpimTablosu(); Ekran çıktısı


Fonksiyonlarda Parametre

Parametre fonksiyona dışarıdan değer alıp o değeri işleyerek çıktı vermedir.

Dışarıdan girilen bir metin içerisindeki A harflerini B ile değiştiren fonksiyonu yazalım, burada farklı bir komut daha göreceğiz şimdi, str_replace(); PHP kütüphanesinin kendine özgü olan yeniden düzenleme yapan fonksiyonudur bu, ve bu da parametreli bir fonksiyondur şimdi parametrenin ne olduğunu bir örnekle daha anlaşılır hale getireyim.

function Degis($yazi){ $yeni_yazi = str_replace('A','B',$yazi); echo $yeni_yazi; }

Şimdi bu fonksiyonu çağırırken $yazi diye belirttiğimiz yer parametredir, burayı dışarıdan girilecek bir değişken olarak tanımladık, Degis('NİYAZİ ALPAY'); olarak çağırdığımızda ekran çıktıs

Veri Tabanında Tablo İlişkilendirerek Bilgi Çekme (Inner Join)

Veri tabanından bilgi çekmek için SELECT komutunu kullanırız. SELECT * FROM tablo_ismi şeklinde bir komut ile tablo_ismi isimli tablodan bilgimizi çekeriz, eğer bir şarta bağlı olarak çekeceksek WHERE ile şartımızı belirtiriz.

SELECT * FROM blog WHERE id=1 blog isimli tabloda id değeri 1 olan bilgiyi getirir ekrana. Id değeri bir olan konunun bir de kategori bilgisi var kategoriler tablosunda, ayrıca konuyu açan kişinin de bilgisi profil tablosunda hepsi için ayrı ayrı sorgu çalıştırmaktansa tek bir sql sorgusu ile hepsini getirebiliriz.

 Kategori tablosunda k_id ve kat_isim adında alanlar var, kategori ismi ve id bilgisini tutan alanlar.

Profil tablosunda p_id, kullanici_adi adında alanlar var i, kullanıcı adı ve kullanıcının id bilgisini tutan  alanlar.

Blog tablosunda id, blog_baslik, blog_icerik, kat_id, kullanici_id adında alanlar var, konunun id bilgisi, içerik ve başlık bilgisi, konuyu açan kullanıcının id bilgisi ve hangi kategoride bulunuyorsa onun id bilgisini tutan alanlar.

Tek sorguda bunları getirebilmek için şu komutu kullanıyoruz;

SELECT * FROM blog b INNER JOIN profil p ON b.kullanici_id = p.p_id INNER JOIN blog_kategori bk ON b.kat_id=bk.k_id INNER JOIN sosyal s ON p.p_id=s.kullanici_id WHERE b.id=1

Blog isimli tabloyu seçtik ve bu tablo ismini b isimli bir değişkene atadık, sonra bunun aynısını diğer tablolar içinde yaptık. 

b.kat_id=bk.k_id ile blog isimli tablodaki kat_id alanıyla blog_kategori isimli tablodaki k_id alanını birleştirmiş olduk blog tablosunda tutulan kategori id si ne ise kategoriler tablosundaki o id ye sahip olan kategorinin bilgileri gelecek, aynı şey profil tablosu içinde geçerli, b.kullanici_id=p.p_id blog tablosundaki kullanıcı id bilgisi ile profil tablosundaki id bilgisi birbirine bağlanarak bilgi çekilmiş. Bu şekil bir kullanım yapmasaydık eğer her biri için ayrı ayrı sorg