query
menjalankan pernyataan SQL standar dan mengharuskan Anda untuk melarikan diri semua data dengan benar untuk menghindari Suntikan SQL dan masalah lainnya.
execute
menjalankan pernyataan yang disiapkan yang memungkinkan Anda untuk mengikat parameter untuk menghindari keharusan untuk melarikan diri atau mengutip parameter. execute
juga akan berkinerja lebih baik jika Anda mengulangi permintaan beberapa kali. Contoh pernyataan yang disiapkan:
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories);
$sth->bindParam(':colour', $colour);
$sth->execute();
// $calories or $color do not need to be escaped or quoted since the
// data is separated from the query
Praktik terbaik adalah tetap dengan pernyataan yang disiapkan dan execute
untuk meningkatkan keamanan .
Lihat juga: Apakah pernyataan yang disiapkan PDO cukup untuk mencegah injeksi SQL?
: calories
apakah itu setara denganmysql_real_escape_string()
untuk menghentikan suntikan atau apakah Anda memerlukan lebih dari sekedar$sth->bindParam(':calories', $calories);
untuk meningkatkan keamanan?query
mengembalikan PDOStatement , bukannya bool likeexecute
?Tidak, mereka tidak sama. Selain melarikan diri pada sisi klien yang disediakannya, pernyataan yang sudah disiapkan dikompilasi di sisi server sekali, dan kemudian dapat melewati parameter yang berbeda pada setiap eksekusi. Yang berarti Anda dapat melakukan:
Mereka umumnya akan memberi Anda peningkatan kinerja, meskipun tidak terlihat dalam skala kecil. Baca lebih lanjut tentang pernyataan yang disiapkan (versi MySQL) .
sumber
Jawaban Gilean sangat bagus, tetapi saya hanya ingin menambahkan bahwa kadang-kadang ada pengecualian langka untuk praktik terbaik, dan Anda mungkin ingin menguji lingkungan Anda dengan dua cara untuk melihat apa yang akan bekerja paling baik.
Dalam satu kasus, saya menemukan bahwa itu
query
bekerja lebih cepat untuk tujuan saya karena saya secara massal mentransfer data tepercaya dari kotak Linux Ubuntu yang menjalankan PHP7 dengan driver ODBC Microsoft yang tidak didukung untuk MS SQL Server .Saya sampai pada pertanyaan ini karena saya memiliki skrip berjalan lama untuk ETL yang saya coba peras untuk kecepatan. Tampaknya intuitif bagi saya yang
query
bisa lebih cepat daripadaprepare
&execute
karena itu hanya memanggil satu fungsi, bukan dua. Operasi pengikatan parameter memberikan perlindungan yang sangat baik, tetapi mungkin mahal dan mungkin dihindari jika tidak perlu.Diberikan beberapa kondisi langka :
Jika Anda tidak dapat menggunakan kembali pernyataan yang disiapkan karena tidak didukung oleh driver Microsoft ODBC .
Jika Anda tidak khawatir tentang sanitasi input dan pelolosan sederhana dapat diterima. Ini mungkin terjadi karena mengikat tipe data tertentu tidak didukung oleh driver Microsoft ODBC .
PDO::lastInsertId
tidak didukung oleh driver Microsoft ODBC.Inilah metode yang saya gunakan untuk menguji lingkungan saya, dan mudah-mudahan Anda dapat meniru atau sesuatu yang lebih baik di lingkungan Anda:
Untuk memulai, saya telah membuat tabel dasar di Microsoft SQL Server
Dan sekarang tes dasar waktunya untuk metrik kinerja.
Saya telah bermain dengan beberapa percobaan dan hitungan berbeda di lingkungan spesifik saya, dan secara konsisten mendapatkan antara 20-30% hasil lebih cepat dengan
query
daripadaprepare
/execute
Saya ingin tahu bagaimana perbandingan tes ini di lingkungan lain, seperti MySQL.
sumber