DELETE enregistrements supérieurs à une vale
Résolu/Fermé
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
-
Modifié par rjl le 28/08/2012 à 22:14
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 - 31 août 2012 à 18:57
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 - 31 août 2012 à 18:57
A voir également:
- DELETE enregistrements supérieurs à une vale
- Just delete me - Guide
- Hiberfil.sys delete - Guide
- Comment enregistrer une video youtube - Guide
- Comment enregistrer une musique sur youtube en mp3 - Guide
- Touche delete clavier ✓ - Forum Clavier
11 réponses
Mihawk
Messages postés
4315
Date d'inscription
mercredi 29 mars 2006
Statut
Contributeur
Dernière intervention
6 janvier 2015
846
29 août 2012 à 09:21
29 août 2012 à 09:21
Hello,
En effet, un fetch sur un delete n'a strictement aucun sens. C'est là ton problème.
Je soulève une autre interrogation : pourquoi à un moment tu définis :
Et plus loin tu appelles :
Autrement dit, tu déclares une variable $param mais tu ne t'en sers jamais :-/
En effet, un fetch sur un delete n'a strictement aucun sens. C'est là ton problème.
Je soulève une autre interrogation : pourquoi à un moment tu définis :
$param = array(':toto' => $cle);
Et plus loin tu appelles :
$sth->execute(array(':toto' => $cle)); // Au lieu de : $sth->execute($param);
Autrement dit, tu déclares une variable $param mais tu ne t'en sers jamais :-/
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
Modifié par rjl le 30/08/2012 à 16:36
Modifié par rjl le 30/08/2012 à 16:36
Bonjour,
D'abord tous mes remerciements à webdesignentreprise et Mihawk
Pour Mihawk, il a tout à fait raison dans son indication de supprimer array(':toto' => $cle) dont je ne me servais pas, répétant l'assignation. J'avais corrigé une instruction de même type ailleurs mais pas celle-ci ! Ceci tient au fait que débutant, je ne lis pas couramment le PHP et, par ailleurs, ce n'est pas non plus la lecture des tutos ou livres (j'ai PHP avecncé d'Eric Daspet) qui résolvent mes difficultés : il vient un moment où il faut s'immerger et apprendre par osmose.
Je reviens donc après avoir pris le temps d'essayer de comprendre le rôle de fetch dans les instructions PDO ; pour autant, je n'ai pas obtenu une explication claire de son utilisation !
Je ne l'ai pas moins supprimé réalisant que pour atteindre la fin de table, l'instruction WHILE tenait lieu de boucle.
Par contre, avec ce code corrigé, j'enregistre déjà un progrès car, le code m'a supprimé 6 enregistrements au-delà du minimum que j'avais fixé (me laissant la possibilité d'autres essais sans recréer d'enregistrements) !
Toutefois, comme je n'avais pas de gestion de fin de table, je suis parti dans une boucle sans fin m'imposant de tuer la tâche qui affichait toujours le code transmis inférieur aux clés des enregistrements à supprimer (ici 411).
Deux erreurs donc je n'affichais pas les codes supprimés mais la borne inférieure... mais comme déjà précisé ne savais pas arrêter en fin de table (test de False ?).
Dans mon dernier test en ayant tenté d'arrêter la boucle avec le code joint, je constate que les 2 enregistrements visés sont bien disparus sans que j'ai pu voir si leur N° de clé était correct ou non mais, ensuite donc en fin de table, je bloque sur un message comme si je n'étais pas arrêté par mon test : "and ($sth != false) ! Le message est alors :
"Clé
Catchable fatal error: Object of class PDOStatement could not be converted to string in /web/utlsudgoelo/www/pgUTL/AdhDEL.php on line 30 "
Au passage, je note le Clé qui n'est autre que Clé mais non interprêté comme de l'UTF-8 ! Quel équivalent à "<meta charset="UTF-8">" en HTML puis-je mettre pour imposer l'UTF-8 en PHP strict ? Au niveau de Notepad++, j'ai bien demandé "encoder en UTF-8 (sans BOM)".
Code concerné :
Merci de votre appui RJL2830
D'abord tous mes remerciements à webdesignentreprise et Mihawk
Pour Mihawk, il a tout à fait raison dans son indication de supprimer array(':toto' => $cle) dont je ne me servais pas, répétant l'assignation. J'avais corrigé une instruction de même type ailleurs mais pas celle-ci ! Ceci tient au fait que débutant, je ne lis pas couramment le PHP et, par ailleurs, ce n'est pas non plus la lecture des tutos ou livres (j'ai PHP avecncé d'Eric Daspet) qui résolvent mes difficultés : il vient un moment où il faut s'immerger et apprendre par osmose.
Je reviens donc après avoir pris le temps d'essayer de comprendre le rôle de fetch dans les instructions PDO ; pour autant, je n'ai pas obtenu une explication claire de son utilisation !
Je ne l'ai pas moins supprimé réalisant que pour atteindre la fin de table, l'instruction WHILE tenait lieu de boucle.
Par contre, avec ce code corrigé, j'enregistre déjà un progrès car, le code m'a supprimé 6 enregistrements au-delà du minimum que j'avais fixé (me laissant la possibilité d'autres essais sans recréer d'enregistrements) !
Toutefois, comme je n'avais pas de gestion de fin de table, je suis parti dans une boucle sans fin m'imposant de tuer la tâche qui affichait toujours le code transmis inférieur aux clés des enregistrements à supprimer (ici 411).
Deux erreurs donc je n'affichais pas les codes supprimés mais la borne inférieure... mais comme déjà précisé ne savais pas arrêter en fin de table (test de False ?).
Dans mon dernier test en ayant tenté d'arrêter la boucle avec le code joint, je constate que les 2 enregistrements visés sont bien disparus sans que j'ai pu voir si leur N° de clé était correct ou non mais, ensuite donc en fin de table, je bloque sur un message comme si je n'étais pas arrêté par mon test : "and ($sth != false) ! Le message est alors :
"Clé
Catchable fatal error: Object of class PDOStatement could not be converted to string in /web/utlsudgoelo/www/pgUTL/AdhDEL.php on line 30 "
Au passage, je note le Clé qui n'est autre que Clé mais non interprêté comme de l'UTF-8 ! Quel équivalent à "<meta charset="UTF-8">" en HTML puis-je mettre pour imposer l'UTF-8 en PHP strict ? Au niveau de Notepad++, j'ai bien demandé "encoder en UTF-8 (sans BOM)".
Code concerné :
$query = 'DELETE FROM adh WHERE cle > :toto'; $param = array(':toto' => $cle); $sth = $connexion->prepare($query); try { // On envoie la requète $sth->execute($param); while (($cle > $sth) and ($sth != false)) { echo '<h4>','Clé ', $sth,'supprimée','</h4>'; } } catch( Exception $e ){ echo 'Erreur de requète : ', $e->getMessage(); } $a_results = $sth; echo $a_results;
Merci de votre appui RJL2830
Mihawk
Messages postés
4315
Date d'inscription
mercredi 29 mars 2006
Statut
Contributeur
Dernière intervention
6 janvier 2015
846
30 août 2012 à 16:46
30 août 2012 à 16:46
Pas le temps de te re-aider ce soir je reviendrai demain.
Pour info, un SELECT renvoie des données inexploitables par PHP, le fetch sert principalement à les mettre en forme.
Pour info, un SELECT renvoie des données inexploitables par PHP, le fetch sert principalement à les mettre en forme.
Utilisateur anonyme
30 août 2012 à 16:52
30 août 2012 à 16:52
Bonjour rjl
1 - fetch sert à récupérer les différents enregistrements rendus par une requête SQL de type "SELECT"
Une requête comme INSERT ou DELETE ne renvoie rien du tout (à part OK/ pas OK), il n'y a pas de fetch à faire dessus.
2 - Quand tu as exécuté ton DELETE ($sth->execute($param); ), ça y est, les enregistrements sont effacés. Il n'y a pas de boucle à faire sur un résultat de DELETE pour savoir ce qui a été effacé, c'est trop tard. Tu peux éventuellement faire un SELECT avant avec le même WHERE pour savoir ce qui va être effacé.
3 - Quand au Clé que tu vois au lieu de Clé, c'est très probablement que le message d'erreur est envoyé AVANT le <meta charset="UTF-8">. Le navigateur reçoit un message avec de l'UTF8 (car toi tu as bien écrit en UTF-8) mais comme le script s'arrête, il ne reçoit jamais la balise meta. Donc il ne sait pas que c'est de l'utf-8 et fait comme si c'était de l'ISO (encodage par défaut), d'où l'affichage anormal.
1 - fetch sert à récupérer les différents enregistrements rendus par une requête SQL de type "SELECT"
Une requête comme INSERT ou DELETE ne renvoie rien du tout (à part OK/ pas OK), il n'y a pas de fetch à faire dessus.
2 - Quand tu as exécuté ton DELETE ($sth->execute($param); ), ça y est, les enregistrements sont effacés. Il n'y a pas de boucle à faire sur un résultat de DELETE pour savoir ce qui a été effacé, c'est trop tard. Tu peux éventuellement faire un SELECT avant avec le même WHERE pour savoir ce qui va être effacé.
3 - Quand au Clé que tu vois au lieu de Clé, c'est très probablement que le message d'erreur est envoyé AVANT le <meta charset="UTF-8">. Le navigateur reçoit un message avec de l'UTF8 (car toi tu as bien écrit en UTF-8) mais comme le script s'arrête, il ne reçoit jamais la balise meta. Donc il ne sait pas que c'est de l'utf-8 et fait comme si c'était de l'ISO (encodage par défaut), d'où l'affichage anormal.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
31 août 2012 à 11:19
31 août 2012 à 11:19
Bonjour le père,
Merci pour la réponse qui m'a permis de corriger quelques points et surtout incompréhensions ; dans mon esprit, le fetch faisait avancer "d'un cran" soit en enregistrement soit simplement en champ ! Du grand flou alors que c'est le WHILE qui assure le passage par la condition.
au passage, merci aussi à Mihawk qui avait prévu de revenir aujourd'hui.
Une fois le traitement effectué (correctement), une curiosité toutefois : le script tourne en rond et je ne peux pas revenir à une page appelante ("Bureau") en cliquant dessus sans tuer ce script qui tourne en rond ;
en fait, les pages de même niveau que la page appelante que je n'atteint pas sont accessible mais le script continue à boucler et il faut que j'atteigne la page d'accueil pour qu'elle soit interrompue et que je puisse revenir dans cette page qui était inutilisable !
J'ai essayé bien des solutions (y compris un exit juste derrière le WHILE) mais, rien n'y fait ce qui laisserait penser que le WHILE tourne en rond ?
J'avais même supprimé le CATCH mais n'ai pu alors essayer car le système me prétendait alors qu'il trouvait un ';' intempestif !
Alors, bien sûr, je serai seul (en principe) à me servir de cette fonction donc je peux fonctionner, sachant comment en sortir... sauf que ça cache quelquechose, au moins en compréhension à mon niveau !
Je rappelle le code pour cette partie (j'avais supprimé le Locate inutilisable car sans doute trop loin et après édition).
Autre détail concernant le Clé au ieu de 'clé', je n'ai pas de <meta charset="UTF-8"> car c'est un script en PHP sans HTML. Quelle solution dans ce cas ? A noter que c'est sans problème instantané car j'ai éliminé l'écho !
Voila les nouvelles... Encore merci pour ton assiduité et cet appui permanent.
@+ RJL2831
Merci pour la réponse qui m'a permis de corriger quelques points et surtout incompréhensions ; dans mon esprit, le fetch faisait avancer "d'un cran" soit en enregistrement soit simplement en champ ! Du grand flou alors que c'est le WHILE qui assure le passage par la condition.
au passage, merci aussi à Mihawk qui avait prévu de revenir aujourd'hui.
Une fois le traitement effectué (correctement), une curiosité toutefois : le script tourne en rond et je ne peux pas revenir à une page appelante ("Bureau") en cliquant dessus sans tuer ce script qui tourne en rond ;
en fait, les pages de même niveau que la page appelante que je n'atteint pas sont accessible mais le script continue à boucler et il faut que j'atteigne la page d'accueil pour qu'elle soit interrompue et que je puisse revenir dans cette page qui était inutilisable !
J'ai essayé bien des solutions (y compris un exit juste derrière le WHILE) mais, rien n'y fait ce qui laisserait penser que le WHILE tourne en rond ?
J'avais même supprimé le CATCH mais n'ai pu alors essayer car le système me prétendait alors qu'il trouvait un ';' intempestif !
Alors, bien sûr, je serai seul (en principe) à me servir de cette fonction donc je peux fonctionner, sachant comment en sortir... sauf que ça cache quelquechose, au moins en compréhension à mon niveau !
Je rappelle le code pour cette partie (j'avais supprimé le Locate inutilisable car sans doute trop loin et après édition).
$query = 'DELETE FROM adh WHERE cle > :toto'; $param = array(':toto' => $cle); $sth = $connexion->prepare($query); try { // On envoie la requète $sth->execute($param); while ($cle > $sth); exit;} catch( Exception $e ){ echo 'Erreur de requète : ', $e->getMessage(); } // Header("Location:/pgUTL/identifK.php"); // Retour choix intervention // exit; ?>
Autre détail concernant le Clé au ieu de 'clé', je n'ai pas de <meta charset="UTF-8"> car c'est un script en PHP sans HTML. Quelle solution dans ce cas ? A noter que c'est sans problème instantané car j'ai éliminé l'écho !
Voila les nouvelles... Encore merci pour ton assiduité et cet appui permanent.
@+ RJL2831
Utilisateur anonyme
Modifié par le père. le 31/08/2012 à 11:53
Modifié par le père. le 31/08/2012 à 11:53
while ($cle > $sth);
Ça, c'est un while avec une instruction vide.
Autrement dit, si ta condition est vraie une fois, tu exécutes le point-virgule, puis tu reviens tester la condition du while... Comme il ne s'est évidemment rien passé entre temps, la condition et toujours vraie et le while continue encore et encore.
Après un while() (comme un if() ou un for() d'ailleurs), soit tu mets UNE SEULE instruction terminée par un ; soit tu mets un bloc d'instructions délimité par des { }
Si tu mets un ; tu es dans le 1er cas, avec une instruction vide. C'est une erreur classique.
Dans ton cas, supprime complètement le while, il ne sert à rien.
Pour le Clé, tu as plusieurs possibilités. La seule qui soit vraiment propre, c'est d'envoyer effectivement les balises HTML qui vont bien avant, car ton navigateur essaye d'afficher ton texte comme du html (il est fait pour ça, on ne peut pas lui reprocher). Et si tu trouves pénible de tout lui envoyer, comme tu sais que, sans les balises, il va considérer que c'est de l'iso, tu peux (pour une fois !) utiliser utf8_decode pour que ce que tu as écrit en utf-8 soit transformé en iso.
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
31 août 2012 à 15:15
31 août 2012 à 15:15
Merci encore car effectivement, ça fonctionne bien !
De fait, je me perdais entre le 'DELETE FROM adh WHERE cle > :toto' et le WHERE dont la condition était redondante (la ceinture et les bretelles !).
Petit détail, rien n'indique que l'opération s'est bien déroulée...
J'ai donc mis en place une instruction censée me donner le nombre d'enregistrements effacés...
Première fois : rien car j'étais passé sur la page suivante et donc, je me suis arrêté sur un exit lequel m'a indiqué en dernier lieu "enregistrements effacés enregistrements effacés"...
D'abord, je n'ai pas encore intégré HTML et donc le méta UFT-8 ;
Ensuite, dans un premier temps, j'ai tenté de mettre
$count = $sth->rowCount();
echo $Count ," enregistrements effacés"; avant l'exit pour obtenir l'indication de mes 2 enregistrements supprimés... mais pas de nombre !!
J'ai donc positionné ces instructions en fin du try avant la '}'... en oubliant celle d'avant l'exit... Je craignais avoir une indication par suppression et en ai bien eu 2 dont la seconde liée à mon oubli !!
Mais toujours pas d'info sur le nombre !
Où serait mon erreur ?
@bientôt
De fait, je me perdais entre le 'DELETE FROM adh WHERE cle > :toto' et le WHERE dont la condition était redondante (la ceinture et les bretelles !).
Petit détail, rien n'indique que l'opération s'est bien déroulée...
J'ai donc mis en place une instruction censée me donner le nombre d'enregistrements effacés...
Première fois : rien car j'étais passé sur la page suivante et donc, je me suis arrêté sur un exit lequel m'a indiqué en dernier lieu "enregistrements effacés enregistrements effacés"...
D'abord, je n'ai pas encore intégré HTML et donc le méta UFT-8 ;
Ensuite, dans un premier temps, j'ai tenté de mettre
$count = $sth->rowCount();
echo $Count ," enregistrements effacés"; avant l'exit pour obtenir l'indication de mes 2 enregistrements supprimés... mais pas de nombre !!
J'ai donc positionné ces instructions en fin du try avant la '}'... en oubliant celle d'avant l'exit... Je craignais avoir une indication par suppression et en ai bien eu 2 dont la seconde liée à mon oubli !!
Mais toujours pas d'info sur le nombre !
Où serait mon erreur ?
try { // On envoie la requète $sth->execute($param); $count = $sth->rowCount(); echo $Count ," enregistrements effacés"; } catch( Exception $e ){ echo 'Erreur de requète : ', $e->getMessage(); } $count = $sth->rowCount(); echo $Count ," enregistrements effacés"; // Header("Location:/pgUTL/identifK.php"); // Retour choix intervention exit;Merci mais je crains de revenir (j'espère plus sur ce point mais je compte débuter un script avec SELECT puis UPDATE... pour tous les enregistrements de la table répondant à des caractéristiques particulières.
@bientôt
Utilisateur anonyme
Modifié par le père. le 31/08/2012 à 16:08
Modifié par le père. le 31/08/2012 à 16:08
$count = $sth->rowCount(); echo $Count ," enregistrements effacés";
$count et $Count ne sont pas la même variable...
Par une bizarrerie des inventeurs du langage que je n'ai jamais comprise, php est sensible à la casse dans les noms de variables, pas dans les noms des fonctions. Va comprendre...
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
31 août 2012 à 16:26
31 août 2012 à 16:26
Là, je m'y suis déjà fait prendre et n'aurai pas du récidiver !
Mais, pour autant avec 3 enregistrements supprimés, ça n'a pas fonctionné :
Dans la mesure où, même après l'exéecute il me donne le libellé, je pense qu'il devait donner le count ?
Maintenant, ai-je bien employé le "$count = $sth->rowCount();" ?
@+ RJL2831
Mais, pour autant avec 3 enregistrements supprimés, ça n'a pas fonctionné :
try { // On envoie la requète $sth->execute($param); $count = $sth->rowCount(); echo $count,utf8_decode(" enregistrements effacés"); }avec pour résultat : enregistrements effacés !!
Dans la mesure où, même après l'exéecute il me donne le libellé, je pense qu'il devait donner le count ?
Maintenant, ai-je bien employé le "$count = $sth->rowCount();" ?
@+ RJL2831
Utilisateur anonyme
31 août 2012 à 16:44
31 août 2012 à 16:44
Si, là, pas possible que ça ne marche pas. Vérifie les trucs les plus énormes (tu as bien enregistré la modification du code ?)
ajoute un var_dump($count); après la ligne echo pour voir ce qu'il pense de $count.
Dans tes options de connexion PDO, as-tu PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION pour qu'il ne te passe pas des erreurs sous silence ?
ajoute un var_dump($count); après la ligne echo pour voir ce qu'il pense de $count.
Dans tes options de connexion PDO, as-tu PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION pour qu'il ne te passe pas des erreurs sous silence ?
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
31 août 2012 à 18:57
31 août 2012 à 18:57
Cette fois, c'est un paquet d'excuses que je dois ajouter aux remerciements !
Voici le résultat concaténant (sans espace) le message résultat et le var_dump de $count : 2 enregistrements effacésint(2)
J'avais dû rater le link même si usuellement, dans le doute, je le fais une seconde fois !
A noter que j'ai ajouté le ERRMODE_EXCEPTION que j'ai mis juste devant le $query.
Tout roule comme je le souhaitais pour ce script (sauf à tomber sur un imprévu... histoire de tester le ERRMODE_EXCEPTION) ; je vais donc poursuivre mon apprentissage cette fois avec des UPDATE (que je vais essayer de faire à l'économie donc sans doubler le WHERE !!!)
Bonne soirée et encore bravo et merci. RJL2831
Voici le résultat concaténant (sans espace) le message résultat et le var_dump de $count : 2 enregistrements effacésint(2)
J'avais dû rater le link même si usuellement, dans le doute, je le fais une seconde fois !
A noter que j'ai ajouté le ERRMODE_EXCEPTION que j'ai mis juste devant le $query.
Tout roule comme je le souhaitais pour ce script (sauf à tomber sur un imprévu... histoire de tester le ERRMODE_EXCEPTION) ; je vais donc poursuivre mon apprentissage cette fois avec des UPDATE (que je vais essayer de faire à l'économie donc sans doubler le WHERE !!!)
Bonne soirée et encore bravo et merci. RJL2831