UPDATE Nb Param invalide en requête
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 31/08/2012 à 22:35
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 - 2 sept. 2012 à 11:44
rjl Messages postés 543 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 25 mai 2019 - 2 sept. 2012 à 11:44
A voir également:
- UPDATE Nb Param invalide en requête
- Windows update 0x80070643 - Accueil - Windows
- Atlas pro url serveur invalide - Forum TV & Vidéo
- Windows update bloqué - Guide
- Nb si couleur ne fonctionne pas ✓ - Forum Excel
- Session invalide ou obsolète - Forum Consommation & Internet
6 réponses
Utilisateur anonyme
31 août 2012 à 22:56
31 août 2012 à 22:56
Toujours distrait ?
tu appelles un paramètre :difPR
mais dans ton tableau, tu donnes difCR comme clé...
Alors, difPR ou difCR ?
tu appelles un paramètre :difPR
mais dans ton tableau, tu donnes difCR comme clé...
Alors, difPR ou difCR ?
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 31/08/2012 à 23:53
Modifié par rjl le 31/08/2012 à 23:53
Ca s'est arrangé au plan du nombre de paramètres (sauf si je tentes de ne pas traiter en paramètre admail que je n'exploite en réalité qu'en WHERE sans avoir à le modifier) !
Pour le reste, j'ai tenté des ' et des " pour distinguer les champs, j'avais aussi tenté sans ' pour les nombres mais ça n'allait pas car c'difCR et difProg sont en Char sur 1 caractère (défini avec * ou " " à l'origine) !
Quelles que soient mes tentatives, ça échoue : J'ai bien remarqué que pour difCR le chiffre de comparaison ou affectation est en rouge amis en noir pour le second paramètre difProgen comparaison et affectation mais sans comprendre le pourquoi et l'origine (même définition en structure de table, !
Erreur de requète : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND (difCR == '1' OR difProg =='1'))' at line 2
code :
Merci d'avance pour ton eil expert! RJL2831
Pour le reste, j'ai tenté des ' et des " pour distinguer les champs, j'avais aussi tenté sans ' pour les nombres mais ça n'allait pas car c'difCR et difProg sont en Char sur 1 caractère (défini avec * ou " " à l'origine) !
Quelles que soient mes tentatives, ça échoue : J'ai bien remarqué que pour difCR le chiffre de comparaison ou affectation est en rouge amis en noir pour le second paramètre difProgen comparaison et affectation mais sans comprendre le pourquoi et l'origine (même définition en structure de table, !
Erreur de requète : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND (difCR == '1' OR difProg =='1'))' at line 2
code :
$req = $connexion->prepare("UPDATE adh SET difCR = :difCR, difProg= :difProg WHERE (admail <= $admail AND (difCR == "1" OR difProg == "1"))"); try { $req->execute(array('difCR' => "0", 'difProg' => "0" ));
Merci d'avance pour ton eil expert! RJL2831
Utilisateur anonyme
1 sept. 2012 à 08:32
1 sept. 2012 à 08:32
La programmation avec le PHP est objet (enfin, un peu) mais cela ne l'empêche pas d'être séquentielle. Les deux ne sont pas incompatibles. Ce qui serait incompatible avec séquentiel serait, par exemple, événementiel.
Trois remarques
1 - j'aurais dû le voir avant. La comparaison (dans les WHERE en particulier) en SQL c'est =, pas ==. J'espère que tu ne confonds pas avec la comparaison du php.
Une requête SQL est une chaîne qui suit les règles de syntaxe de SQL. Elle est "fabriquée" par php à partir de ton code et en remplaçant éventuellement les paramètres par leurs valeurs. Elle est analysée par le moteur de base de données. Mais le php en lui même n'en a rien à faire du contenu de cette chaîne.
2 - Les paramètres passés à une requête PDO doivent avoir des noms différents. Même si tu passes deux fois la même valeur. Tu ne peux pas utiliser :difCR deux fois dans une requête.
3- Si je peux me permettre je t'INTERDIS d'essayer des ' ou des ". Partout sur ce forum on voit des gens conseiller d'utiliser l'un plutôt que l'autre : c'est totalement stupide. Il faut apprendre une fois pour toutes la signification de l'un et de l'autre (c'est simple). En suite, on n'"essaye" pas, on écrit. L'un ou l'autre comme on veut, peu importe car les deux sont toujours possibles, seulement plus ou moins 'confortables' selon la situation. À condition de respecter les règles d'écriture qui, je le répète, sont simples.
Regarde "Entourée de guillemets simples" et "Entourée de guillemets doubles"
https://www.php.net/manual/fr/language.types.string.php
Je suis absent jusqu'à 22h
Trois remarques
1 - j'aurais dû le voir avant. La comparaison (dans les WHERE en particulier) en SQL c'est =, pas ==. J'espère que tu ne confonds pas avec la comparaison du php.
Une requête SQL est une chaîne qui suit les règles de syntaxe de SQL. Elle est "fabriquée" par php à partir de ton code et en remplaçant éventuellement les paramètres par leurs valeurs. Elle est analysée par le moteur de base de données. Mais le php en lui même n'en a rien à faire du contenu de cette chaîne.
2 - Les paramètres passés à une requête PDO doivent avoir des noms différents. Même si tu passes deux fois la même valeur. Tu ne peux pas utiliser :difCR deux fois dans une requête.
3- Si je peux me permettre je t'INTERDIS d'essayer des ' ou des ". Partout sur ce forum on voit des gens conseiller d'utiliser l'un plutôt que l'autre : c'est totalement stupide. Il faut apprendre une fois pour toutes la signification de l'un et de l'autre (c'est simple). En suite, on n'"essaye" pas, on écrit. L'un ou l'autre comme on veut, peu importe car les deux sont toujours possibles, seulement plus ou moins 'confortables' selon la situation. À condition de respecter les règles d'écriture qui, je le répète, sont simples.
Regarde "Entourée de guillemets simples" et "Entourée de guillemets doubles"
https://www.php.net/manual/fr/language.types.string.php
Je suis absent jusqu'à 22h
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 1/09/2012 à 21:24
Modifié par rjl le 1/09/2012 à 21:24
Bonsoir,
Je n'ai pas du trop perdre mon temps en traînant du côté de Définir une classe ¦ Créer un objet ¦ Héritage ¦ Opérateur :: et parent ¦ Durée de vie ¦ Les fonctions magiques, etc...
Pour autant, si j'ai corrigé les points 1 & 3 évoqués, je suis resté perplexe sur le point 2 : Les paramètres passés à une requête PDO doivent avoir des noms différents. "Même si tu passes deux fois la même valeur. Tu ne peux pas utiliser :difCR deux fois dans une requête". J'ai repris le code pour imaginer ce que ça donnerait et comment MySQL peut s'y retrouver :
J'utilise difCR et difProg en sélection mais aussi en modification ; comment m'en tiere avec des noms modifiés et quel sera le lien ? Le SET ?
Merci d'une clarification bien nécessaire.
Autant pour moi, j'avais mal lu : c'est :difCR que je ne peux pas utiliser 2 fois... mais sauf à avoir mal relu mon code (mais j'ai fait une recherche... il n'est présent qu'une fois dans le script), et je sais pourvoir le remplacer !
Ca n'arrange pas mon cas car je ne vois pas où est le problème.
@bientôt RJL2901
Je n'ai pas du trop perdre mon temps en traînant du côté de Définir une classe ¦ Créer un objet ¦ Héritage ¦ Opérateur :: et parent ¦ Durée de vie ¦ Les fonctions magiques, etc...
Pour autant, si j'ai corrigé les points 1 & 3 évoqués, je suis resté perplexe sur le point 2 : Les paramètres passés à une requête PDO doivent avoir des noms différents. "Même si tu passes deux fois la même valeur. Tu ne peux pas utiliser :difCR deux fois dans une requête". J'ai repris le code pour imaginer ce que ça donnerait et comment MySQL peut s'y retrouver :
$req = $connexion->prepare('UPDATE adh SET difCR = :difCR, difProg=:difProg WHERE (admail <= $admail AND (difCR = '1' OR difProg ='1'))'); try { $req->execute(array('difCR' => '0', 'difProg' => '0' ));Tu m'as déjà expliqué que je pouvais mettre :toto (ou n'importe quoi) à la place de :difCR... OK mais si je mets par ailleurs truc à la place de difCR, on est d'accord que j'obtiens : SET truc :toto ! Comment fait-il alors le lien avec difCR : je suis largué.
J'utilise difCR et difProg en sélection mais aussi en modification ; comment m'en tiere avec des noms modifiés et quel sera le lien ? Le SET ?
Merci d'une clarification bien nécessaire.
Autant pour moi, j'avais mal lu : c'est :difCR que je ne peux pas utiliser 2 fois... mais sauf à avoir mal relu mon code (mais j'ai fait une recherche... il n'est présent qu'une fois dans le script), et je sais pourvoir le remplacer !
Ca n'arrange pas mon cas car je ne vois pas où est le problème.
@bientôt RJL2901
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 1/09/2012 à 22:17
Modifié par rjl le 1/09/2012 à 22:17
Problème que je pressens : admail utilisé dans le WHERE en comparaison avec $admail n'est pas signalé ailleurs...
En plus les '1' de difProg, qui sont en noir et non en rouge comme ceux de difCR, j'ai maintenant les parenthèses qui ne se correspondent plus du tout lorsque j'en sélectionne une qui passe alors en rouge, ce n'est pas la bonne qui lui
correspond !!!
Tu vas encore me reprocher de faire des essais mais, pas simple de rester les bras croisés et quand je ne trouve pas de réponse à mes recherche... je tente (plutôt qu"attendre.
Ainsi, je me suis interrogé pour savoir si les quote simples (') étaient indispensables pour les chiffres... et alors les parenthèses se sont retrouvées appareillées ! et la ligne 17 (celle avec le AND et le OR) n'est plus signalées erronées (sans que les 1 ne passent en rouge avec Notepad++ alors que les 0 sont en rouge ! Mais, cette fois j'ai une erreur à l'exécution : Erreur de requète : SQLSTATE[42S22]: Column not found: 1054 Unknown column '$admail' in 'where clause'
Alors bien sûr, ce sont des pistes variables où il n'est pas simple sans le code actualisé d'y voir clair ! Je livre donc le code correspondant à ce dernier test qui n'est pas nécessairement inintéressant même si je suis sur une démarceh empirique :
Comme diraient les Shadocks, 'C\'est tout pour aujourd'hui'. RJL2901
En plus les '1' de difProg, qui sont en noir et non en rouge comme ceux de difCR, j'ai maintenant les parenthèses qui ne se correspondent plus du tout lorsque j'en sélectionne une qui passe alors en rouge, ce n'est pas la bonne qui lui
correspond !!!
Tu vas encore me reprocher de faire des essais mais, pas simple de rester les bras croisés et quand je ne trouve pas de réponse à mes recherche... je tente (plutôt qu"attendre.
Ainsi, je me suis interrogé pour savoir si les quote simples (') étaient indispensables pour les chiffres... et alors les parenthèses se sont retrouvées appareillées ! et la ligne 17 (celle avec le AND et le OR) n'est plus signalées erronées (sans que les 1 ne passent en rouge avec Notepad++ alors que les 0 sont en rouge ! Mais, cette fois j'ai une erreur à l'exécution : Erreur de requète : SQLSTATE[42S22]: Column not found: 1054 Unknown column '$admail' in 'where clause'
Alors bien sûr, ce sont des pistes variables où il n'est pas simple sans le code actualisé d'y voir clair ! Je livre donc le code correspondant à ce dernier test qui n'est pas nécessairement inintéressant même si je suis sur une démarceh empirique :
$req = $connexion->prepare('UPDATE adh SET difCR = :difCR, difProg=:difProg WHERE ((admail <= $admail) AND ((difCR = 1) OR (difProg = 1)))'); try { $req->execute(array('difCR' => 0, 'difProg' => 0 ));
Comme diraient les Shadocks, 'C\'est tout pour aujourd'hui'. RJL2901
rjl
Messages postés
543
Date d'inscription
mardi 16 mars 2004
Statut
Membre
Dernière intervention
25 mai 2019
49
1 sept. 2012 à 22:27
1 sept. 2012 à 22:27
J'ai encore tenté de modifier ces 2 lignes qui correspondaient à l'erreur précédente :
$req = $connexion->prepare('UPDATE adh SET difCR = :difCR, difProg=:difProg, $admail =:caramail WHERE ((admail <= :caramail)
Mais alors le nombre de param devient faux : "Erreur de requète : SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens"
$req = $connexion->prepare('UPDATE adh SET difCR = :difCR, difProg=:difProg, $admail =:caramail WHERE ((admail <= :caramail)
Mais alors le nombre de param devient faux : "Erreur de requète : SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens"
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
1 sept. 2012 à 23:27
1 sept. 2012 à 23:27
Pour le point 2, c'était une erreur de ma part. Trop pressé avant de partir ce matin, j'avais mal lu et j'avais eu l'impression que tu utilisais deux fois le même nom de paramètre, ce qui n'était pas le cas. Donc ma remarque ne te concernait pas en fait. Par contre, elle te concerne maintenant dans ton message n° 7, tu utilises deux fois :caramail.
Dans ta requête
$req = $connexion->prepare('UPDATE adh SET difCR = :difCR, difProg=:difProg WHERE ((admail <= $admail) AND ((difCR = 1) OR (difProg = 1)))');
tu cumules plusieurs problèmes
- erreur php : mauvaise utilisation de $admail : à l'intérieur d'une chaîne entre simples quotes, $admail n'est rien d'autre que le texte de 7 caractères $-a-d-m-a-i-l et absolument pas une variable php. $admail est une variable en dehors des chaines ou dans les chaînes entre doubles quotes.
- erreur mysql si $mysql est un texte. il faut qu'il soit entre quotes sinon sql considère que c'est un nom de champ.
Mais comme tu travailles en pdo, tu as intérêt à remplacer toutes les valeurs variables de la requête par des paramètres :
D'autre part, il est inutile de me parler de tes chiffres qui passent ou rouge ou en noir ou en vert : ce sont là des particularités de ton environnement de travail, qui n'ont rien d'universel et n'évoquent rien pour moi.
Tu vas encore me reprocher de faire des essais Faire des essais n'est pas une mauvaise chose en soi... Ce que j'ai voulu dire, c'est que dans la plupart des cas, il suffit de quelques connaissances de base (et en PHP, je pense toujours à cette histoire de simples ou doubles quotes des chaînes) pour écrire quelque chose de correct du premier coup et ne plus jamais avoir besoin d'essayer.
Dans ta requête
$req = $connexion->prepare('UPDATE adh SET difCR = :difCR, difProg=:difProg WHERE ((admail <= $admail) AND ((difCR = 1) OR (difProg = 1)))');
tu cumules plusieurs problèmes
- erreur php : mauvaise utilisation de $admail : à l'intérieur d'une chaîne entre simples quotes, $admail n'est rien d'autre que le texte de 7 caractères $-a-d-m-a-i-l et absolument pas une variable php. $admail est une variable en dehors des chaines ou dans les chaînes entre doubles quotes.
- erreur mysql si $mysql est un texte. il faut qu'il soit entre quotes sinon sql considère que c'est un nom de champ.
Mais comme tu travailles en pdo, tu as intérêt à remplacer toutes les valeurs variables de la requête par des paramètres :
$req = $connexion->prepare('UPDATE adh SET difCR = :difCR, difProg=:difProg WHERE ((admail <= :admail) AND ((difCR = 1) OR (difProg = 1)))'); try { $req->execute(array('difCR' => 0, 'difProg' => 0, 'admail'=>$admail ));
D'autre part, il est inutile de me parler de tes chiffres qui passent ou rouge ou en noir ou en vert : ce sont là des particularités de ton environnement de travail, qui n'ont rien d'universel et n'évoquent rien pour moi.
Tu vas encore me reprocher de faire des essais Faire des essais n'est pas une mauvaise chose en soi... Ce que j'ai voulu dire, c'est que dans la plupart des cas, il suffit de quelques connaissances de base (et en PHP, je pense toujours à cette histoire de simples ou doubles quotes des chaînes) pour écrire quelque chose de correct du premier coup et ne plus jamais avoir besoin d'essayer.
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 2/09/2012 à 11:44
Modifié par rjl le 2/09/2012 à 11:44
Bonjour le père,
Rassures-toi, ce n'est pas parce que j'oublie de réaborder un sujet que je ne le prends pas en compte ! Concernant les ' et ", j'ai lu, puis édité la doc vers laquelle tu m'avais envoyé, avant de corriger.
Un changement total car ça exécutait.
Dans un premier temps, je suis tombé sur une Fatal error car je n'adressais pas le bon objet pour le rowCount !
Après correction, seconde inquiétude car tout s'exécutait avec un comptage à zéro !
J'ai alors corrigé la logique car ce n'était pas des 1 que j'avais mis initialement mais des * ! j'ai donc corrigé ce détail (avec les " nécessaires : il me faisait une erreur avec les simples quotes... car je ne l'avais pas échappé !).
Une fois la correction effectuée, les 0 se sont bien mis en place mais, compte tenu de mon erreur avec l'astérisque, j'ai fait le passage complémentaire pour mettre en place les 1 ce qui fait que je n'ai plus aucune * et simplement des 1 et 0.
Voila ce sujet clos et un excellent exemple pour la suite !
Encore un grand merci car j'aurai pu boucler longuement avec mes essais...
Et dire que dans le boulot il m'arrivait d'interdire aux programmeurs de lancer tel ou tel essai car lorsqu'ils ne pouvaient pas me dire ce qu'ils en tireraient suivant que les résultats seraient x ou y...
Pour autant avec des sujets qui interfèrent PHP, MySQL, PDO,... il n'est pas toujours évident de tomber sur la bonne doc traitant du cas que l'on pense toujours particulier.
Bon dimanche RJL2902
Rassures-toi, ce n'est pas parce que j'oublie de réaborder un sujet que je ne le prends pas en compte ! Concernant les ' et ", j'ai lu, puis édité la doc vers laquelle tu m'avais envoyé, avant de corriger.
Un changement total car ça exécutait.
Dans un premier temps, je suis tombé sur une Fatal error car je n'adressais pas le bon objet pour le rowCount !
Après correction, seconde inquiétude car tout s'exécutait avec un comptage à zéro !
J'ai alors corrigé la logique car ce n'était pas des 1 que j'avais mis initialement mais des * ! j'ai donc corrigé ce détail (avec les " nécessaires : il me faisait une erreur avec les simples quotes... car je ne l'avais pas échappé !).
Une fois la correction effectuée, les 0 se sont bien mis en place mais, compte tenu de mon erreur avec l'astérisque, j'ai fait le passage complémentaire pour mettre en place les 1 ce qui fait que je n'ai plus aucune * et simplement des 1 et 0.
Voila ce sujet clos et un excellent exemple pour la suite !
Encore un grand merci car j'aurai pu boucler longuement avec mes essais...
Et dire que dans le boulot il m'arrivait d'interdire aux programmeurs de lancer tel ou tel essai car lorsqu'ils ne pouvaient pas me dire ce qu'ils en tireraient suivant que les résultats seraient x ou y...
Pour autant avec des sujets qui interfèrent PHP, MySQL, PDO,... il n'est pas toujours évident de tomber sur la bonne doc traitant du cas que l'on pense toujours particulier.
Bon dimanche RJL2902
31 août 2012 à 22:59