PDO problème d'execution requête

Résolu/Fermé
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 - Modifié par logique le 5/01/2013 à 14:30
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 - 6 janv. 2013 à 17:53
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

Utilisateur anonyme
6 janv. 2013 à 17:19
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
Utilisateur anonyme
6 janv. 2013 à 17:31
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
0
MastercroW Messages postés 1095 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 31 mai 2019 163
5 janv. 2013 à 15:58
Essaye avec ceci :
		
$req=$bdd->prepare('DELETE FROM jeux_video WHERE ID = ?'); 
$req->execute(array($_GET['ID']));

0
MastercroW Messages postés 1095 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 31 mai 2019 163
5 janv. 2013 à 16:04
Sinon je crois que tes paramètres en GET, met plutôt un name à chaque sous partie
0
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 3
6 janv. 2013 à 10:18
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');
}
?>
0
Utilisateur anonyme
5 janv. 2013 à 19:38
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.
0
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 3
6 janv. 2013 à 10:14
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
6 janv. 2013 à 11:43
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é ?
0
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 3
6 janv. 2013 à 13:47
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.
0
Utilisateur anonyme
6 janv. 2013 à 14:18
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...
0
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 3
6 janv. 2013 à 16:57
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
0
MastercroW Messages postés 1095 Date d'inscription dimanche 3 octobre 2010 Statut Membre Dernière intervention 31 mai 2019 163
6 janv. 2013 à 17:00
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.
0
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 3
6 janv. 2013 à 17:00
Array ( [ID] => (2) [choix] => Supprimer )
0
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 3
6 janv. 2013 à 17:07
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
0
logique Messages postés 92 Date d'inscription samedi 18 août 2012 Statut Membre Dernière intervention 4 avril 2013 3
6 janv. 2013 à 17:53
C'était exactement ça ! Je te remercie Le Père pour ta précieuse aide ainsi que tes conseils.

Problème résolu.
0