Bei der Erstellung von SQL -Delete -Anweisungen neigen viele Entwickler dazu, Strings direkt zu spleißen, wie folgt:
$id = $_GET['id'];
$sql = "DELETE FROM users WHERE id = $id";
Diese Methode ist äußerst anfällig für SQL -Injektionsangriffe. Wenn ein böswilliger Benutzer beispielsweise 1 oder 1 = 1 übergeht, wird der Inhalt der gesamten Tabelle gelöscht.
Dieses Problem kann durch PDO -Vorverarbeitungsanweisungen vollständig vermieden werden. Es trennt SQL von Daten, um sicherzustellen, dass eingehende Daten nicht als Teil von SQL -Anweisungen interpretiert werden.
Hier finden Sie eine sichere Möglichkeit, Benutzerdatensätze mit PDO zu löschen:
<?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$username = 'root';
$password = 'your_password';
try {
$pdo = new PDO($dsn, $username, $password);
// Stellen Sie den Fehlermodus auf eine Ausnahme ein
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Vorverarbeitungsaussagen
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
// Parameter binden und ausführen
$id = 5; // Zum Beispiel aus einer Form oder URL ErfassungsnutzerID
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
if ($stmt->rowCount()) {
echo "Datensätze wurden erfolgreich gelöscht。";
} else {
echo "Kein passender Rekord gefunden。";
}
} catch (PDOException $e) {
echo "Datenbankfehler: " . $e->getMessage();
}
?>
In diesem Beispiel verwenden wir die Variablen : ID -Platzhalter und binden Sie durch BindParam , um die Konsistenz im Datentyp zu gewährleisten.
Manchmal gibt es mehr als eine Löschungsbedingung, z. B. das Löschen eines Benutzers Anmeldedatensatz zu einem bestimmten Zeitpunkt:
<?php
$stmt = $pdo->prepare("DELETE FROM login_logs WHERE user_id = :user_id AND login_time < :before_time");
$user_id = 3;
$before_time = '2024-01-01 00:00:00';
$stmt->bindParam(':user_id', $user_id, PDO::PARAM_INT);
$stmt->bindParam(':before_time', $before_time);
$stmt->execute();
Wenn die Deletionsbedingungen dynamisch erzeugt werden, z. B. die Stapel -Löschung der Kontrollkästchen am vorderen Ende, können Sie sie so konstruieren:
<?php
$ids = [2, 5, 7]; // Aus der Form oder vorderen End ID Liste
// Konstruiert einen Platzhalter SQL
$placeholders = implode(',', array_fill(0, count($ids), '?'));
$sql = "DELETE FROM users WHERE id IN ($placeholders)";
$stmt = $pdo->prepare($sql);
// Ausführungsanweisung,Binden Sie alle Parameter
$stmt->execute($ids);
Dieser Ansatz nutzt die Fähigkeit der Platzhalter und führt aus , um in Arrays zu gelangen, was sowohl sicher als auch flexibel ist.
Niemals die Benutzereingabe direkt in SQL eingeben.
Wenn Sie Bindungsparameter verwenden, kann das Angeben von Datentypen (z. B. PDO :: param_int ) die Sicherheit und Leistung verbessern.
Vor dem Löschen können Sie eine Auswahl überprüfen, um zu bestätigen, ob das Operationsobjekt vorhanden ist.
Verwenden Sie die Transaktionsverarbeitung ( begintransaktion () / commesentum () ), um eine versehentliche Löschung zu vermeiden.
Wenn Sie einen Datensatz basierend auf der HTTP -Anforderung löschen möchten, z .
<?php
if ($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['id'])) {
$id = (int) $_GET['id'];
$stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
$stmt->execute();
echo json_encode([
'success' => true,
'message' => 'Benutzer löschen erfolgreich',
]);
} else {
http_response_code(400);
echo json_encode([
'success' => false,
'message' => 'Die Anfrage ist illegal',
]);
}
?>
Im Schnittstellendesign müssen auch die Eingangsprüfung und die Parameterbindung aufmerksam gemacht werden, um Angriffe durch APIs zu verhindern.
Verwandte Tags:
PDOStatement