Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengelakkan Pengulangan Kod Apabila Menggunakan Penyata PHP SQL Disediakan?

Bagaimana untuk Mengelakkan Pengulangan Kod Apabila Menggunakan Penyata PHP SQL Disediakan?

Linda Hamilton
Linda Hamiltonasal
2024-12-29 03:22:10415semak imbas

How to Avoid Code Repetition When Using PHP SQL Prepared Statements?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn