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
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
A voir également:
- PDO problème d'execution requête
- Processus d'execution client serveur - Forum Windows 10
- Un administrateur vous a refusé l'execution de cette application - Forum Windows 10
- Erreur d'exécution 1004 ✓ - Forum Excel
- Erreur lors de l'envoi de la requête facebook marketplace - Forum Facebook
- Erreur d'execution 13 ✓ - Forum Programmation
9 réponses
Utilisateur anonyme
6 janv. 2013 à 17:19
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.
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.
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
5 janv. 2013 à 15:58
Essaye avec ceci :
$req=$bdd->prepare('DELETE FROM jeux_video WHERE ID = ?'); $req->execute(array($_GET['ID']));
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
5 janv. 2013 à 16:04
Sinon je crois que tes paramètres en GET, met plutôt un name à chaque sous partie
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
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');
}
?>
<?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');
}
?>
Utilisateur anonyme
5 janv. 2013 à 19:38
5 janv. 2013 à 19:38
Bonjour
Ton problème vient de parenthèses mal placées dans
Il aurait fallu écrire
À quoi sert le print_r d'ailleurs ? Perso, j'aurais écrit
Ça va aussi marcher avec la méthode de MastercroW, mais tu perds le message d'erreur.
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.
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
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
6 janv. 2013 à 11:43
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 :
avec ID=2 et nous montrer ce que ça affiche, et nous confirmer si oui ou non l'enregistrement 2 a été effacé ?
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é ?
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
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.
Aucun changement, le résultat :
supprimé !Array ( [ID] => (2) [choix] => Supprimer )
Mais toujours l'ID => 2 dans la base.
Utilisateur anonyme
6 janv. 2013 à 14:18
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...
2 et (2), ce n'est pas la même chose...
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
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
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
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.
Revois le je pense ! Fais un echo pour voir ce que le $_GET envoi.
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
6 janv. 2013 à 17:00
Array ( [ID] => (2) [choix] => Supprimer )
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
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
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
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.
Problème résolu.
6 janv. 2013 à 17:31
il faut retirer les parenthèses :
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