Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

$variable++ qui ne marche pas?

19 réponses
Avatar
jp
Bonjour, en php4 $a++ fonctionnait et avec php7 je suis obligé de faire
$a = $a + 1. Quelqu'un sait pourquoi?

C'est juste une question sans importance. Juste pour comprendre...

9 réponses

1 2
Avatar
jp
Le Tue, 10 Dec 2019 14:58:06 +0100, Didier a écrit :
Bjr,
Je sais qu'on ne peut pas gagner à tous les coups, mais regarde
peut-être là :
https://www.php.net/manual/fr/internals2.counter.counter-class.php
Didier.

Ok, vu. Mais c'est un peu lourd vu ce que je veux faire qui reste quand-
même assez simple. Je note que la classe Counter commence avec un C
majuscule. J'ai eu quand-même un petit coup de bol sur ce coup-là. Ma
variable $counter commence avec un c minuscule...;)
Avatar
Otomatic
jp écrivait :
$counter = fgets($fp, 20);
fclose($fp);
if ( ($ip != 'MonIP') && ($ip != '127.0.0.1') ) {
$counter = $counter + 1;//C'est ici que $counter++ ne fonctionne pas...

Peut-être qu'avant d'incriminer la post-incrémentation, il faudrait être
certain que ce que contient $counter après :
$counter = fgets($fp, 20);

est bien une valeur numérique.
Parce que fgets() retourne une chaîne de caractères et non pas une
valeur numérique, laquelle peut contenir le caractère de fin de ligne si
la ligne fait moins de 19 octets et même contenir EOF si le fichier
lui-même contient moins de 19 octets.
Comme d'habitude, RTFM :
https://www.php.net/manual/fr/function.fgets.php
$counter = $counter + 1;
semble fonctionner puisque le transtypage est automatiquement appliqué
ce qui fait que si $counter n'était pas numérique, il peut le devenir de
par l'opération effectuée.
En revanche, la prè ou post incrémentation sur une chaîne de caractères
ne suit pas les mêmes règles :
Là aussi, comme d'hab, RTFM :
https://www.php.net/manual/fr/language.operators.increment.php
--
Un ordinateur résout des problèmes que nous n'aurions pas sans lui
Technique aéronautique : http://aviatechno.net
Avatar
Otomatic
Olivier Miakinen <om+ écrivait :
[OUI++]

Le problème est bien là.
$counter = 'OUI';
$counter++;
echo $counter;
Ça donne : OUJ
Avatar
Denis Beauregard
Le 10 Dec 2019 11:14:38 GMT, jp écrivait dans
fr.comp.lang.php:
$counter = 0;

Il est aussi possible que counter soit un mot réservé.
Pour éviter ce genre de problème, j'ai pris l'habitude de
donner un nom en français à mes variables. On peut aussi
utiliser une nomenclature comme iCounter ou nCounter.
Denis
Avatar
Otomatic
jp écrivait :
$counter = $counter + 1;//C'est ici que $counter++ ne fonctionne pas...

Avertissement :
Notice: A non well formed numeric value encountered in
E:wampwwwcounter.php on line 19
Si le fichier contient un caractère de fin de ligne :
00000000h: 32 31 38 0A ; 218.
Donc, c'est bien ce que je subodorais dans mon message précédent :
$counter n'est pas numérique mais une chaîne de caractères.
On peut forcer le type en numérique entier par :
$counter = (int)fgets($fp, 20);
et là, $counter++; ne pose plus de problème.
Avatar
Olivier Miakinen
Le 10/12/2019 à 17:59, Otomatic a écrit :
jp écrivait :
$counter = $counter + 1;//C'est ici que $counter++ ne fonctionne pas...

Avertissement :
Notice: A non well formed numeric value encountered in
E:wampwwwcounter.php on line 19
Si le fichier contient un caractère de fin de ligne :
00000000h: 32 31 38 0A ; 218.
Donc, c'est bien ce que je subodorais dans mon message précédent :
$counter n'est pas numérique mais une chaîne de caractères.
On peut forcer le type en numérique entier par :
$counter = (int)fgets($fp, 20);
et là, $counter++; ne pose plus de problème.

Voilà qui me semble une excellente analyse du problème.
Et aussi un bon avertissement pour jp : n'oublie jamais qu'une
variable provenant d'une source extérieure au programme, fût-ce
un fichier en local, doit toujours être « nettoyée » avant
d'être utilisée. Par « nettoyée », je veux dire que tu dois
toujours t'assurer que cette variable est bien telle que tu
l'attends : bon type de donnée (ici il fallait un entier et
pas une chaîne de caractères) mais aussi valeurs cohérentes
(par exemple valeurs min et max, ce qui t'évitera par exemple
de partir avec un compteur négatif).
--
Olivier Miakinen
Avatar
Eric Demeester
Bonjour,
Olivier Miakinen (Tue, 10 Dec 2019 19:53:34 +0100 - fr.comp.lang.php) :
Le 10/12/2019 à 17:59, Otomatic a écrit :
$counter n'est pas numérique mais une chaîne de caractères.
On peut forcer le type en numérique entier par :
$counter = (int)fgets($fp, 20);
et là, $counter++; ne pose plus de problème.

Voilà qui me semble une excellente analyse du problème.

Pas mieux.
En plus de tes précieux conseils, quand quelque chose ne fonctionne pas,
j'ai l'habitude d'afficher les valeurs des variables à l'écran (echo ou
var_dump selon les cas) et leur évolution, ça permet souvent de
constater qu'on n'obtient pas le résultat attendu, et peut donner des
pistes pour comprendre pourquoi.
Avatar
Otomatic
Eric Demeester écrivait :
En plus de tes précieux conseils, quand quelque chose ne fonctionne pas,
j'ai l'habitude d'afficher les valeurs des variables à l'écran (echo ou
var_dump selon les cas)

Moi, c'est plutôt error_log() par exemple
error_log("counter=".$counter);
Et systématiquement en développement local :
- display_errors = on
- display_startup_errors = on
- error_reporting = E_ALL
--
Plastifions le tissu social pour mettre en réseau les synergies
intergénérationelles sur un plan proactif, induisant une sensibilisation
citoyenne et interactive, garantie d'un véritable dialogue pluriel !
Ministère des Partenariats Durables - Objectifs 2015-2035
Avatar
jp
Le Tue, 10 Dec 2019 16:17:39 +0100, Otomatic a écrit :
Ok. Merci à vous tous. Au moins, grâce à vous, j'ai compris d'où venait
l'erreur et je m'endormirai moins bête. Je vais corriger mon script.
Merci et a+.
jp
1 2