$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$bdd->exec($req);
"DELETE FROM billets WHERE id = $_GET['id']" si tu veux qu'un index de tableau soit interprété dans une chaîne tu dois alors le mettre entre accolades "DELETE FROM billets WHERE id = {$_GET['id']}". Mais comme je te l'ai précisé, en l’occurrence il faut que tu passes par le bindParam.supprimer_billet.php?id=17
<?php
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$bdd->exec($req);
?>
et j'obtient l'érreur:Oui à un ou deux détails près.$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', ''); $req = $bdd->prepare('DELETE FROM billets WHERE id = :id'); $req->bindParam(':id', $_GET['id']); $bdd->exec($req);
Il est recommandé de lier le paramètre en utilisant la méthode bindParam pour éviter une injection SQL car l'utilisateur pourrait modifier le contenu de $_GET['id'] pour tenter une attaque. La méthode bindParam va ajouter des ' autour de la chaîne et échapper les ' à l'intérieur de la chaîne s'il y en a.
Si tu es un puriste tu pourrais ajouter un troisième paramètre au bindParam, PDO::PARAM_INT pour signaler au bindParam que le paramètre est un integer mais ça marchera de toute façon très bien avec la valeur par défaut PDO::PARAM_STR.
https://www.php.net/manual/fr/pdostatem ... dparam.php
Et la méthode PDO::exec est plus adaptée à l'exécution d'un UPDATE ou d'un DELETE car elle retourne le nombre de lignes affectées. Tu peux ainsi tester le retour du exec pour savoir si une ligne a bien été supprimée.
On pourrait soulever une autre question de sécurité, l'utilisateur a-t-il le droit de supprimer la ligne en question ?
Et sinon au passage dans ton code tu as missi tu veux qu'un index de tableau soit interprété dans une chaîne tu dois alors le mettre entre accolades"DELETE FROM billets WHERE id = $_GET['id']". Mais comme je te l'ai précisé, en l’occurrence il faut que tu passes par le bindParam."DELETE FROM billets WHERE id = {$_GET['id']}"
PS : pour les bases standards comme tu dis et bien tu achètes un bon bouquin ou tu trouves des bons tutaux sur un site internet type openclassrooms https://openclassrooms.com
La doc php quand à elle se trouve sur le site https://www.php.net
Avec les bons mots clés tu peux trouver tout ce dont tu as besoin via google.![]()
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$req->execute();
Tu peux toujours tester le retour mais la pour savoir si la requête s'est bien exécutée ou pas (retour true ou false).$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->execute(array(':id' => $_GET['id']));
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$bdd->exec('DELETE FROM billets WHERE id = '.$bdd->quote($_GET['id']));
le PDO::quote va protéger ta chaîne tout comme le fait le bindParam.
$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
$req = $bdd->prepare('DELETE FROM billets WHERE id = :id');
$req->bindParam(':id', $_GET['id']);
$req->execute();
Autant pour moi, le PDO::exec attend bien un string (la requête) tu ne peux donc pas faire le DELETE en faisant un bindParam et passer par PDO::exec.
Avec le PDO::prepare il faut donc utiliser PDOStatement::execute. C'est un peu dommage mais bon.Tu peux toujours tester le retour mais la pour savoir si la requête s'est bien exécutée ou pas (retour true ou false).$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', ''); $req = $bdd->prepare('DELETE FROM billets WHERE id = :id'); $req->bindParam(':id', $_GET['id']); $req->execute();
Et puis du coup tu peux même réduire le code à ça :$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', ''); $req = $bdd->prepare('DELETE FROM billets WHERE id = :id'); $req->execute(array(':id' => $_GET['id']));
Mais pour garder l'option de récupérer le nombre de lignes affectées en passant par PDO::exec tu dois pourvoir faire proprement aussi comme ça :le PDO::quote va protéger ta chaîne tout comme le fait le bindParam.$bdd = new PDO('mysql:host=localhost;dbname=blog', 'root', ''); $bdd->exec('DELETE FROM billets WHERE id = '.$bdd->quote($_GET['id']));
Tu ne t'es pas trompé, c'est la première réponse que je t'ai donné dans ma réponse précédente.![]()
Pour le reste j'ai tout détaillé et personnellement je privilégierais la troisième option car plus cohérente à mon sens.