(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
PDOStatement::execute() yöntemi ile çalıştırılmak üzere bir SQL deyimi hazırlar. Deyim şablonu sıfır veya daha fazla sayıda birer isimle (:isim) veya birer soru imi (?) ile ifade edilen bağımsız değişken içerebilir. Deyimin çalıştırılması sırasında bu bağımsız değişkenlere farklı değerler atanarak aynı deyim defalarca kullanılabilir. Aynı deyim şablonunda hem isimli hem de soru imli bağımsız değişkenleri kullanamazsınız. İkisinden birini seçmek zorundasınız. Herhangi bir kullanıcı girişini bağlamak için bu bağımsız değişkenleri kullanın, kullanıcı girişini doğrudan sorguya dahil etmeyin.
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.
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.
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.
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.
Örnek 1 - İsimli bağımsız değişkenli SQL deyim şablonu
<?php
$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();
$sth->execute([':calories' => 175, ':colour' => 'yellow']);
$yellow = $sth->fetchAll();
?>
Örnek 2 - Soru imli SQL deyim şablonu
<?php
$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
$sth = $dbh->prepare('SELECT * FROM issues WHERE tag::jsonb ?? ?');
$sth->execute(['feature']);
$featureIssues = $sth->fetchAll();
$sth->execute(['performance']);
$performanceIssues = $sth->fetchAll();
?>