Heim > Datenbank > MySQL-Tutorial > Wie vermeide ich Codewiederholungen bei der Verwendung von PHP SQL Prepared Statements?

Wie vermeide ich Codewiederholungen bei der Verwendung von PHP SQL Prepared Statements?

Linda Hamilton
Freigeben: 2024-12-29 03:22:10
Original
406 Leute haben es durchsucht

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

So vermeiden Sie Codewiederholungen mit PHP SQL Prepared Statements

Vorbereitete Anweisungen sind entscheidend für die Verhinderung von SQL-Injection-Angriffen. Sie können jedoch zu einer übermäßigen Code-Redundanz führen, insbesondere in Fällen mit zahlreichen Spalten. Um dieses Problem anzugehen, gibt es mehrere Ansätze zur Minimierung von Wiederholungen.

1. Rohes PHP

Dieser Ansatz verwendet Positionsplatzhalter und lässt die Feldnamenklausel in der Abfrage weg und verlässt sich auf Standardwerte für fehlende Felder. Zum Beispiel:

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

2. Hilfsfunktion

Man kann eine Hilfsfunktion erstellen, die einen Tabellennamen und ein Datenarray mit Feldnamen als Schlüssel und Werten als Werten akzeptiert. Die Funktion sollte eine Hilfsfunktion verwenden, um Feldnamen zur Verhinderung von SQL-Injection ordnungsgemäß zu maskieren:

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,
]);
Nach dem Login kopieren

3. Baby ORM

Dieser Ansatz nutzt objektorientierte Programmierung, um Wiederholungen weiter zu reduzieren. Eine Prototypklasse wird mit gemeinsamen Methoden für alle Tabellen erstellt und bestimmte Tabellenklassen werden mit dem Tabellennamen und der Spaltenliste definiert. Der Einfügecode wird zu:

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

$userGateway = new UserGateway($pdo);

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

Die Prototypklasse:

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();
    }
}
Nach dem Login kopieren

Die spezifische Tabellenklasse:

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

Das obige ist der detaillierte Inhalt vonWie vermeide ich Codewiederholungen bei der Verwendung von PHP SQL Prepared Statements?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage