首頁 >資料庫 >mysql教程 >使用 PHP SQL 準備語句時如何避免程式碼重複?

使用 PHP SQL 準備語句時如何避免程式碼重複?

Linda Hamilton
Linda Hamilton原創
2024-12-29 03:22:10410瀏覽

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

如何使用 PHP SQL 準備語句避免程式碼重複

準備語句對於防止 SQL 注入攻擊至關重要。然而,它們可能會導致過多的程式碼冗餘,尤其是在具有大量列的情況下。為了解決這個問題,有幾種方法可以最大限度地減少重複。

1.原始 PHP

此方法利用位置佔位符並省略查詢中的欄位名稱子句,依賴缺失欄位的預設值。例如:

$data = [$taskName, $startDate, $completedDate];
$sql = 'INSERT INTO tasks VALUES(null, ?, ?, ?)';
$db->prepare($sql)->execute($data);

2。輔助函數

可以建立一個輔助函數,它接受表名和資料數組,其中欄位名稱作為鍵,值作為值。此函數應利用輔助函數正確轉義欄位名稱以防止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

此方法使用物件導向程式設計來進一步減少重複。使用所有表的通用方法建立原型類,並使用表名稱和列列表定義特定的表類。插入程式碼變成:

$data = [
    'email' => 'email',
    'password' => 123,
    'name' => 'Fooster',
];

$userGateway = new UserGateway($pdo);

$id = $userGateway->create($data);
echo "Create: $id\n";

原型類別:

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();
    }
}

具體表類:

class UserGateway extends BasicTableGateway {
    protected $table = 'gw_users';
    protected $fields = ['email', 'password', 'name', 'birthday'];
}

以上是使用 PHP SQL 準備語句時如何避免程式碼重複?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn