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

Raisonnement errone sur while et format date ?

11 réponses
Avatar
Dominique Ottello
Bonjour,

Soit une extraction de date depuis une table MySQL par :

SELECT DATE_FORMAT(h_date_deb,'%d-%m-%Y') AS da1

Nota : la colonne h_date_deb est bien déclaré comme champ date

Certains champs ne comprennent pas le quantième et sont retournés avec
des valeurs comme "00-12-1947" d'autres ne comprennent que l'année, par
exemple "00-00-1947" et d'autres sont "vides" donc avec la valeur
retournée "00-00-0000".

Pour ne garder que les valeurs significatives, j'ai le code php :

while(substr($da1,0,2) == "00") $da1 = substr($da1,3);

Je m'attendais à ce que le résultat final d'une chaîne "00-00-0000" soit
"0", or j'obtiens une chaîne vide.

En mettant un affichage de $da1 dans la boucle :

while(substr($da1,0,2) == "00") {
$da1 = substr($da1,3);
echo "<p>da1=\"".$da1."\"</p>\n";
}

j'obtiens :

da1="00-0000"
da1="0000"
da1="0"
da1=""

Où est mon erreur de raisonnement, puisque l'avant-dernière valeur est
"0" qui n'est pas égal à "00".
--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Technologie aéronautique - http://ottello.net - Les anciens de Vilgénis

10 réponses

1 2
Avatar
Olivier Miakinen
Le 20/06/2008 22:42, Dominique Ottello a écrit :

while(substr($da1,0,2) == "00") {
$da1 = substr($da1,3);
echo "<p>da1="".$da1.""</p>n";
}

j'obtiens :

da1="00-0000"
da1="0000"
da1="0"
da1=""

Où est mon erreur de raisonnement, puisque l'avant-dernière valeur est
"0" qui n'est pas égal à "00".



Ah mais si, "0" est égal à "00" ! Tout autant que "1" est égal à "01" et
que 0 est égal à "a"...

Cf. <http://fr2.php.net/manual/fr/language.operators.comparison.php>
<cit.>
Si vous comparez un entier avec une chaîne, la chaîne est convertie en
un nombre. Si vous comparez deux chaînes numériques, elles seront
comparées en tant qu'entiers.
</cit.>

Tu peux essayer avec === à la place de ==, ça devrait fonctionner :

while(substr($da1,0,2) === "00") {
$da1 = substr($da1,3);
echo "<p>da1="".$da1.""</p>n";
}
Avatar
Olivier Miakinen
Le 20/06/2008 22:42, Dominique Ottello a écrit :

Certains champs ne comprennent pas le quantième et sont retournés avec
des valeurs comme "00-12-1947" d'autres ne comprennent que l'année, par
exemple "00-00-1947" et d'autres sont "vides" donc avec la valeur
retournée "00-00-0000".

Pour ne garder que les valeurs significatives, j'ai le code php :

while(substr($da1,0,2) == "00") $da1 = substr($da1,3);



Outre ma réponse précédente, tu devrais pouvoir faire la même chose en
remplaçant la boucle par une unique expression régulière :

$da1 = preg_replace('/b00[-0]/', '', $da1);

Le b dans l'expression sert à empêcher le remplacement de "03-07-2000"
par "03-07-2". À part cela, la seule différence avec ta boucle serait
pour des valeurs que tu ne devrais pas rencontrer, avec un quantième
différent de 00 et un mois égal à 00 ou une année commençant par 000,
ou un mois différent de 00 et une année commençant par 000.

Exemples :

"03-00-2008"
(while) -> "03-00-2008"
(preg) -> "03-2008"

"03-07-0008"
(while) -> "03-07-0008"
(preg) -> "03-07-8"

"00-07-0008"
(while) -> "07-0008"
(preg) -> "07-8"

"00-07-0000"
(while) -> "07-0000"
(preg) -> "07-0"

"03-00-0000"
(while) -> "03-00-0000"
(preg) -> "03-0"
Avatar
Dominique Ottello
Olivier Miakinen <om+ écrivait :

Outre ma réponse précédente, tu devrais pouvoir faire la même chose en
remplaçant la boucle par une unique expression régulière :



Merci. J'aurais appris quelque chose ; c'est donc une bonne journée.
--
Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Technologie aéronautique : http://aviatechno.free.fr (http://ottello.net)
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr
Avatar
Mickael Wolff
Olivier Miakinen a écrit :

Ah mais si, "0" est égal à "00" ! Tout autant que "1" est égal à "01" et
que 0 est égal à "a"...



Alors attention. 08 == "08" est faux ! Encore une aberration du
transtypage des chaînes dans PHP...

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Olivier Miakinen
Le 21/06/2008 09:25, Mickael Wolff a écrit :

Ah mais si, "0" est égal à "00" ! Tout autant que "1" est égal à "01" et
que 0 est égal à "a"...



Alors attention. 08 == "08" est faux !



En effet.

Encore une aberration du transtypage des chaînes dans PHP...



Une aberration oui, mais ça n'a rien à voir avec le transtypage des
chaînes. C'est juste que 08 == 0 à cause de la façon dont sont
interprétés les nombres en octal... c'est 010 qui est égal à "08" !
Avatar
Mickael Wolff
Olivier Miakinen a écrit :
Une aberration oui, mais ça n'a rien à voir avec le transtypage des
chaînes. C'est juste que 08 == 0 à cause de la façon dont sont
interprétés les nombres en octal... c'est 010 qui est égal à "08" !



Oui, parce que "08" est transtypé en 8, ce qui est aberrant. Il
faudrait qu'il soit logiquement transtypé en 08. Ça ce serait logique.
C'est une des raisons pour lesquelles je « transtype » tout à la main
dans mes script. Sinon, le comportement n'est pas celui auquel je m'attends.

Mais bon, c'est du pinaillage ;)

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Olivier Miakinen
Le 22/06/2008 12:53, Mickael Wolff a écrit :

Une aberration oui, mais ça n'a rien à voir avec le transtypage des
chaînes. C'est juste que 08 == 0 à cause de la façon dont sont
interprétés les nombres en octal... c'est 010 qui est égal à "08" !



Oui, parce que "08" est transtypé en 8, ce qui est aberrant. Il
faudrait qu'il soit logiquement transtypé en 08.



... et donc que sa valeur soit 0 ??? Tu imagines le souk que ça mettrait
dans les lectures de dates et d'heure ?
22/06/2008 -> 22, 6, 2008
22/07/2008 -> 22, 7, 2008
22/08/2008 -> 22, 0, 2008
22/09/2008 -> 22, 0, 2008
22/10/2008 -> 22, 10, 2008
22/11/2008 -> 22, 11, 2008

Ça ce serait logique.



Ben non. Que l'on conserve la notation octale pour les constantes
numériques, je veux bien : les programmeurs qui ne connaissent pas cette
notation ont quand même peu de chances de tomber dessus par erreur en
préfixant par 0 leurs constantes décimales. Mais pour la conversion de
chaînes de caractères en nombres, ce serait une GROSSE ERREUR à mon avis.

C'est une des raisons pour lesquelles je « transtype » tout à la main
dans mes script. Sinon, le comportement n'est pas celui auquel je m'attends.



Et tu transtypes à la main "08" en 0 ???

Mais bon, c'est du pinaillage ;)



Ben... à ce niveau, je ne trouve pas que ce soit du pinaillage !
Avatar
Mickael Wolff
Olivier Miakinen a écrit :
Oui, parce que "08" est transtypé en 8, ce qui est aberrant. Il
faudrait qu'il soit logiquement transtypé en 08.



... et donc que sa valeur soit 0 ???



Relis :-D

Ben non. Que l'on conserve la notation octale pour les constantes
numériques, je veux bien : les programmeurs qui ne connaissent pas cette
notation ont quand même peu de chances de tomber dessus par erreur en
préfixant par 0 leurs constantes décimales.



Tu connais des programmeurs qui ne connaissent pas la notation octale ?

Et tu transtypes à la main "08" en 0 ???



Relis :-D

Ben... à ce niveau, je ne trouve pas que ce soit du pinaillage !



Sur certains forums, c'est ce qu'on me sort tout le temps. Que je
pinaille sans arrêt, et que ça sert à rien.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Olivier Miakinen
Le 22/06/2008 14:44, Mickael Wolff a écrit :

Oui, parce que "08" est transtypé en 8, ce qui est aberrant. Il
faudrait qu'il soit logiquement transtypé en 08.



... et donc que sa valeur soit 0 ???



Relis :-D



Relisons.

Tu as écrit « Oui, parce que "08" est transtypé en 8, ce qui est
aberrant. Il faudrait qu'il soit logiquement transtypé en 08. »

Or le nombre 08 n'existe pas en PHP : le 0 initial indique que ce
nombre est écrit en octal, et le premier chiffre supérieur à 7 est
ignoré ainsi que tout ce qui suit.

Voilà. Maintenant que j'ai relu, quelle valeur voudrais-tu attribuer à
la chaîne "08" quand elle est transtypée en entier ?

Ben non. Que l'on conserve la notation octale pour les constantes
numériques, je veux bien : les programmeurs qui ne connaissent pas cette
notation ont quand même peu de chances de tomber dessus par erreur en
préfixant par 0 leurs constantes décimales.



Tu connais des programmeurs qui ne connaissent pas la notation octale ?



Oui. En tout cas qui ne la connaissaient pas avant que je leur en parle
(sinon je n'aurais pas su s'ils la connaissaient avant que j'en parle,
mais bien sûr après ils ne l'ignoraient plus).

Quant à moi, en dehors des droits d'accès aux fichiers Unix (04755 par
exemple) je n'ai jamais utilisé cette notation.

Et tu transtypes à la main "08" en 0 ???



Relis :-D



J'ai relu. Mais je préfèrerais une réponse claire, car je ne suis pas
sûr de comprendre tes sous-entendus. Tu transtypes la chaîne "08" en
l'entier 8, l'entier 0, ou autre chose ?

Ben... à ce niveau, je ne trouve pas que ce soit du pinaillage !



Sur certains forums, c'est ce qu'on me sort tout le temps. Que je
pinaille sans arrêt, et que ça sert à rien.



Il faut dire que si tu réponds « relis » quand on te pose une question
précise, le pinaillage risque de durer longtemps.
Avatar
Mickael Wolff
Olivier Miakinen a écrit :
Relisons.

Tu as écrit « Oui, parce que "08" est transtypé en 8, ce qui est
aberrant. Il faudrait qu'il soit logiquement transtypé en 08. »



Je vais aller me flageller. En espérant trouver des orties fraîches.
En effet, je n'avais pas pensé à 08 et 09. Finalement, tu as raison,
transtyper '07' en 7 est moins attrape-nigaud que '010' en 8.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
1 2