Position actuelle: Accueil> Derniers articles> Comment utiliser le pdostatement pour supprimer en toute sécurité des enregistrements dans les bases de données en fonction des conditions? L'utilisera après l'avoir lu

Comment utiliser le pdostatement pour supprimer en toute sécurité des enregistrements dans les bases de données en fonction des conditions? L'utilisera après l'avoir lu

M66 2025-06-22

1. Pourquoi utiliser APD et les déclarations de prétraitement

Lors de la construction de déclarations de supprimer SQL, de nombreux développeurs ont tendance à épisser directement les chaînes, comme celle-ci:

 $id = $_GET['id'];
$sql = "DELETE FROM users WHERE id = $id";

Cette méthode est extrêmement vulnérable aux attaques d'injection SQL. Par exemple, si un utilisateur malveillant passe 1 ou 1 = 1 , le contenu de l'ensemble du tableau sera supprimé.

Ce problème peut être complètement évité en utilisant les instructions de prétraitement de PDO. Il sépare SQL des données pour garantir que les données entrantes ne sont pas interprétées comme faisant partie des instructions SQL.


2. Exemples de base de l'utilisation de l'APD pour supprimer les enregistrements

Voici un moyen sûr de supprimer les enregistrements des utilisateurs à l'aide de l'APD:

 <?php
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$username = 'root';
$password = 'your_password';

try {
    $pdo = new PDO($dsn, $username, $password);
    // Définissez le mode d&#39;erreur sur exception
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Déclarations de prétraitement
    $stmt = $pdo->prepare("DELETE FROM users WHERE id = :id");

    // Lier les paramètres et exécuter
    $id = 5; // Par exemple à partir d&#39;un formulaire ou URL Utilisateurs acquisID
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);

    $stmt->execute();

    if ($stmt->rowCount()) {
        echo "Les enregistrements ont été supprimés avec succès。";
    } else {
        echo "Aucun enregistrement correspondant trouvé。";
    }
} catch (PDOException $e) {
    echo "Erreur de base de données: " . $e->getMessage();
}
?>

Dans cet exemple, nous utilisons l'espace réservé : ID et liez les variables via BindParam pour assurer la cohérence du type de données.


3. Supprimer les enregistrements basés sur plusieurs conditions

Parfois, il y a plus d'une condition de suppression, comme la suppression d'un enregistrement de connexion d'un utilisateur à un moment précis:

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

4. Comment gérer les conditions dynamiques

Si les conditions de suppression sont générées dynamiquement, telles que la suppression par lots des cases à partir de l'avant, vous pouvez la construire comme ceci:

 <?php
$ids = [2, 5, 7]; // De la forme ou du front ID Liste

// Construit un espace réservé SQL
$placeholders = implode(',', array_fill(0, count($ids), '?'));
$sql = "DELETE FROM users WHERE id IN ($placeholders)";
$stmt = $pdo->prepare($sql);

// Instruction d&#39;exécution,Lier tous les paramètres
$stmt->execute($ids);

Cette approche tire parti de la capacité des espaces réservées et s'exécute à passer dans les tableaux, ce qui est à la fois sûr et flexible.


5. Conseils de sécurité

  1. N'éplisez jamais l'entrée utilisateur directement dans SQL.

  2. Lorsque vous utilisez des paramètres de liaison, la spécification des types de données (tels que PDO :: param_int ) peut améliorer la sécurité et les performances.

  3. Avant la suppression, vous pouvez effectuer une vérification sélectionnée pour confirmer si l'objet d'opération existe.

  4. Utilisez le traitement des transactions ( beginTransaction () / commit () ) pour éviter la suppression accidentelle.


6. Combiné avec des enregistrements de suppression d'interface (exemple d'interface Restful)

Si vous souhaitez supprimer un enregistrement basé sur la demande HTTP, par exemple via l'interface https://m66.net/api/delete_user.php?id=9 , vous pouvez l'écrire comme ceci:

 <?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' => 'Suppression de l&#39;utilisateur',
    ]);
} else {
    http_response_code(400);
    echo json_encode([
        'success' => false,
        'message' => 'La demande est illégale',
    ]);
}
?>

Dans la conception de l'interface, la vérification des entrées et la liaison des paramètres doivent également être accordées à l'emploi des attaques via des API.