Melepaskan Petikan Tunggal dalam MySQL dengan PHP
Pertimbangkan senario berikut di mana dua pernyataan SQL digunakan untuk memanipulasi data. Penyataan pertama memasukkan maklumat daripada borang ke dalam pangkalan data, manakala pernyataan kedua mendapatkan semula data daripada pangkalan data, menghantar e-mel dan mencatat butiran transaksi.
Pengenalpastian Masalah
Isu ini timbul apabila pernyataan kedua menghadapi ralat disebabkan petikan tunggal dalam medan nama, seperti "O'Brien." Walaupun penyataan pertama berfungsi dengan betul tanpa melepaskan watak ini, penyataan kedua mencetuskan ralat MySQL. Perbezaan ini boleh menyebabkan kekeliruan.
Punca Punca
Untuk menangani isu ini, adalah penting untuk mengetahui bahawa rentetan dalam PHP harus dilepaskan sebelum memasukkannya ke dalam pertanyaan MySQL . PHP menawarkan fungsi mysql_real_escape_string() yang melepaskan diri dari rentetan ini dengan berkesan, memastikan pemasukan dan pencegahan ralat yang betul.
Kesan Petikan Ajaib
Gelagat yang berbeza antara kedua-dua SQL kenyataan boleh dikaitkan dengan potensi pengaktifan ciri magic_quotes_gpc PHP. Ciri ini secara automatik melepaskan rentetan yang diperoleh daripada penyerahan borang (cth., $_POST), jadi rentetan "O'Brien" diubah menjadi "O'Brien."
Apabila data disimpan dan kemudiannya diambil semula, pangkalan data tidak melakukan sebarang pelarian automatik. Oleh itu, rentetan "O'Brien" yang diperolehi mengandungi petikan tunggal yang tidak dapat dilepaskan, memerlukan pelarian yang betul dengan mysql_real_escape_string() apabila digunakan dalam pertanyaan untuk mengelakkan ralat.
Melepaskan Pertimbangan
Adalah penting untuk melepaskan setiap rentetan yang digunakan dalam pernyataan SQL, seperti yang ditunjukkan dalam yang berikut contoh yang disemak:
$query = mysql_query("INSERT INTO message_log (order_id, timestamp, message_type, email_from, supplier_id, primary_contact, secondary_contact, subject, message_content, status) VALUES ('$order_id', '".date('Y-m-d H:i:s', time())."', '$email', '$from', '$row->supplier_id', '$row->primary_email' ,'$row->secondary_email', '$subject', '".mysql_real_escape_string($message_content)."', '1')");
Dengan menggunakan mekanisme melarikan diri ini secara konsisten, pembangun boleh menghalang ralat MySQL yang disebabkan oleh petikan tunggal yang tidak dijangka dalam rentetan dengan berkesan.
Atas ialah kandungan terperinci Bagaimana Saya Boleh Mencegah Ralat MySQL Disebabkan oleh Petikan Tunggal dalam Rentetan PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!