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!