PDO::prepare
(PHP 5 >= 5.1.0, PHP 7, PHP 8, PHP 8,PECL pdo >= 0.1.0)
PDO::prepare — Çalıştırılmak üzere bir deyimi hazırlar ve bir deyim nesnesi olarak döndürür
Açıklama
PDOStatement::execute() işlevinde aktaracağınız her
değer için eşsiz bir bağımsız değişken imleyici belirtmelisiniz.
Öykünme kipi açık olmadığı sürece, hazırlanmış bir ifadede aynı ismi birden
fazla isimli bağımsız değişken işaretçisinde kullanamazsınız.
Bilginize:
Bağımsız değişken işaretçileri yalnızca eksiksiz bir değişmez veriyi temsil
edebilir. Ne değişmez parçasının, ne anahtar sözcük, ne tanımlayıcı ne de
herhangi bir keyfi sorgu parçasının bağımsız değişken kullanılarak bağlanması
mümkün değildir. Örneğin, bir SQL ifadesinin IN() yan tümcesinde tek bir
bağımsız değişkene birden çok değer bağlayamazsınız.
Bir SQL deyiminin farklı değerlerle defalarca çalıştırılmak üzere
PDO::prepare() ve
PDOStatement::execute() yöntemlerine aktarılması, bu SQL
deyimiyle ilgili sorgu planının ve temel verilerin müzakere edilmek üzere
sürücü tarafından istemci ve/veya sunucu tarafında önbelleklemesiyle
uygulamanızın başarımını yükseltecek en iyilemelerin yapılması mümkün olur.
Ayrıca, PDO::prepare() ve
PDOStatement::execute() işlevlerinin kullanımı,
bağımsız değişkenlerin elle öncelenmesi gereğini ortadan kaldırarak SQL zerk
saldırılarını engellemeye yardımcı olur.
Bağımsız değişkenli hazır deyimlerin değerlerle ilişkilendirilmesi işlemini
desteklemeyen sürücüler için PDO bu işlemi taklit eder. Ayrıca sürücü
isimli ve soru imli bağımsız değişken aktarım tarzlarından yalnız birini
destekliyorsa PDO diğer tarzı da taklit eder.
Bilginize:
Öykünülmüş hazırlanmış ifadeler ve isimli veya soru işareti tarzı
bağımsız değişkenlerinin yeniden yazılması için kullanılan çözümleyici, tek ve
çift tırnaklar için standart olmayan tersbölülü öncelemeyi destekler. Bu,
bir tersbölü ile öncelenmiş sonlandırma tırnaklarında bu kullanımın
desteklenmediği anlamına gelir, bu da bağımsız değişkenlerin yanlış algılanmasına
neden olarak hazırlanan ifadenin yürütüldüğünde başarısız olmasına sebep
olabilir. Çözüm, bu tür SQL sorguları için öykünülmüş hazırlıklar
kullanmamak ve sürücü tarafından yerel olarak desteklenen bir bağımsız değişken
tarzı kullanarak bağımsız değişkenlerin yeniden yazılmasını önlemektir.
PHP 7.4.0 ve sonrasında, soru imleri kendileri ile öncelenebiliyor. Yani,
??
dizgesi artık veritabanına ?
dizgesi olartak gönderiliyor.
Bağımsız Değişkenler
-
deyim
-
Hedef veritabanı sunucusu için geçerli bir SQL deyimi şablonu olmalıdır.
-
seçenekler
-
Bu yöntemden döndürülen PDOStatement nesnesi
için atanacak öznitelik değerlerini isim=>değer çiftleri halinde
içeren bir dizi. Çoğunlukla kaydırılabilen bir gösterici isteği için
PDO::CURSOR_SCROLL
özniteliğine
PDO::ATTR_CURSOR
değerini atamakta kullanılır. Bazı
sürücülerin deyimin hazırlanması aşamasında atanabilen sürücüye özgü
öznitelikleri vardır.
Dönen Değerler
Veritabanı sunucusu deyimi başarıyla hazırlayabilmişse
PDO::prepare() bir
PDOStatement nesnesi döndürür; aksi takdirde ya bir
PDOException yavrulanır veya işlev false
döndürür
(hata işlemeye bağımlı olarak).
Bilginize:
Öykünülmüş hazır deyimler için veritabanı sunucusuyla müzakere
yapılmadığından PDO::prepare() deyim üzerinde bir
sınama yapmaz.
Hatalar/İstisnalar
PDO::ATTR_ERRMODE
özniteliğine
PDO::ERRMODE_WARNING
atanırsa
E_WARNING
düzeyinde bir hata çıktılanır.
PDO::ATTR_ERRMODE
özniteliğine
PDO::ERRMODE_EXCEPTION
atanırsa
PDOException istisnası oluşur.
Örnekler
Örnek 1 - İsimli bağımsız değişkenli SQL deyim şablonu
<?php
/* Değerleri bir dizi olarak aktaracağımız bir deyim hazırlayalım */
$sql = 'SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour';
$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);
$sth->execute(['calories' => 150, 'colour' => 'red']);
$red = $sth->fetchAll();
/* Dizi anahtarları ":" ile de öncelenebiliyor (seçimlik) */
$sth->execute([':calories' => 175, ':colour' => 'yellow']);
$yellow = $sth->fetchAll();
?>
Örnek 2 - Soru imli SQL deyim şablonu
<?php
/* Değerleri bir dizi olarak aktaracağımız bir deyim hazırlayalım */
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute([150, 'red']);
$red = $sth->fetchAll();
$sth->execute([175, 'yellow']);
$yellow = $sth->fetchAll();
?>
Örnek 3 - Soru imi öncelemeli SQL deyim şablonu
<?php
/* Dikkat: Bu sadece PostgreSQL veritabanlarında geçerlidir */
$sth = $dbh->prepare('SELECT * FROM issues WHERE tag::jsonb ?? ?');
$sth->execute(['feature']);
$featureIssues = $sth->fetchAll();
$sth->execute(['performance']);
$performanceIssues = $sth->fetchAll();
?>