PHP PDO disiapkan laporan dan prosedur yang tersimpan
Banyak database lebih matang mendukung konsep pernyataan siap.
Apa pernyataan siap? Anggap saja sebagai template dikompilasi Anda ingin menjalankan SQL, yang dapat disesuaikan dengan menggunakan parameter variabel. pernyataan siap menawarkan dua manfaat utama:
- Query hanya resolve (atau pretreatment) sekali, tapi dapat dijalankan beberapa kali dengan parameter yang sama atau berbeda. Ketika query siap, database akan menganalisis, menyusun dan melaksanakan rencana optimasi query. Untuk query yang kompleks, proses ini memakan waktu lama, jika Anda perlu diulang berkali-kali dengan parameter yang berbeda query yang sama, maka proses akan sangat mengurangi kecepatan aplikasi. Dengan menggunakan siap menghindari pernyataan mengulangi menganalisis / kompilasi / siklus mengoptimalkan. Singkatnya, pernyataan siap menggunakan lebih sedikit sumber daya dan dengan demikian berjalan lebih cepat.
- Memberikan parameter untuk mempersiapkan pernyataan tidak perlu menggunakan tanda kutip, pengemudi akan ditangani secara otomatis. Jika aplikasi hanya menggunakan pernyataan siap, kita dapat memastikan bahwa tidak ada SQL injection. (Namun, jika bagian lain dari query tidak melarikan diri dari masukan untuk membangun, maka masih ada risiko SQL injection).
pernyataan siap sehingga berguna bahwa mereka hanya memiliki adalah pengolahan analog ketika pengemudi tidak mendukung PDO. Hal ini memastikan bahwa terlepas dari apakah database memiliki fungsi, Anda dapat memastikan bahwa aplikasi dapat menggunakan pola akses data yang sama.
penyisipan PreparedStatements diulang
mengikuti contoh dengan menggantikan nama placeholder yang sesuai dengan nama dan nilai untuk mengeksekusi query insert
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
penyisipan PreparedStatements diulang
mengikuti contoh dengan menggantikan nama dan nilai? Placeholders untuk mengeksekusi query insert.
<?php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute(); ?>
Dapatkan data menggunakan pernyataan siap
mengikuti contoh dalam bentuk akses kunci berbasis data sudah disediakan. masukan pengguna secara otomatis tertutup dalam tanda kutip, sehingga tidak ada risiko serangan injeksi SQL.
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?>
Jika dukungan driver database, aplikasi juga dapat mengikat input dan output parameter output parameter yang biasanya digunakan untuk mendapatkan nilai dari prosedur yang tersimpan. output parameter untuk digunakan dibandingkan parameter input menjadi sedikit lebih rumit, karena ketika mengikat parameter output, Anda harus mengetahui parameter panjang tertentu. Jika nilai untuk parameter lebih besar dari rekomendasi yang mengikat dari panjang, maka akan menghasilkan kesalahan.
Memanggil prosedur yang tersimpan dengan parameter output
<?php $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $return_value\n"; ?>
Anda juga dapat menentukan baik input dan output nilai-nilai parameter, sintaks mirip dengan parameter output. Pada contoh berikut, string "hello" diteruskan ke prosedur yang tersimpan ketika kembali prosedur yang tersimpan, halo diganti dengan nilai kembali dari prosedur yang tersimpan.
Dengan input / output parameter untuk memanggil prosedur tersimpan
<?php $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 调用存储过程 $stmt->execute(); print "procedure returned $value\n"; ?>
penggunaan tidak sah dari placeholder
<?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); $stmt->execute(array($_GET['name'])); // 占位符必须被用在整个值的位置 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE ?"); $stmt->execute(array("%$_GET[name]%")); ?>