Rumah > Soal Jawab > teks badan
P粉6198961452023-09-03 10:06:17
Mula-mula, pertimbangkan untuk menggunakan parameter bernama dan bukannya <代码>? 代码>. Dalam kes ini, anda tidak perlu menggantikan apa-apa: parameter yang dinamakan jelas dan agak mudah ditunjukkan dalam log, dan disokong oleh kebanyakan klien dbms untuk tujuan penyahpepijatan.
Jika parameter yang dinamakan tidak boleh dilaksanakan (kerana asas kod semasa yang besar atau sebarang sebab lain), anda mempunyai dua pendekatan utama:
Jika anda memilih cara yang kedua, berikut ialah contoh cara melakukannya dengan cepat dan kotor:
Ganti dalam pelbagai langkah:
?
替换为其他极不可能出现在参数或查询中的内容来准备参数。例如?
. ?
,但不会匹配第一步中的替换。如果用 ?
替换,则为 (?
?
替换为 ?
dalam keputusan. Nota: Hasil penggantian ini seharusnya tidak digunakan sebagai pertanyaan dalam program. Penggantian ini berpotensi untuk melaksanakan mana-mana atau semua perkara berikut:
?
sebagai parameter (cth. dalam ulasan), hasilnya tidak tepat, ?
), hasilnya tidak akan tepat. <?php $query = 'UPDATE `list` set `item`=?,`type`=? WHERE (`id` = ?);'; $params = array( 'item' => '1', 'type' => 'Are you o\'k?', 'id' => 2 ); function substitute_params($query, $params) { $prep_params = str_replace(array("'","?"),array("''","\?"),$params); $query = array_reduce($prep_params, function ($interm, $param) { return preg_replace('/(?<!\\)\?/m', is_numeric($param) ? $param : '\'' . $param . '\'', $interm, 1); }, $query); return "-- Not to be used as a query to database. For demonstration purposes only!\n" .str_replace("\?", "?", $query); } echo substitute_params($query, $params); ?>
Keluaran:
-- Not to be used as a query to database. For demonstration purposes only! UPDATE `list` set `item`=1,`type`='Are you o''k?' WHERE (`id` = 2);
Sunting: Untuk mencuba dan mengurangkan kesan tanda soal di dalam rentetan tetap dan nama yang dipetik, anda boleh cuba menggunakan pengganti ini:
return preg_replace('/^([^"\'`]*?(?:(?:`[^`]*?`[^"\'`]*?)*?(?:"[^"]*?"[^"\'`]*?)*?(?:\'[^\']*?\'[^\'"`]*?)*?)*?)(?<!\\)\?/m', ''.(is_numeric($param) ? $param : '\'' . $param . '\''), $interm, 1);
Ia hanya menggantikan "`'
引用的块之外的 ?
di luar blok yang disebut dengan
Anda boleh melihat demo di sini.
Sila ingat bahawa ini bukan penghurai sepenuhnya. Sebagai contoh, ia tidak tahu tentang ulasan. Jadi kemungkinan penggantian yang salah tetap tinggi.