Banyak database yang lebih matang mendukung konsep pernyataan yang telah disiapkan.
Apa saja pernyataan yang telah disiapkan? Anggap saja sebagai templat terkompilasi dari SQL yang ingin Anda jalankan, yang dapat dikustomisasi menggunakan parameter variabel. Pernyataan yang disiapkan dapat membawa dua manfaat utama:
Sebuah query hanya perlu diurai (atau diproses sebelumnya) satu kali, namun dapat dieksekusi beberapa kali dengan parameter yang sama atau berbeda. Ketika kueri sudah siap, database menganalisis, mengkompilasi, dan mengoptimalkan rencana untuk mengeksekusi kueri. Proses ini memakan waktu lebih lama untuk kueri yang kompleks dan dapat memperlambat aplikasi Anda secara signifikan jika kueri yang sama perlu diulang beberapa kali dengan parameter berbeda. Dengan menggunakan pernyataan yang telah disiapkan, Anda dapat menghindari siklus analisis/kompilasi/optimasi yang berulang. Sederhananya, pernyataan yang disiapkan menggunakan sumber daya yang lebih sedikit sehingga berjalan lebih cepat.
Parameter yang diberikan pada pernyataan yang disiapkan tidak perlu diapit tanda kutip; pengemudi akan menanganinya secara otomatis. Jika aplikasi Anda hanya menggunakan pernyataan yang telah disiapkan, dapat dipastikan bahwa injeksi SQL tidak akan terjadi. (Namun, jika bagian lain dari kueri dibuat dari input yang tidak lolos, masih ada risiko injeksi SQL).
Pernyataan yang disiapkan sangat berguna sehingga satu-satunya fiturnya adalah PDO akan mensimulasikan pemrosesan ketika driver tidak mendukungnya. Hal ini memastikan bahwa aplikasi dapat menggunakan pola akses data yang sama terlepas dari apakah database memiliki kemampuan tersebut.
Contoh berikut mengeksekusi kueri penyisipan dengan mengganti placeholder bernama yang sesuai dengan nama dan nilai.
<?php$stmt = $dbh->prepare("MASUKKAN KE REGISTRY (nama, nilai) NILAI (:nama, :nilai)");$stmt->bindParam(':nama', $nama);$stmt- >bindParam(':value', $value);//Masukkan baris $name = 'one';$value = 1;$stmt->execute();// Masukkan baris lain dengan nilai berbeda $name = 'two';$value = 2;$stmt->execute();?>
Contoh berikut mengeksekusi kueri penyisipan dengan mengganti placeholder ? dengan nama dan nilai.
<?php$stmt = $dbh->prepare("MASUKKAN KE REGISTRY (nama, nilai) NILAI (?, ?)");$stmt->bindParam(1, $nama);$stmt->bindParam(2, $nilai);//Masukkan baris $nama = 'satu';$nilai = 1;$stmt->execute();// Masukkan baris lain dengan nilai berbeda $name = 'two';$value = 2;$stmt->execute();?>
Contoh berikut memperoleh data berdasarkan nilai kunci dalam formulir yang disediakan. Masukan pengguna dikutip secara otomatis, sehingga tidak ada bahaya serangan injeksi SQL.
<?php$stmt = $dbh->prepare("PILIH * DARI REGISTRY di mana nama = ?");if ($stmt->execute(array($_GET['nama']))) { while ($baris = $stmt->mengambil()) { print_r($baris);
Jika driver database mendukungnya, aplikasi juga dapat mengikat parameter keluaran dan masukan. Parameter keluaran sering digunakan untuk mendapatkan nilai dari prosedur tersimpan. Parameter keluaran sedikit lebih rumit untuk digunakan dibandingkan parameter masukan karena saat mengikat parameter keluaran, Anda harus mengetahui panjang parameter yang diberikan. Jika nilai yang terikat pada suatu parameter lebih besar dari panjang yang disarankan, kesalahan akan dihasilkan.
<?php$stmt = $dbh->prepare("CALL sp_returns_string(?)");$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // Panggil prosedur tersimpan $stmt-> jalankan();cetak "prosedur mengembalikan $return_valuen";?>
Anda juga dapat menentukan parameter yang memiliki nilai masukan dan keluaran, dengan sintaksis yang mirip dengan parameter keluaran. Pada contoh berikutnya, string "halo" diteruskan ke prosedur tersimpan, dan ketika prosedur tersimpan kembali, halo diganti dengan nilai yang dikembalikan oleh prosedur tersimpan.
<?php$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");$value = 'halo';$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000 ); // Panggil prosedur tersimpan $stmt->execute();print "prosedur dikembalikan $nilain";?>
<?php$stmt = $dbh->prepare("SELECT * FROM REGISTRY dengan nama LIKE '%?%'");$stmt->execute(array($_GET['name']));// Simbol placeholder harus digunakan di seluruh nilai $stmt = $dbh->prepare("SELECT * FROM REGISTRY dengan nama LIKE ?");$stmt->execute(array("%$_GET[nama]%"));?>