Cara Mengelakkan Pengulangan Kod dengan PHP SQL Prepared Statements
Pernyataan yang disediakan adalah penting untuk mencegah serangan suntikan SQL. Walau bagaimanapun, ia boleh menyebabkan lebihan kod yang berlebihan, terutamanya dalam kes dengan banyak lajur. Untuk menangani isu ini, terdapat beberapa pendekatan untuk meminimumkan pengulangan.
1. PHP mentah
Pendekatan ini menggunakan ruang letak kedudukan dan mengetepikan klausa nama medan dalam pertanyaan, bergantung pada nilai lalai untuk medan yang tiada. Contohnya:
$data = [$taskName, $startDate, $completedDate]; $sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)'; $db->prepare($sql)->execute($data);
2. Fungsi Helper
Seseorang boleh mencipta fungsi helper yang menerima nama jadual dan tatasusunan data dengan nama medan sebagai kunci dan nilai sebagai nilai. Fungsi harus menggunakan fungsi pembantu untuk melepaskan nama medan dengan betul untuk pencegahan suntikan SQL:
function prepared_insert($conn, $table, $data) { $keys = array_map('escape_mysql_identifier', array_keys($data)); $fields = implode(",", $keys); $table = escape_mysql_identifier($table); $placeholders = str_repeat('?,', count($keys) - 1) . '?'; $sql = "INSERT INTO $table ($fields) VALUES ($placeholders)"; $conn->prepare($sql)->execute(array_values($data)); } // Usage: prepared_insert($db, 'tasks', [ 'task_name' => $taskName, 'start_date' => $startDate, 'completed_date' => $completedDate, ]);
3. Baby ORM
Pendekatan ini menggunakan pengaturcaraan berorientasikan objek untuk mengurangkan lagi pengulangan. Kelas prototaip dicipta dengan kaedah biasa untuk semua jadual, dan kelas jadual tertentu ditakrifkan dengan nama jadual dan senarai lajur. Kod sisipan menjadi:
$data = [ 'email' => 'email', 'password' => 123, 'name' => 'Fooster', ]; $userGateway = new UserGateway($pdo); $id = $userGateway->create($data); echo "Create: $id\n";
Kelas prototaip:
class BasicTableGateway { public function create($data): int { $fields = $this->makeFieldList($data); $placeholders = str_repeat('?,', count($data) - 1) . '?'; $sql = "INSERT INTO `$this->table` ($fields) VALUES ($placeholders)"; $this->sql($sql,array_values($data)); return $this->db->lastInsertId(); } }
Kelas jadual tertentu:
class UserGateway extends BasicTableGateway { protected $table = 'gw_users'; protected $fields = ['email', 'password', 'name', 'birthday']; }
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Pengulangan Kod Apabila Menggunakan Penyata PHP SQL Disediakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!