PDO problème d'execution requête [Résolu/Fermé]

Signaler
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
-
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
-
Bonjour à tous,

j'ai un petit soucis de requête ou d'envoi de variable. Je n'arrive pas réellement à savoir lequel car le errorInfo ne m'affiche pas d'erreur ... Les codes concernent l'extension d'un tuto du site du zero sur la création d'un blog en PDO.

Je laisse le choix entre modifier ou supprimer dans ce fichier :

<?php
try
{
$bdd= new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}

echo'<h1>MODIFIER/SUPPRIMER</h1><br/>';
echo '<form method="GET" action="FormModifSupp.php" name="f1"/>';
echo"selectionner un jeu : <select name='ID'>";

$sql="SELECT ID,nom FROM jeux_video";
$reponse = $bdd->query($sql) or die (print_r($bdd->errorInfo()));
$reponse->setFetchMode(PDO::FETCH_ASSOC);

foreach($reponse as $row)
{
echo '<option value=('.$row["ID"].')>'.$row["nom"].'</option>';
}
echo"</select>";
echo"<input type='submit' name='choix' value='Modifier'/>";
echo"<input type='submit' name='choix' value='Supprimer'/></form>";
?>


La page de modification marche parfaitement, mais pas ma page de suppression :

<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$req=$bdd->prepare('DELETE FROM jeux_video WHERE ID = :ID');
$req->execute(array('ID' => $_GET['ID'] or die(print_r($bdd->errorInfo(), true))));
echo "supprimé !";
echo print_r($_GET);
?>



Résultat de cette page pour la suppression du tuple ayant pour ID => 2 :


supprimé !Array ( [ID] => (2) [choix] => Supprimer ) 1

Sauf que celui ci ne supprime rien...

Ce petit "1" m'intrigue un peu... de plus je constate que je ne peux que supprimer le tuple ayant pour ID => 1

Si vous avez une solution à mon problème, je suis preneur !
Merci à vous.

9 réponses


L'enregistrement 1 avait été effacé auparavant à cause du problème de parenthèses que je t'ai décrit.
Si $_GET['ID'] vaut (2) au lieu de 2, c'est normal que la suppression ne se fasse pas : c'est toi qui n'indique pas le bon ID.
Ça vient du lien ou du formulaire qui est à l'origine du $_GET. Si tu ne vois pas d'où viennent ces parenthèses en trop, donne le code, nous pourrons te dire quoi corriger.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Utilisateur anonyme
Pardon, je n'avais pas vu que le formulaire était dans ton 1er post...
echo '<option value=('.$row["ID"].')>'.$row["nom"].'</option>'; 

il faut retirer les parenthèses :
echo '<option value='.$row["ID"].'>'.$row["nom"].'</option>'; 


Si ça marche bien pour récupérer les informations concernant cet ID, c'est que tu as dû écrire ta requête SELECT sans la paramétrer

Si tu ne la paramètres pas :
... WHERE ID='.$_GET['ID'] devient ... WHERE ID=(2) ce qui est la même chose que WHERE ID=2
Alors que si ta requête est paramétrée (cas de ton DELETE), des apostrophes sont ajoutées autour du paramètre :
... WHERE ID='.$_GET['ID'] devient ... WHERE ID='(2)' ce qui n'est pas du tout la même chose que WHERE ID=2
Messages postés
1094
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
31 mai 2019
163
Essaye avec ceci :
		
$req=$bdd->prepare('DELETE FROM jeux_video WHERE ID = ?'); 
$req->execute(array($_GET['ID']));

Messages postés
1094
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
31 mai 2019
163
Sinon je crois que tes paramètres en GET, met plutôt un name à chaque sous partie
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
3
J'ai mis un name commun pour laisser le choix qui s'envoi vers cette page :

<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}

if ($_GET['choix'] == "Modifier")
{
include('ModifDonnees.php');
}
else
{
include('SuppDonnees.php');
}
?>

Bonjour

Ton problème vient de parenthèses mal placées dans
$req->execute(array('ID' => $_GET['ID'] or die(print_r($bdd->errorInfo(), true))));

Il aurait fallu écrire
$req->execute(array('ID' => $_GET['ID'])) or die(print_r($bdd->errorInfo(), true)); 

À quoi sert le print_r d'ailleurs ? Perso, j'aurais écrit
$req->execute(array('ID' => $_GET['ID'])) or die($bdd->errorInfo()); 

Ça va aussi marcher avec la méthode de MastercroW, mais tu perds le message d'erreur.
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
3
Aucun des 2 ne fonctionnent. même en réécriture et copier/coller du code. Le but du print_r est de pouvoir voir si il m'envoyait les bonnes données.

Pour le print_r, c'est vrai que je n'avais pas pris en compte que $bdd->errorInfo() renvoyait un tableau. Tu as donc tout à fait raison là-dessus.
Par contre, quand tu écrivais $req->execute(array('ID' => $_GET['ID'] or die(print_r($bdd->errorInfo(), true)))); il y avait clairement une erreur : à cause de tes parenthèses, la valeur associée à ID était :
$_GET['ID'] or die(print_r($bdd->errorInfo(), true))
C'est une expression logique. Dès que $_GET['ID'] vaut autre chose que 0, elle est 'true' et la deuxième partie (le die(print_r...) est complètement ignorée et ne sert donc à rien. Et comme 'true' vaut en fait 1, tu te retrouves à exécuter $req->execute(array('ID' => 1)). Donc tu n'effaces que l'ID 1.
Par contre, si l'ID valait 0, tu ferais le die à tous les coups, même sans erreur.
D'où ma correction des parenthèses.

Ensuite, pour ce "petit 1 qui t'intrigue un peu", il vient du double emploi echo-print_r dans echo print_r($_GET);
Quand echo évalue ce qu'il doit afficher, il exécute le print_r qui affiche ta variable. Mais ça ne s'arrête pas là, print_r rend 'true' et echo affiche donc true, c'est à dire 1.

Peux-tu essayer :
<?php
try
{
$bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$req=$bdd->prepare('DELETE FROM jeux_video WHERE ID = :ID');
$req->execute(array('ID' => $_GET['ID'] )) or die(print_r($bdd->errorInfo(), true));
echo "supprimé !";
print_r($_GET);
?> 

avec ID=2 et nous montrer ce que ça affiche, et nous confirmer si oui ou non l'enregistrement 2 a été effacé ?
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
3
Merci pour les informations que tu m'as fournis.
Aucun changement, le résultat :

supprimé !Array ( [ID] => (2) [choix] => Supprimer )

Mais toujours l'ID => 2 dans la base.

Je t'ai demandé de faire l'essai avec l'id 2. Mais visiblement, tu le fais avec l'id (2).

2 et (2), ce n'est pas la même chose...
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
3
l'essai a été fait avec l'id 2. En ce qui concerne l'id 1, il peut être supprimé mais pas les autres. du fait que je n'ai plus d'id(1) dans ma bdd
Messages postés
1094
Date d'inscription
dimanche 3 octobre 2010
Statut
Membre
Dernière intervention
31 mai 2019
163
C'est ton formulaire qui envois les données qui est incorrect.
Revois le je pense ! Fais un echo pour voir ce que le $_GET envoi.
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
3
Array ( [ID] => (2) [choix] => Supprimer )
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
3
ce que je trouve bizarre c'est que ma modification marche parfaitement et récupère le bon ID pour avoir les données concernant cette ID
Messages postés
92
Date d'inscription
samedi 18 août 2012
Statut
Membre
Dernière intervention
4 avril 2013
3
C'était exactement ça ! Je te remercie Le Père pour ta précieuse aide ainsi que tes conseils.

Problème résolu.