PDO problème d'execution requête
Résolu
logique
Messages postés
92
Date d'inscription
Statut
Membre
Dernière intervention
-
logique Messages postés 92 Date d'inscription Statut Membre Dernière intervention -
logique Messages postés 92 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- PDO problème d'execution requête
- Le service spouleur d'impression local n'est pas en cours d'exécution - Guide
- Erreur d'exécution de la requete erreur inconnue ✓ - Forum PHP
- Microsoft excel attend la fin de l'exécution d'une action ole d'une autre application ✓ - Forum Word
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Processus d'execution client serveur - Forum Windows 10
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.
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.
Essaye avec ceci :
$req=$bdd->prepare('DELETE FROM jeux_video WHERE ID = ?'); $req->execute(array($_GET['ID']));
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');
}
?>
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.
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
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é ?
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.
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...
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