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
Linda HamiltonOriginal
2024-12-29 03:22:10415Durchsuche

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

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,
]);

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";

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

Die spezifische Tabellenklasse:

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

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!

Stellungnahme:
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