Zend_Db_Adapter
Zend_Db ve alakalı sınıflar Zend Framework için basit SQL veri tabanı arayüzü
sağlamaktadır. Zend_Db_Adapter PHP uygulamalarınızı ilişkisel veri tabanı yönetim
sistemlerine(RDBMS) bağlamak için kullanılan temel sınıftır. Farklı RDBMS'ler için
farklı bağdaştırıcı sınıfları mevcuttur.
Zend_Db sağlayıcıya özel PHP eklentileri ile genel arayüz arasında
köprü oluşturarak , az bir emek ile PHP uygulamalarınızı bir kere yazıp
farklı RDBMS'ler ile yerleştirilmesine yardım eder.
Bağdaştırıcı sınıfının arayüzü PHP Data Objects (PDO)
eklentisinin arayüzüne benzer. Zend_Db takip eden RDPMS markaları için PDO sürücüsü bağdaştırıcı
sınıfları sağlamaktadır:
MySQL, pdo_mysql PHP eklentisini kullanarak
Microsoft SQL Server, pdo_mssql PHP eklentisini kullanarak
Oracle, pdo_oci PHP eklentisini kullanarak
PostgreSQL, pdo_pgsql PHP eklentisini kullanarak
SQLite, pdo_sqlite PHP eklentisini kullanarak
Ek olarak , Zend_Db takip eden RDBMS markaları için PHP veri tabanı eklentilerini
kullanan bağdaştırıcı sınıfları sağlamaktadır:
MySQL, mysqli PHP eklentisini kullanarak
Oracle, oci8 PHP eklentisini kullanarak
IBM DB2, ibm_db2 PHP eklentisini kullanarak
Her Zend_Db bağdaştırıcısı PHP eklentisi kullanmaktadır.
Zend_Db bağdaştırıcısını kullanabilmek için karşılık gelen PHP
eklentisi PHP ortamınızda aktif durumda olmalıdır.
Örneğin , PDO Zend_Db bağdaştırıcılarından herhangi birini
kullandığınızda , PDO eklentisini ve kullandığınız marka
RDBMS'in PDO sürücüsünü aktif hale getirmelisiniz.
Bağdaştırıcı ile veri tabanına Bağlanmak
Bu kısım veri tabanı bağdaştırıcısı instance'ı oluşturulmasını açıklar.
Bu PHP uygulamanızdan RDBMS sunucunuza bağlantı yapmaya benzer.
Zend_Db Bağdaştırıcısı yapıcısı(Constructor'ı) kullanmak
Bir bağdaştırıcının yapıcısını kullanarak bir bağdaştırıcının
instance'ını oluşturabilirsiniz. Bağdaştırıcı yapıcısı bağlantıyı
tanımlamak için parametreler dizisi olan bir argüman almaktadır.
Bağdaştırıcı yapıcısı kullanmak '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname' => 'test'
));]]>
Zend_Db Factory kullanmak
Direk olarak Bağdaştırıcı yapıcısı(constructor) kullanmaya alternatif olarak
bağdaştırıcının statik metodunu Zend_Db::factory() kullanarak
bağdaştırıcı instance'ı olşturulabilir.Bu metod istem sırasında Bağdaştırıcı
sınıf dosyasını Zend_Loader::loadClass()
kullanarak dinamik olarak yükler.
İlk argüman Bağdaştırıcı sınıfının esas adını adlandıran string argümandır.
Örneğin 'Pdo_Mysql' string'i Zend_Db_Adapter_Pdo_Mysql sınıfını karşılamaktadır.
İkinci argüman aynı Bağdaştırıcı yapıcısına verilen parametreler dizisi
gibidir.
Bağdaştırıcı factory metodunu kullanmak '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname' => 'test'
));]]>
Zend_Db_Adapter_Abstract sınıfını genişleten bir sınıf oluşturup ,
sınıf adını "Zend_Db_Adapter" paket öneki ile isimlendirmediyseniz
bağdaştırınızı yüklemek için bağdaştırıcı sınıfının kılavuzluk eden
kısmını parametre dizisindeki 'adapterNamespace' anahtarı ile
belirtirseniz factory() metodunu kullanabilirsiniz.
Bağdaştırıcı factory metodunun özel bağdaştırıcı sınıfı için kullanılması '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname' => 'test',
'adapterNamespace' => 'MyProject_Db_Adapter'
));]]>
Zend_Config'in Zend_Db Factory ile Kullanımı
İsterseniz factory() metodunun her iki
argümanını Zend_Config tipinde
nesne olarak belirtebilirsiniz.
Eğer ilk argüman yapılandırma nesnesi ise kullanılacak sınıfı
adlandıran adapter özelliği içermesi beklenir.
İsteğe bağlı olarak nesne bağdaştırıcı parametre adlarına karşı
gelen alt özellikleri barındıran params adlı
özelliği içerebilir. Bu sadece factory() metodunun
ikinci argümanı olmadığında kullanılır.
Bağdaştırıcı factory metodunun Zend_Config nesnesiyle kullanımı
Aşağıdaki örnekte Zend_Config nesnesi diziden oluşturuldu.
Ayrıca veriyi harici bir dosyadan da yükleyebilirsiniz ,
örneğin Zend_Config_Ini veya
Zend_Config_Xml ile.
array(
'adapter' => 'Mysqli',
'params' => array(
'dbname' => 'test',
'username' => 'webuser',
'password' => 'secret',
)
)
)
);
$db = Zend_Db::factory($config->database);
));]]>
factory() metodunun ikinci argümanı bağdaştırıcı
parametrelerine karşı gelen kayıtları içeren birleşmeli dizi olabilir.
Bu argüman isteğe bağlı. Eğer ilk argüman Zend_Config tiplerindeyse
tüm parametreleri içerdiği varsayılır ve ikinci argüman gözardı edilir.
Bağdaştırıcı Parametreleri
Aşağıdaki liste Zend_Db Bağdaştırıcı sınıfı tarafından tanımlanan genel parametreleri açıklamaktadır.
host:
veri tabanı sunucusunun hostname'ini veya IP adresini barındıran
string.Eğer veri tabanı , PHP uygulaması ile aynı host'da çalışıyorsa
'localhost' veya '12.0.0.1' kullanabilirsiniz.
username:
RDBMS sunucusuna oturum açmayı sağlayan hesap tanımlayıcısı.
password:
RDBMS sunucuna oturum açmak için zorunlu olan hesap şifresi.
dbname:
RDBMS sunucusundaki veri tabanı instance adı.
port:
Bazı RDBMS sunucuları yönetici tarafından belirlenen port
numarasından ağ trafiği kabul edebilir.
Port parametresi PHP uygulamanızın RDBMS sunucusunda tanımlı olan
port numarası ile eşleşmesi için port numarasını belirlemeye yarar.
options:
Bu parametre tüm Zend_Db_Adapter sınıflarına
genel olan seçeneklerin birleşmeli dizisidir.
driver_options:
Bu parametre verilen veri tabanı eklentisine ilişkin
ek seçenekler birleşmeli dizisidir.
Bu parametrenin bir tipik kullanımı ise PDO sürücüsünün
özniteliklerini(attribute) vermektir.
Factory'ye case-folding seçeneği vermek
Bu seçeneği Zend_Db::CASE_FOLDING. sabiti ile
belirtebilirsiniz.
Bu , PDO ve IBM DB veri tabanı sürücülerindeki sorgu sonuç setlerindeki
string anahtarlarının küçük , büyük harf durumunu ayarlamaya yarayan ATTR_CASE
özniteliğine karşılık gelmektedir.
Bu seçeneğin aldığı değerler
Zend_Db::CASE_NATURAL (varsayılan),
Zend_Db::CASE_UPPER, ve
Zend_Db::CASE_LOWER.
Zend_Db::CASE_UPPER
);
$params = array(
'host' => '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname' => 'test',
'options' => $options
);
$db = Zend_Db::factory('Db2', $params);]]>
Otomatik tırnaklama seçeneğini factory'ye vermek
Bu seçeneği Zend_Db::AUTO_QUOTE_IDENTIFIERS
sabiti le belirtebilirsiniz.
Eğer değer true ise , tablo isimleri , sütun isimleri
, hatta alias'lar gibi tanımlayacılar Bağdaştırıcı nesnesi tarafından
oluşturulan SQL sözdiziminde sınırlandırılır. Bu SQL kelimeleri veya özel
karakter içeren tanımlayıcılar kullanmayı kolaylaştırır. Eğer değer
false ise tanımlayıcılar otomatik olarak sınırlandırılmaz.
Eğer tanımlayıcıları sınırlamanız gerekiyorsa quoteIdentifier()
metodunu kullanarak kendiniz yapmalısınız.
false
);
$params = array(
'host' => '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname' => 'test',
'options' => $options
);
$db = Zend_Db::factory('Pdo_Mysql', $params);]]>
PDO sürücü seçeneklerini factory'ye vermek true
);
$params = array(
'host' => '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname' => 'test',
'driver_options' => $pdoParams
);
$db = Zend_Db::factory('Pdo_Mysql', $params);
echo $db->getConnection()->getAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY);]]>
Tembel Bağlantıları Yönetmek
Bağdaştırıcı sınıfının instance'ı oluşturulurken RDBMS sunucusuna
bağlantı hemen sağlanmaz. Bağdaştırıcı bağlantı parametrelerini saklar ve
ilk sorguyu çalıştırdığınız zaman fiili bağlantıyı gerçekleştirir.
Bu Bağdaştırıcı nesnesi oluşturmanın hızlı ve ucuz olmasını sağlar.
Eğer uygulamanız mevcut isteğe cevap verdiği zaman veri tabanı sorguları
çalıştırmanız gerektiğinden emin değilseniz bile Bağdaştırıcı sınıfı
instance'ı oluşturabilirsiniz.
Eğer Bağdaştırıcıyı RDBMS'e bağlanmaya zorlamanız gerekiyorsa ,
getConnection() metodunu kullanın. Bu metod
kendi PHP veri tabanı eklentisinde daha önce gösterildiği gibi
bağlantı için nesne döndürür. Örneğin PDO sürücüleri için herhangi
bir Bağdaştırıcı sınıfını kullandığınızda , getConnection()
metodu kendine özgü veri tabanına canlı bağlantı başlattıktan sonra
PDO nesnesini döndürür.
Geçersiz hesap bilgileri sunulması veya diğer RDBMS sunucusuna bağlantı
problemleri sonucunda exception yakalamak için bağlanmaya zorlamak
faydalı olabilir.
veri tabanında ilk sorgu çalıştırıldığı zamandan ziyade
bu exeption'lar bağlantı yapılana kadar ortaya çıkmaz,
eğer exeptionları bir yerde idare ediyorsanız uygulama kodunuzu
basitleştirmenize yardım edebilir.
Bağlantı exeption'larının idare edilmesigetConnection();
} catch (Zend_Db_Adapter_Exception $e) {
// muhtemelen geçersiz oturum bilgisi ,veya belki de RDBMS çalışmıyor
} catch (Zend_Exception $e) {
// muhtemelen factory() belirli Bağdaştırıcı sınıfını yükleyemedi
}]]>
Örnek veri tabanı
Zend_Db sınıfları için belgelerde sınıfların ve metodların
kullanımını tasvir etmek için birtakım basit tablolar kullanıyoruz.
Bu örnek tablolar bir yazılım geliştirme projesinde hataların
takibi için bilgi depolayabilir. veri tabanı dört tablodan oluşuyor:
accounts
hata izleme veri tabanında her kullanıcının bilgisini tutuyor.
products
hata raporlanabilecek herbir ürün hakkında bilgi tutuyor.
bugs
Hatalar hakkında bilgi tutuyor , hatanın şuanki durumu ,
hatayı raporlayan kişi , hatayı düzeltmek için atanmış kişi ,
düzeltmeyi doğrulamak için atanmış kişi.
bugs_products
Hatalar ile ürünler arasındaki ilişkiyi tutuyor.
Bu çoktan çoğa (many-to-many) ilişkiselliği sağlar ,
çünkü verilen hata birden çok ürün ile ilgili olabilir ,
ve tabiki verilen ürünün birden çok hatası olabilir.
Takip eden SQL veri tanımlama dili sözde kodu(pseudocode) örnek veri tabanındaki
tabloları açıklamaktadır. Bu örnek tablolar Zend_Db için otomatikleştirilmiş
birim testleri(unit test) tarafından yaygınca kullanılmıştır.
Ayrıca dikkat ederseniz bugs tablosu accounts tablosunu
kaynak gösteren birçok foreign key içeriyor. Bu foreign key'lerin herbiri verilen hata
için accounts tablosundaki farklı bir satırı kaynak gösterebilir.
Aşağıdaki şema örnek veri tabanının fiziksel veri modelini tasvir etmektedir.
Sorgu Sonuçlarını Okumak
Bu bölüm SELECT sorguları çalıştırabileceğiniz ve sorgu sonuçlarına
erişebileceğiniz Bağdaştırıcı sınıfı metodlarını açıklamaktadır.
Tüm sonuç listesinin alınması
SQL SELECT sorgusu çalıştırıp , sonuçlarını fetchAll()
metodunu kullanarak tek bir adımda getirebilirsiniz.
Bu metodun aldığı ilk argüman SELECT deyimini içeren bir string'dir.
Alternatif olarak ilk argüman bir sınıfın nesnesi Zend_Db_Select
olabilir. Bağdaştırıcı otomatik olarak bu nesneyi SELECT deyiminin string gösterimine
dönüştürür.
fetchAll()'ın ikinci argümanı SQL deyiminde sembol yerini
alan değerler dizisidir.
fetchAll() kullanmakfetchAll($sql, 2);]]>
Sonuç alma (Fetch) Modunun değiştirilmesi
Varsayılan olarak FetchAll() herbiri ilişkili dizi olan
satırlar dizisi geri döndürür. İlişkili dizinin anahtarları select sorgusunda
isimlendirilen sütunlar veya sütun takma isimleridir (alias).
setFetchMode() metodunu kullanarak sonuç alma modunu belirleyebilirsiniz.
Desteklenen modlar sabitler tarafından tanımlanmaktadır:
Zend_Db::FETCH_ASSOC:
Veriyi ilişkili diziler olarak döndürür.
Dizi anahtarları string olarak sütun adlarıdır.
Bu Zend_Db_Adapter sınıflarında varsayılan sonuç alma modudur.
Eğer select listesi aynı isimli sütunlar içeriyorsa ,
örneğin JOIN ile farklı tablolardan geliyorsa ilişkili
dizide verilen isim için sadece bir girdi olabilir.
Eğer FETCH_ASSOC modunu kullanırsanız , eşsiz dizi
anahtarları sağlamak için SELECT sorgunuzda sütun
takma isimlerini (alias) belirlemelisiniz.
Bu stringler varsayılan olarak veri tabanı sürücüsünden
döndüğü gibi döner.Bu tipik olarak RDBMS sunucusundaki
sütun imlasıdır. Bu stringlerin küçük,büyük harf durumunu
Zend_Db::CASE_FOLDING seçeneğini kullanarak
belirleyebilirsiniz.Bunu bir örnekle desteklemek gerekirse ,
bakınız .
Zend_Db::FETCH_NUM:
veriyi dizi içinde diziler olarak döndürür. Bu diziler
sorgunun select listesi alanlarının pozizyonlarına karşı gelen
tamsayılar tarafından indekslenir.
Zend_Db::FETCH_BOTH:
veriyi dizi içinde diziler olarak döndürür. Dizi anahtarları
FETCH_ASSOC modunda kullanıldığı gibi hem stringler hemde FETCH_NUM
modunda kullanıldığı gibi tamsayılardır.Dikkat edilirse
dizideki öğe sayısı FETCH_ASSOC veya FETCH_NUM kullanımındakinin
iki katıdır.
Zend_Db::FETCH_COLUMN:
veriyi değerler dizisi olarak döndürür. Her dizideki değer
sonuç listesindeki bir sütundan dönen değerdir. Varsayılan olarak
bu 0 ile indekslenmiş ilk sütundur.
Zend_Db::FETCH_OBJ:
veriyi nesneler dizisi olarak döndürür. Varsayılan
sınıf PHP yerleşik stdClass sınıfıdır. Sonuç listesinin
sütunları nesnenin genel (public) özellikleridir.
setFetchMode() KullanımısetFetchMode(Zend_Db::FETCH_OBJ);
$result = $db->fetchAll('SELECT * FROM bugs WHERE bug_id = ?', 2);
// $result nesneler dizisi
echo $result[0]->bug_description;]]>
Sonuç listesinin Birleşmeli Dizi olarak AlınmasıfetchAssoc() metodu sonuç alma moduna bakmaksızın
veriyi birleşmeli diziler olarak döndürür.
fetchAssoc() KullanımısetFetchMode(Zend_Db::FETCH_OBJ);
$result = $db->fetchAssoc('SELECT * FROM bugs WHERE bug_id = ?', 2);
// $result sonuç alma moduna rağmen birleşmeli diziler dizisi
echo $result[0]['bug_description'];]]>
Sonuç Listesinden bir Sütunun AlınmasıfetchCol() metodu sonuç alma moduna bakmaksızın
veriyi değerler dizisi olarak döndürür.
Bu sorgu tarafından döndürülen ilk sütunu döndürür.
Sorgu tarafından döndürülen diğer sütunlar döndürülmez.
Eğer ilk sütundan başka sütunu döndürmeniz gerkiyorsa
bakınız .
fetchCol() KullanımısetFetchMode(Zend_Db::FETCH_OBJ);
$result = $db->fetchCol('SELECT bug_description, bug_id FROM bugs WHERE bug_id = ?', 2);
// bug_description'ı içeriyor;bug_id döndürülmedi
echo $result[0];]]>
Sonuç Listesinden Anahtar-Değer Çiftlerinin AlınmasıfetchPairs() metodu satır başına tek bir kayıt
gelecek şekilde veriyi anahtar-değer çiftleri birleşmeli dizisi
olarak döndürür.Bu birleşmeli dizinin anahtarı SELECT sorgusu
tarafından döndürülen ilk sütundur. Değer ise SELECT sorgusu
tarafından döndürülen ikinci sütundur. Sorgu tarafından döndürülen
herhangi diğer sütunlar gözardı edilir.
Döndürülen ilk sütun eşsiz değerler içerecek şekilde SELECT
sorgunuzu tasarlamalısınız. Eğer ilk sütunda birbirinin kopyası
değerler bulunuyorsa birleşmeli dizideki kayıtların üzerine
yazılacaktır.
fetchPairs() KullanımısetFetchMode(Zend_Db::FETCH_OBJ);
$result = $db->fetchPairs('SELECT bug_id, bug_status FROM bugs');
echo $result[2];]]>
Sonuç listesinden Bir Satırın AlınmasıfetchRow() metodu mevcut sonuç alım modunu
kullanarak veri döndürür ama sadece sonuç listesinin ilk satırını
döndürür.
fetchRow() KullanımısetFetchMode(Zend_Db::FETCH_OBJ);
$result = $db->fetchRow('SELECT * FROM bugs WHERE bug_id = 2');
// dikkat edilirse $result tek bir nesne , nesneler dizisi değil
echo $result->bug_description;]]>
Sonuç listesinden Bir Niceliğin AlınmasıfetchOne() metodu fetchRow() ile
fetchCol() metodunun kombinasyonuna benzediğinden
dolayı sadece sonuç listesinden alınan ilk satırı ve satırdaki
ilk sütun değerini döndürür. Bundan dolayı tek bir nicelik
döndürür , dizi veya nesne değil.
fetchOne() KullanımıfetchOne('SELECT bug_status FROM bugs WHERE bug_id = 2');
// bu yalnızca string değerdir
echo $result;]]>
Değişikliklerin veri tabanına Yazılması
Bağdaştırıcı sınıfını yeni veri yazmak için veya varolan veriyi
değiştirmek için kullanabilirsiniz. Bu bölüm bu işlemleri yapma
metodlarını açıklıyor.
Veri Eklenmesiinsert() metodunu kullarak veri tabanınızdaki
tabloya yeni satırlar ekliyebilirsiniz. İlk argüman tablo adı,
ve ikinci argüman ise sütun isimlerini veri değerlerine
eşleyen birleşmeli dizi.
Tabloya Veri Eklemek '2007-03-22',
'bug_description' => 'Something wrong',
'bug_status' => 'NEW'
);
$db->insert('bugs', $data);]]>
Veri dizisine eklemediğiniz sütunlar veri tabanına belirtilmez.
Bu sebepten SQL INSERT deyiminin uyduğu kurallara uyarlar:
Eğer sütunun DEFAULT deyimi varsa sütun oluşturulan satırda
varsayılan değeri alır , aksi halde sütun boş(NULL) durumda
bırakılır.
Varsayılan olarak veri dizinizdeki değerler parametreler kullanılarak
eklenir. Bu bazı tip güvenlik sorunları riskini azaltır.
Veri dizinizdeki değerlere kaçış (escaping) veya tırnaklama (quoting)
uygulamanıza gerek yok.
Veri dizisinde tırnak içinde tutulmaması gereken durumda
SQL ifadesi sayılan değerlere ihtiyaç duyabilirsiniz.
Varsayılan olarak string veri değerleri yalın string
olarak sayılır. Değerin SQL ifadesi olduğunu , bundan
dolayı tırnak içine alınmaması gerektiğini belirtmek için
düz metin olarak vermek yerine veri dizisindeki değeri
Zend_Db_Expre tipinde nesne olarak verin.
İfadelerin Tabloya Eklenmesi new Zend_Db_Expr('CURDATE()'),
'bug_description' => 'Something wrong',
'bug_status' => 'NEW'
);
$db->insert('bugs', $data);]]>
Oluşturulmuş Değere Erişmek
Bazı RDBMS markaları brincil anahtarların otomatik artışını (auto_increment)
destekler. Bu şekilde tanımlanmış bir tablo , yeni satır eklenmesinde (INSERT) otomatik
olarak birincil anahtar değeri oluşturur. insert() metodunun döndürdüğü
değer son eklenen ID değildir , çünkü tablo otomatik artan sütuna
sahip olmayabilir. Bunun yerine dönen değer etkilenen satır sayısıdır. ( genellikle 1)
Eğer tablonuz otomatik artan birincil anahtar ile tanımlanmış ise ,
ekleme ardından lastInsertId() metodunu çağırabilirsiniz.
Bu metod mevcut veri tabanı bağlantısı kapsamında oluşturulan son değeri
döndürür.
Otomatik artış anahtarı için lastInsertId() kullanımıinsert('bugs', $data);
// otomatik artışlı sütun tarafından oluşturulan son değeri döndür
$id = $db->lastInsertId();]]>
Bazı RDBMS markaları eşsiz değerler üreterek birincil anahtar
vazifesi gören sequence nesnesi destekliyor. Sequence'i desteklemek
için lastInsertId() metodu iki tane isteğe bağlı string
argüman alıyor.
Değerler üreten bir sequence için sequence'i tablo ve sütun isimleri
kullanılarak adlandırma kuralına uyduğun varsayılarak bu argümanlar
tablo ve sütunları isimlendirir ve "_seq" sonekini alır.
Bu PostgreSQL tarafından kullanılan seri (SERIAL) sütunlar için sequenceları
adlandırma kuralına dayanır. Örneğin "bug_id" birincil anahtar sütunlu
"bugs" tablosu "bugs_bug_id_seq" olarak adlandırılmış sequence kullanır.
lastInsertId()'nin sequence için kullanılmasıinsert('bugs', $data);
// 'bugs_bug_id_seq' sequence'i tarafından üretilen son değeri döndür.
$id = $db->lastInsertId('bugs', 'bug_id');
// alternatif olarak 'bugs_seq' squence'i tarafından üretilen son değeri döndür.
$id = $db->lastInsertId('bugs');]]>
Eğer sequence nesnenizin adı bu adlandırma kuralına uymuyorsa
, bunun yerine lastSequenceId() metodunu kullanın.
Bu metod sequence'i harfi harfine adlandıran tek bir string
argüman alıyor.
lastSequenceId() Kullanımıinsert('bugs', $data);
// 'bugs_id_gen' sequence'i tarafından üretilen son değeri döndür.
$id = $db->lastSequenceId('bugs_id_gen');]]>
Sequence'ları desteklemeyen RDBMS markaları için ,bunlara
MySQL , Microsoft SQL Server ve SQLite'da dahil , lastInsertId()
metoduna verilen argümanlar gözardı edilir ve döndürülen değer
mevcut bağlantı sırasında INSERT işlemleri ile meydana gelen
en son değer döndürülür. Bu RDBMS markaları için lastSequenceId()
metodu herzaman için null döndürür.
Neden "SELECT MAX(id) FROM table" kullanılmamalı ?
Bazen bu sorgu tabloya en son eklenen birincil anahtar değerini
döndürür.Ancak bu tekniğin birden çok istemcinin veri tabanına
kayıt eklediği ortamlarda kullanılması güvenli değildir. İstemci
uygulamanız tarafından Max(id) sorgusu gerçekleştirildiği
sırada başka bir istemcinin başka bir satır eklemesi mümküm ve işte
bu yüzden bu eninde sonunda gerçekleşecektir. Böylece geri döndürülen
değer sizin eklediğiniz satırı değil , diğer istemci tarafından eklenen
satırı tanımlıyacak.
Bunun ne zaman gerçekleştiğini bilmeninde bir yolu yok.
"repeatable read" gibi güçlü hareket(transaction) yalıtım
modu kullanılması riski azaltabilir ama , bazı RDBMS markaları
bunun için gerekli hareket yalıtımını(isolation) desteklemez veya
uygulamanız tasarımı gereği daha düşük seviye hareket yalıtımı kullanır.
Üstelik yeni birincil anahtar değeri elde etmek için "MAX(id)+1"
ifadesinin kullanılması da güvenli değildir çünkü iki istemci
eş zamanlı olarak bu sorguyu gerçekleştirebilir ve sonra ikiside
gelecek INSERT işlemleri için hesaplanan aynı değeri kullanır.
Tüm RDBMS markalarının eşsiz değerler üretmek ve üretilen
son değeri geri döndürmek için mekanizmaları vardır.
Bu mekanizmalar ister istemez hareket yalıtımı kapsamı dışında
çalışıyor bu yüzden iki istemcinin aynı değeri üretmesi ve başka
bir istemci tarafından değer üretildiğinde istemcinizin bağlantısına
bildirilme şansı yoktur.
Verinin Güncellenmesi
Bağdaştırıcının update() metodunu kullanarak
veri tabanı tablosundaki satırları güncelleyebilirsiniz.
Bu metod üç argüman alıyor: ilki tablonun adı ; ikincisi
değiştirilecek sütunları alacakları yeni değerlere eşleyen
birleşmeli dizi.
Veri dizisindeki değerler düz string muamelesi görür.
Veri dizisinde SQL ifadeleri kullanımı hakkında daha
fazla bilgi için bakınız
Üçüncü argüman değişecek satırlar için kriter olarak kullanılan
SQL ifadesi içeren stringdir.Bu argümandaki değerler ve tanımlayıcılara
tırnaklanma veya kaçış uygulanmaz. String'e dinamik içeriğin güvenle
eklenmesinden siz sorumlusunuz. Buna yardımcı olacak metodlar için
bakınız .
Geri döndürülen değer güncelleme işleminden etkilenen satır sayısıdır.
Satırların güncellenmesi '2007-03-23',
'bug_status' => 'FIXED'
);
$n = $db->update('bugs', $data, 'bug_id = 2');]]>
Eğer üçüncü argümanı koymazsanız veri tabanı tablosundaki tüm
satırlar veri dizisinde belirtilen değerler ile güncellenir.
Üçüncü argümana stringler dizisi verirseniz , bu stringler
AND operatörü ile ayrıştırılmış ifadede terimler
olarak birleştirilir.
Satırların ifadeler dizisi kullanılarak güncellenmesi '2007-03-23',
'bug_status' => 'FIXED'
);
$where[] = "reported_by = 'goofy'";
$where[] = "bug_status = 'OPEN'";
$n = $db->update('bugs', $data, $where);
// SQL'in son hali:
// UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'
// WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')]]>
Veri Silmedelete() metodunu kullanarak veri tabanı tablosundan
satırlar silebilirsiniz. Bu metod iki argüman alıyor:
ilki tabloyu isimlendiren string.
İkinci argüman silinecek satırlar için kriter olarak kullanılan
SQL ifadesi içeren string.Bu argümandaki değerler ve tanımlayıcılara
tırnaklanma veya kaçış uygulanmaz.String'e dinamik içeriğin güvenle
eklenmesinden siz sorumlusunuz. Buna yardımcı olacak metodlar için
bakınız .
Geri döndürülen değer silme işleminden etkilenen satır sayısıdır.
Satırların silinmesidelete('bugs', 'bug_id = 3');]]>
Eğer üçüncü argümanı koymazsanız bunun sonucunda veri tabanı
tablosundaki tüm satırlar silinir.
Üçüncü argümana stringler dizisi verirseniz , bu stringler
AND operatörü ile ayrıştırılmış ifadede terimler
olarak birleştirilir.
Değerlerin ve Tanımlayıcıların Tırnaklanması
SQL sorgularını biçimlendirdiğiniz zaman sık sık PHP değişkenlerinin
değerlerini SQL ifadesine eklemeniz gerekir.Bu risklidir çünkü , eğer
PHP string'i tırnak sembolü gibi belli sembolleri içerirse geçersiz SQL'e
sebep olur. Örneğin takip eden sorgudaki tırnakların dengesizliğine
dikkat edin:
En kötüsü ise böyle kod hatalarının web uygulamanızın işlevini
değiştirmek isteyen biri tarafından tasarlanarak sömürülebilmesi(exploitlenmesi).
Eğer PHP değişkeninizin değerini HTTP parametresi veya başka bir mekanizma ile
belirtebiliyorlarsa , kişinin okumaya yetkisi olmayabilecek verinin geri döndürülmesi
gibi SQL sorgunuzun yapmasını istemediğiniz şeyleri yapmasını sağlayabilirler.
Bu "SQL Injection" olarak bilinen ciddi ve yaygın uygulama güvenliği ihlali tekniğidir
(bakınız http://en.wikipedia.org/wiki/SQL_Injection).
Zend_Db Bağdaştırıcı sınıfı PHP kodunuzun SQL Injection saldırılarına
karşı açıkları azaltmanıza yardımcı olan kullanışlı fonksiyonlar sağlamaktadır.
Çözüm ise PHP değerlerindeki tırnaklar gibi özel karakterlere SQL stringlerinize
katılmadan kaçış uygulamak(escaping).
quote() Kullanımıquote() metodu boyutsuz(vektörel olmayan) bir argüman
alıyor. Değeri kullandığınız RDBMS'e göre özel karakterlere kaçış
uygulayarak ve string değer sınırlayıcıları ile çevreleyip döndürür.
Standart SQL string değer sınırlayıcısı tek tırnaktır (').
quote() Kullanımıquote("O'Reilly");
echo $name;
// 'O\'Reilly'
$sql = "SELECT * FROM bugs WHERE reported_by = $name";
echo $sql;
// SELECT * FROM bugs WHERE reported_by = 'O\'Reilly']]>
Dikkat , quote() 'un döndürdüğü değer string etrafındaki
tırnak sınırlayıcılarınıda içeriyor. Bu özel karakterlere kaçış uygulayan
bazı fonksiyonlardan farklı ama tırnak sınırlayıcılarını eklemiyor ,
örneğin mysql_real_escape_string().
Kullanıldıkları SQL veritipi bağlamında değerlerin tırnaklanması veya tırnaklanmaması
gerekebilir. Örneğin bazı RDBMS markalarında tam sayı değerler eğer tamsayı tipinde bir
sütunla veya ifadeyle karşılaştırılıyorsa string gibi tırnaklanmamalı. Diğer bir ifadeyle
, intColumn 'un SQL veritipinin INTEGER olduğunu varsayarsak
bazı SQL yürütmelerinde takip eden sorgu hata verecektir.
Belirttiğiniz SQL veritipi için opsiyonel ikinci
argümanı kullanabilirsiniz.
quote()'un SQL tipi ile kullanımıquoteType($value, 'INTEGER');
]]>
Her Zend_Db_Adapter sınıfı sayısal SQL veritiplerini karşı gelen
RDBMS markaları için kodlamıştır. Ayrıca sabitleri (Zend_Db::INT_TYPE,
Zend_Db::BIGINT_TYPE, ve Zend_Db::FLOAT_TYPE) kullanarak
daha RDBMS bağımsız şekilde kod yazabilirsiniz.
Tabloların anahtar sütunlarına başvuran SQL sorguları üretirken
Zend_Db_Table SQL tiplerini quote()'a belirtir.
quoteInto() Kullanımı
Tırnaklamanın en tipik kullanım şekli bir PHP değişkenini
SQL ifadesi veya deyimine katmaktır. quoteInto()
metodunu kullanarak bunu bir adımda yapabilirsiniz. Bu metod
iki argüman alıyor: ilk argüman yer tutucu sembolü (?)
içeren string , ve ikinci argüman ise yer tutucu yerine koyulacak
bir değer veya PHP değişkeni olmalı.
Yer tutucu sembolü birçok RDBMS markası tarafından kullanılan
konumsal parametreler için kullanan sembolle aynıdır , ama
quoteInto() metodu sadece sorgu parametrelerini
öykünür(emule eder). Metod basitce değeri stringe ekler ,
özel karakterlere kaçış uygular ve etrafını tırnaklar.
Doğru sorgu parametreleri SQL stringi ile parametrelerin
ayrılmasını , deyim RDBMS sunucusundaymış gibi ayıklanmasına sağlar.
quoteInto() KullanımıquoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly");
echo $sql;
// SELECT * FROM bugs WHERE reported_by = 'O\'Reilly']]>
quoteInto()'nun opsiyonel üçüncü parametresini
SQL veri tipi belirtmek için kullanabilirsiniz.Sayısal tipler
tırnaklanmaz ve diğer tipler tırnaklanır.
quoteInto()'nun SQL tipi ile kullanımıquoteInto("SELECT * FROM bugs WHERE bug_id = ?", '1234', 'INTEGER');
echo $sql;
// SELECT * FROM bugs WHERE reported_by = 1234]]>
quoteIdentifier() Kullanımı
SQL sözdiziminde değişken olması gerekebilecek tek kısım değerler değil.
Eğer PHP değişkenlerini tabloları,sütunları veya diğer tanımlayıcıları
isimlendirmek için kullanıyorsanız bu stringleri de tırnaklamanız gerekebilir.
Varsayılan olarak SQL tanımlayıcıları PHP ve diğer programlama dilleri gibi
bir sözdizim kuralına sahip. Örneğin tanımlayıcılar boşluk,noktalama işareti,
özel karakter, veya uluslararası karekter içermemeli. Ayrıca bazı kelimeler
SQL sözdizimi için ayrılmıştır ve bunlar tanımlayıcı olarak kullanılmamalı.
Ancak bununla birlikte SQL'in sınırlandırılmış tanımlayıcılar (delimited identifiers)
olarak bilinen tanımlayıcıların belirtilmesine daha geniş seçeneklere izin veren bir özelliği var.
Eğer SQL tanımlayıcılarını düzgün tırnak tipleriyle kapsarsanız
tırnaksız yazımı hatalı olacak tanımlayıcıları kullanabilirsiniz.
Sınırlandırılmış tanımlayıcılar boşluk,noktalama,uluslararası karakter içerebilir.
Ayrıcı SQL ayrılmış kelimelerini tanımlayıcı sınırlandırıcıları ile kapsarsanız
kullanabilirsiniz.
quoteIdentifier() metodu quote() metodu
gibi çalışır ama tanımlayıcı sınırlandırıcı karakterlerini
kullandığınız bağdaştırıcıya uygun olarak stringe uygular.
Örneğin , standart SQL tanımlayıcı sınırlandırıcıları için
(") çift tırnak kullanır. MySQL varsayılan olarak
ters tırnak (`) kullanır. Ayrıca quoteIdentifier()
metodu string argüman içerisindeki özel karakterlere kaçış uygular.
quoteIdentifier() KullanımıquoteIdentifier("order");
$sql = "SELECT * FROM $tableName";
echo $sql
// SELECT * FROM "order"]]>
SQL sınırlandırılmış tanımlayıcılar tırnaklanmamış tanımlayıcılardan
farklı olarak küçük-büyük harf duyarlıdır.
Bu nedenle sınırlandırılmış tanımlayıcılar kullanacaksanız
tanımlayıcıların yazımı tam olarak şemanızda olduğu gibi , harflerin
küçük-büyük harf durumuda dahil olmak üzere tıpa tıp aynı olmalı.
Çoğu durumda Zend_Db sınıfları tarafından üretilen SQL'de
varsayılan olarak tüm tanımlayıcılar otomatik olarak
sınırlandırılır. Bu davranışı Zend_Db::AUTO_QUOTE_IDENTIFIERS
seçeneği ile değiştirebilirsiniz.Bunu Bağdaştırcı instance'ı oluşturken
belirtin. Bakınız .
Veri tabanı Hareketlerinin(Transactionların) Kontrolü
Veri tabanları hareketleri birden çok tabloda çalışsa dahi
tekbir değişiklikle teslim edilebilir(commit) veya geri alınabilir(roll back)
işin mantıksal birimleri olarak tanımlar.Veri tabanı sürücüsü sorguları
dolaylı olarak yönetiyor olsa da veri tabanındaki tüm sorgular hareket bağlamında
çalıştırılır. Çalıştırdığınız her deyim için hareket oluşturulur ve SQL deyiminiz
çalıştırıldıktan sonra teslim edilir işte buna auto-commit
denir. Varsayılan olarak tüm Zend_Db Bağdaştırıcı sınıfları auto-commit modunda işliyor.
Alternatif olarak hareketin başlangıcını ve çözünürlülüğünü belirtebilir
böylece bir işlemde ne kadar SQL sorgusunun bir gruba dahil oldup teslim edildiğini
(veya geri alındığını) kontrol edebilirsiniz. Bir hareketi başlatmak için beginTransaction()
metodunu kullanın. Siz açıkca ortadan kaldırana kadar ,sonraki SQL deyimleri aynı hareket bağlamında
çalıştırılır.
Hareketi ortadan kaldırmak için commit() veya rollBack() metodlarından birini kullanın.
commit() metodu vaat edildiği gibi hareket sırasında yapılan değişiklikleri işaretler ,
bunun anlamı diğer hareketlerde çalışan sorgulara bu değişikliklerin gözükeceğidir.
rollBack() metodu tersini yapar:hareket sırasında yaptığınız
değişiklikleri göz ardı eder. Değişiklikler etkin olarak yapılmamıştır
, dönen verinin durumu harekete başlamadan önceki gibidir.
Ancak hareketi geri almak aynı zamanda çalışan hareketler tarafından
yapılan değişiklikleri etiklemeyecektir.
Hareketi ortadan kaldırdıktan sonra Zend_Db_Adapter
siz tekrar beginTransaction() çağırana kadar auto-commit modunu
döndürür.
Tutarlılığı sağlamak için Hareketin YönetilmesibeginTransaction();
try {
// Birkaç sogu çalıştırmayı dene:
$db->query(...);
$db->query(...);
$db->query(...);
//Eğer hepsi başarılıysa hareketi teslim et ve tüm değişiklikler
// bir kerede teslim edilsin.
$db->commit();
} catch (Exception $e) {
// Eğer sorgulardan herhangi biri başarısız olur ve
// exeption fırlatırsa tüm hareketi geri almak ve
// başarılı olsa dahi hareketde yapılan değişikleri
// geri çevirmek istiyoruz.
// Böylece ya hep beraber teslim ediliyor
// yada hiçbiri teslim edilmiyor.
$db->rollBack();
echo $e->getMessage();
}]]>
Listeleme ve Açıklama TablolarılistTables() metodu mevcut veritabanındaki tabloları
isimlendiren string dizisi döndürür.
describeTable() metodu tablo hakkında birleşmeli
metadata dizisi geri döndürür. Bu metodun ilk argümanına tablo
adını string olarak belirtir. İkinci argüman isteğe bağlı
ve bulunduğu tabloda şemayı isimlendiriyor.
Dönen birleşmeli dizinin anahtarları tablonun sütun adlarıdır.
Her sütuna karşı gelen değer ayrıca takip eden anahtarları ve
değerleriyle birleşmeli dizidir:
describeTable()'ın döndürdüğü Metadata alanlarıAnahtarTipAçıklamaSCHEMA_NAME(string)Bu tablonun var oluduğu veri tabanı şemasının adı.TABLE_NAME(string)Bu sütunun ait olduğu tablonun adı.COLUMN_NAME(string)Sütunun adı.COLUMN_POSITION(integer)Sütunun tablodaki sırası.DATA_TYPE(string)Sütunun veritipinin RDBMS adı.DEFAULT(string)Eğer varsa sütunun varsayılan değeri.NULLABLE(boolean)Tablo SQL NULL'ları kabul ediyorsa True , tablonun NULL kısıtı yoksa false.LENGTH(integer)Tablonun RDBMS tarafından raporlanan uzunluğu veya boyutu.SCALE(integer)SQL NUMERIC 'in veya DECIMAL'ın derecesi.PRECISION(integer)SQL NUMERIC'in veya DECIMAL'ın duyarlılığı.UNSIGNED(boolean)Eğer tamsayı tabanlı tip işaretsiz olarak bildirilmişse True.PRIMARY(boolean)Eğer sütun birincil anahtarın bir parçası ise True.PRIMARY_POSITION(integer)Birincil anahtardaki sütunun sırasal(1'den başlayan) pozisyonu.IDENTITY(boolean)Sütun otomatik oluşturulmuş değer kullanıyorsa True.
Tablo adıyla ve isteğe bağlı şema adıyla eşleşen tablo yoksa
describeTable() boş dizi döndürür.
Bağlantının Kapatılması
Genellikle veri tabanı bağlantısının kapatılması gerekmez. PHP
otomatik olarak istek sonunda tüm kaynakları temizler. Veri tabanı
eklentileri kaynak nesnesi temizlendiği zaman bağlantıyı kapatacak
şekilde dizayn edilmiştir.
Ancak birçok veri tabanı bağlantısı başlatan PHP betiğiniz(script'iniz) varsa
RDBMS sunucunuzun kapasitesini tüketmemek için bağlantıyı kapatmanız gerekebilir.
Bağdaştırıcının closeConnection() metodunu var olan veri tabanı
bağlantısını kapatmak için kullanabilirsiniz.
Veri tabanı bağlantısının kapatılmasıcloseConnection();]]>
Zend_Db sürekli(persistent) bağlantıları destekliyor mu?
Sürekli bağlantıların kullanımı Zen_Db tarafından desteklenmiyor
veya tercih edilmiyor.
Sürekli bağlantıların kullanımı RDBMS sunucusunda fazla boş
bağlantının olmasına sebep olabilir , bu bağlantı oluşturmak
için gereken ek yükü azaltarak sağlayacağınız performans artışından
daha çok problem getirecektir.
Veri tabanı bağlantılarının durumu vardır. Öyleki
RDBMS sunucusunda bazı nesneler oturum kapsamında var olur.
Örnek olarak kilitler,kullanıcı değişkenleri,geçici tablolar ve
son çalıştırılan sorgu hakkında etkilenen satırlar , üretilen
son id değeri gibi bilgiler. Eğer sürekli bağlantılar kullanırsanız
uygulamanız önceki PHP isteği tarafından oluşturulan geçersiz veya
yetkisiz veriye erişebilir.
Diğer Veri tabanı deyimlerinin çalıştırılması
PHP veri tabanı eklentisi tarafından sağlanan bağlantı nesnesine
direk bağlantı kurma ihtiyacınız olacak durumlar olabilir.
Bu eklentilerin kimisi Zend_Db_Adapter_Abstract tarafından
kapsanmayan özellikler sunabilir.
Örneğin Zend_Db'nin çalıştırdığı tüm SQL deyimleri önce hazırlanır
sonra çalıştırılır. Ancak bazı veri tabanı özellikleri hazırlanmış
deyimlerle uyumsuzdur. CREATE ve ALTER gibi DDL deyimleri MySQL'de
hazırlanamaz. Ayrıca MySQL 5.1.17 öncesinde SQL deyimleri
MySQL Query Cache'den faydalanmaz.
Çoğu PHP veri tabanı eklentisi SQL deyimlerini hazırlamadan
çalıştıran metod sağlamaktadır. Örneğin , PDO'de bu metod
exec()'dir. PHP eklentisindeki bağlantı nesnesine
getConnection() kullanarak direk erişebilirsiniz.
PDO bağdaştırıcısında hazırlanmamış deyim çalıştırmakgetConnection()->exec('DROP TABLE bugs');]]>
Benzer şekilde PHP veri tabanı eklentilerine özel diğer metodlara
ulaşabilirsiniz. Bilerek bunun yapılması uygulamanızı
belli marka RDBMS'ler için sağlanan veri tabanı eklentisinin
arayüzüyle sınırlandırabilir.
Zend_Db'nin gelecek sürümlerinde fonksiyonellik için desteklenen
PHP veritabanı eklentilerine mahsus method giriş noktaları ekleme
fırsatı olacak. Bu geriye uyumluluğu etkilemeyecek.
Belirli Bağdaştırılar üzerine Notlar
Bu bölüm farkında olmanız gereken bağdaştırıcı sınıfları arasındaki farkları
listeliyor.
IBM DB2
Bu bağdaştırıcıyı factory() metoduna 'Db2' adıyla belirtin.
Bu bağdaştırıcı ibm_db2 PHP eklentisini kullanıyor.
IBM DB2 sequence'leri ve otomatik artan anahtarları
desteklemektedir. Bu yüzden lastInsertId()
metodunun argümanları isteğe bağlıdır. Eğer argüman
vermezseniz bağdaştırıcı otomatik artışlı anahtar için
üretilen son değeri döndürecektir. Eğer argüman verirseniz
bağdaştırıcı kuralına göre isimlendirilen sequence'in
('table_column_seq')
ürettiği son değeri döndürecektir.
MySQLi
Bu bağdaştırıcıyı factory() metoduna 'Mysqli' adıyla belirtin.
Bu bağdaştırıcı mysqli PHP eklentisinden faydalanmaktadır.
MySQL sequence'ları desteklemiyor bu yüzden lastInsertId()
argümanlarını yok sayar ve otomatik artışlı anahtar içi üretilen
son değeri döndürür. lastSequenceId() metodu
null döndürür.
Oracle
Bu bağdaştırıcıyı factory() metoduna 'Oracle' adıyla belirtin.
Bu bağdaştırıcı oci8 PHP eklentisini kullanıyor.
Oracle otomatik artan anahtarları desteklemiyor bu yüzden
lastInsertId()'ye veya lastSequenceId() 'ye
sequence'in adını belirtmelisiniz.
Oracle eklentisi konumsal parametreleri desteklemiyor.
Adlandırılan parametreleri kullanmalısınız.
Şu anda Zend_Db::CASE_FOLDING seçeneği Oracle
bağdaştırıcısı tarafından desteklenmiyor. Bu seçeneği Oracle
ile kullanabilmek için PDO OCI bağdaştırıcısını kullanmalısınız.
IBM DB2 ve Informix Dynamic Server (IDS) için PDO
Bu bağdaştırıcıyı factory() metoduna 'Pdo_Ibm' adıyla belirtin.
Bu bağdaştırıcı pdo ve pdo_ibm PHP eklentilerini kullanıyor.
En azından PDO_IBM eklentisinin 1.2.2 sürümünü kullanmalısınız.
Eğer bu eklentinin daha öncesi bir sürümüne sahipseniz PDO_IBM
eklentisini PECL'den güncellemelisiniz.
PDO Microsoft SQL Server
Bu bağdaştırıcıyı factory() metoduna 'Pdo_Mssql' adıyla belirtin.
Bu bağdaştırıcı pdo ve pdo_mssql PHP eklentilerini kullanıyor.
Microsoft SQL Server sequence'ları desteklemiyor
bu yüzden lastInsertId()
argümanlarını yok sayar ve otomatik artışlı anahtar içi üretilen
son değeri döndürür. lastSequenceId() metodu
null döndürür.
Zend_Db_Adapter_Pdo_Mssql SQL Server veri tabanına bağlanır
bağlanmaz QUOTED_IDENTIFIER ON yapar.
Bu sürücünün tanıtıcı sınırlandırmaları için SQL Server'ın
köşeli parantezi yerine standart SQL tanıtıcı sınırlandırıcı
sembolü (") kullanmasını sağlar.
Seçenekler dizisinde pdoType'ı anahtar olarak
belirtebilirsiniz. Değer "mssql"(varsayılan) ,"dblib", "freetds"
, veya "sybase" olabilir. Bu seçenek bağdaştırıcının DSN string'ini
inşa sırasında kullandığı DSN önekini etkiler. "freetds" ve "sybase"
FreeTDS kütüphane seti için
kullanılan "sybase:" önekini içerir.
Ayrıca bu sürücede kullanılan DSN önekleri hakkında daha çok bilgi için
bakınız
http://www.php.net/manual/en/ref.pdo-dblib.connection.phpPDO MySQL
Bu bağdaştırıcıyı factory() metoduna 'Pdo_Mysql' adıyla belirtin.
Bu bağdaştırıcı pdo ve pdo_mysql eklentilerini kullanıyor.
MySQL sequence'ları desteklemiyor , bu yüzden lastInsertId()
argümanlarını yok sayar ve otomatik artışlı anahtar içi üretilen
son değeri döndürür. lastSequenceId() metodu
null döndürür.
PDO Oracle
Bu bağdaştırıcıyı factory() metoduna 'Pdo_Oci' adıyla belirtin.
Bu bağdaştırıcı pdo ve pdo_oci PHP eklentilerini kullanıyor.
Oracle otomatik artışlı anahtarları desteklemiyor bu yüzden
sequence'in adını lastInsertId() veya
lastSequenceId()'ye belirtmelisiniz.
PDO PostgreSQL
Bu bağdaştırıcıyı factory() metoduna 'Pdo_Pgsql' adıyla belirtin.
Bu bağdaştırıcı pdo ve pdo_pgsql eklentilerini kullanıyor.
PostgreSQL otomatik artışlı anahtarları hem de sequence'ları
destekliyor. Bu nedenle lastInsertId() argümanları
isteğe bağlı. Eğer hiç argüman vermezseniz bağdaştırıcı otomatik
artışlı anahtar için üretilen son değeri döndürür. Eğer argümanları
verirseniz bağdaştırıcı bağdaştırıcı kuralına göre isimlendirilen sequence'in
('table_column_seq')
ürettiği son değeri döndürecektir.
PDO SQLite
Bu bağdaştırıcıyı factory() metoduna 'Pdo_Sqlite' adıyla belirtin.
Bu bağdaştırıcı pdo ve pdo_sqlite eklentilerini kullanıyor.
SQLite sequence'ları desteklemiyor , bu yüzden lastInsertId()
argümanlarını yok sayar ve otomatik artışlı anahtar içi üretilen
son değeri döndürür. lastSequenceId() metodu
null döndürür.
SQLite2 veri tabanına bağlanmak için Pdo_Sqlite bağdaştırcısının
instance'ını oluştururken parametreler dizisine 'dsnprefix'=>'sqlite2'
ekleyin.
Hafızadaki (in-memory) SQLite veri tabanına bağlanmak için
Pdo_Sqlite bağdaştırcısının instance'ını oluştururken parametreler
dizisine 'dsnprefix'=>'sqlite2' ekleyin.
PHP için SQLite sürücüsünün eski sürümleri sonuç listesinde
kısa sütun adları kullanılmasını sağlamak için gerekli olan
PRAGMA komutlarını desteklemiyor gibi. Eğer join sorgusu
yaptığınızda sonuç listeniz "tabloadı.sütunadı" şeklinde
problemli dönüyorsa PHP'nin güncel sürümüne terfi etmelisiniz.