Discussion:
$variable++ qui ne marche pas?
(trop ancien pour répondre)
jp
2019-12-10 02:33:23 UTC
Permalink
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...
Eric Demeester
2019-12-10 08:45:51 UTC
Permalink
Bonjour,
Post by jp
Bonjour, en php4 $a++ fonctionnait et avec php7 je suis obligé de faire
$a = $a + 1. Quelqu'un sait pourquoi?
À en croire le manuel :
https://www.php.net/manual/fr/language.operators.increment.php

et ma propre expérience, l'incrémentation $a++ fonctionne avec toutes
les versions de php.
Post by jp
C'est juste une question sans importance. Juste pour comprendre...
Le problème doit être ailleurs...
jp
2019-12-10 09:49:53 UTC
Permalink
Post by Eric Demeester
Le problème doit être ailleurs...
Ok. Merci à tous les deux. Du coup, je ne comprend plus d'où peut venir
le problème, n'étant pas un spécialiste. C'est bizarre quand-même...
Otomatic
2019-12-10 10:24:25 UTC
Permalink
Post by jp
Ok. Merci à tous les deux. Du coup, je ne comprend plus d'où peut venir
le problème, n'étant pas un spécialiste. C'est bizarre quand-même...
Peut-être qu'en donnant la quinzaine de lignes qui entourent la
post-incrémentation $a++ et en expliquant pourquoi vous pensez que ça ne
fonctionne pas, nous pourrions voir d'où vient ce problème.
Olivier Miakinen
2019-12-10 10:31:48 UTC
Permalink
Post by Otomatic
Peut-être qu'en donnant la quinzaine de lignes qui entourent la
post-incrémentation $a++ et en expliquant pourquoi vous pensez que ça ne
fonctionne pas, nous pourrions voir d'où vient ce problème.
[OUI++]
--
Olivier Miakinen
jp
2019-12-10 11:15:08 UTC
Permalink
Post by Olivier Miakinen
Post by Otomatic
Peut-être qu'en donnant la quinzaine de lignes qui entourent la
post-incrémentation $a++ et en expliquant pourquoi vous pensez que ça
ne fonctionne pas, nous pourrions voir d'où vient ce problème.
[OUI++]
:)
Otomatic
2019-12-10 16:20:24 UTC
Permalink
Post by Olivier Miakinen
[OUI++]
Le problème est bien là.

$counter = 'OUI';
$counter++;
echo $counter;

Ça donne : OUJ
jp
2019-12-10 11:16:26 UTC
Permalink
Post by Otomatic
Post by jp
Ok. Merci à tous les deux. Du coup, je ne comprend plus d'où peut venir
le problème, n'étant pas un spécialiste. C'est bizarre quand-même...
Peut-être qu'en donnant la quinzaine de lignes qui entourent la
post-incrémentation $a++ et en expliquant pourquoi vous pensez que ça ne
fonctionne pas, nous pourrions voir d'où vient ce problème.
Merci pour la réponse. J'ai posté le script un peu plus bas dans ce fil.
Otomatic
2019-12-10 09:07:54 UTC
Permalink
Post by jp
Bonjour, en php4 $a++ fonctionnait et avec php7 je suis obligé de faire
$a = $a + 1. Quelqu'un sait pourquoi?
Les post et pré-incrémentations fontionnent toujours parfaitement, même
sous PHP 7.4.0.
Le problème est ailleurs.
Olivier Miakinen
2019-12-10 10:30:38 UTC
Permalink
Post by jp
Bonjour, en php4 $a++ fonctionnait et avec php7 je suis obligé de faire
$a = $a + 1. Quelqu'un sait pourquoi?
La variable s'appelle $a ou $variable ou encore autre chose ? Ce n'est
pas le même problème qu'avec count qui est devenu un mot-clé ?
--
Olivier Miakinen
jp
2019-12-10 11:14:38 UTC
Permalink
Post by Olivier Miakinen
Post by jp
Bonjour, en php4 $a++ fonctionnait et avec php7 je suis obligé de faire
$a = $a + 1. Quelqu'un sait pourquoi?
La variable s'appelle $a ou $variable ou encore autre chose ? Ce n'est
pas le même problème qu'avec count qui est devenu un mot-clé ?
Pour la fonction que je nommais count(), j'ai compris comment je me suis
trompé. J'avais un script assez ancien qui utilisait une fonction vues().
En voulant reprendre ce script pour autre chose assez similaire, je l'ai
renommée count(). Je ne savais pas que c'était un mot réservé. Du coup ça
ne marchait plus et je ne comprenais pas pourquoi...

Dans le cas présent, c'est toujours le même script et la variable
s'appelle $counter. La post-incrémentation ne fonctionne pas. J'ai mis un
moment avant de savoir d'où venait l'erreur mais j'ai résolu le problème
en faisant $counter = $counter + 1;

Voici le petit script:

<?php
$counter = 0;
$ip = getenv("REMOTE_ADDR");

function counting($counter) {
$fp = fopen('download_counter.txt', 'w');
if ($fp) {
fwrite($fp, $counter);
fclose($fp);
}
}

$fp = fopen('download_counter.txt', 'r');
if ($fp) {
$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...
counting($counter);
}
/*Affiche le compteur seulement quand c'est le webmaster qui se connecte.
=> décommenter la ligne A et mettre en commentaire la ligne B*/
else { echo $counter . ' téléchargements au moins.'; }//Ligne A

/*Affiche le compteur tout le temps => mettre en commentaire la ligne A
et décommenter la ligne B pour que tout le monde voit le compteur.*/
//echo $counter . ' téléchargements environ.';//Ligne B
}
else {
$counter++;
counting($counter);
echo $counter;
}
?>

Merci à tous pour vos réponses.
Didier
2019-12-10 13:58:06 UTC
Permalink
Post by jp
Post by Olivier Miakinen
Post by jp
Bonjour, en php4 $a++ fonctionnait et avec php7 je suis obligé de faire
$a = $a + 1. Quelqu'un sait pourquoi?
La variable s'appelle $a ou $variable ou encore autre chose ? Ce n'est
pas le même problème qu'avec count qui est devenu un mot-clé ?
Pour la fonction que je nommais count(), j'ai compris comment je me suis
trompé. J'avais un script assez ancien qui utilisait une fonction vues().
En voulant reprendre ce script pour autre chose assez similaire, je l'ai
renommée count(). Je ne savais pas que c'était un mot réservé. Du coup ça
ne marchait plus et je ne comprenais pas pourquoi...
Dans le cas présent, c'est toujours le même script et la variable
s'appelle $counter. La post-incrémentation ne fonctionne pas. J'ai mis un
moment avant de savoir d'où venait l'erreur mais j'ai résolu le problème
en faisant $counter = $counter + 1;
<?php
$counter = 0;
$ip = getenv("REMOTE_ADDR");
function counting($counter) {
$fp = fopen('download_counter.txt', 'w');
if ($fp) {
fwrite($fp, $counter);
fclose($fp);
}
}
$fp = fopen('download_counter.txt', 'r');
if ($fp) {
$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...
counting($counter);
}
/*Affiche le compteur seulement quand c'est le webmaster qui se connecte.
=> décommenter la ligne A et mettre en commentaire la ligne B*/
else { echo $counter . ' téléchargements au moins.'; }//Ligne A
/*Affiche le compteur tout le temps => mettre en commentaire la ligne A
et décommenter la ligne B pour que tout le monde voit le compteur.*/
//echo $counter . ' téléchargements environ.';//Ligne B
}
else {
$counter++;
counting($counter);
echo $counter;
}
?>
Merci à tous pour vos réponses.
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.
jp
2019-12-10 14:23:04 UTC
Permalink
Post by Didier
Bjr,
Je sais qu'on ne peut pas gagner à tous les coups, mais regarde
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...;)
Otomatic
2019-12-10 15:17:39 UTC
Permalink
Post by jp
$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
Post by jp
$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
jp
2019-12-12 14:24:56 UTC
Permalink
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

Denis Beauregard
2019-12-10 16:32:59 UTC
Permalink
Post by jp
$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
Otomatic
2019-12-10 16:59:13 UTC
Permalink
Post by jp
$counter = $counter + 1;//C'est ici que $counter++ ne fonctionne pas...
Avertissement :
Notice: A non well formed numeric value encountered in
E:\wamp\www\counter.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.
Olivier Miakinen
2019-12-10 18:53:34 UTC
Permalink
Post by Otomatic
Post by jp
$counter = $counter + 1;//C'est ici que $counter++ ne fonctionne pas...
Notice: A non well formed numeric value encountered in
E:\wamp\www\counter.php on line 19
00000000h: 32 31 38 0A ; 218.
$counter n'est pas numérique mais une chaîne de caractères.
$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
Eric Demeester
2019-12-11 08:40:44 UTC
Permalink
Bonjour,
Post by Olivier Miakinen
Post by Otomatic
$counter n'est pas numérique mais une chaîne de caractères.
$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.
Otomatic
2019-12-11 09:17:53 UTC
Permalink
Post by Eric Demeester
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
Continuer la lecture sur narkive:
Loading...