Discussion:
Raisonnement errone sur while et format date ?
(trop ancien pour répondre)
Dominique Ottello
2008-06-20 20:42:49 UTC
Permalink
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
Olivier Miakinen
2008-06-20 22:45:44 UTC
Permalink
Post by Dominique Ottello
while(substr($da1,0,2) == "00") {
$da1 = substr($da1,3);
echo "<p>da1=\"".$da1."\"</p>\n";
}
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";
}
Mickael Wolff
2008-06-21 07:25:57 UTC
Permalink
Post by Olivier Miakinen
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
Olivier Miakinen
2008-06-21 11:01:13 UTC
Permalink
Post by Mickael Wolff
Post by Olivier Miakinen
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.
Post by Mickael Wolff
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" !
Mickael Wolff
2008-06-22 10:53:45 UTC
Permalink
Post by Olivier Miakinen
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
Olivier Miakinen
2008-06-22 11:20:04 UTC
Permalink
Post by Mickael Wolff
Post by Olivier Miakinen
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
Post by Mickael Wolff
Ç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.
Post by Mickael Wolff
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 ???
Post by Mickael Wolff
Mais bon, c'est du pinaillage ;)
Ben... à ce niveau, je ne trouve pas que ce soit du pinaillage !
Mickael Wolff
2008-06-22 12:44:37 UTC
Permalink
Post by Olivier Miakinen
Post by Mickael Wolff
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
Post by Olivier Miakinen
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 ?
Post by Olivier Miakinen
Et tu transtypes à la main "08" en 0 ???
Relis :-D
Post by Olivier Miakinen
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
Olivier Miakinen
2008-06-22 13:16:49 UTC
Permalink
Post by Mickael Wolff
Post by Olivier Miakinen
Post by Mickael Wolff
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 ?
Post by Mickael Wolff
Post by Olivier Miakinen
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.
Post by Mickael Wolff
Post by Olivier Miakinen
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 ?
Post by Mickael Wolff
Post by Olivier Miakinen
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.
Mickael Wolff
2008-06-22 13:59:01 UTC
Permalink
Post by Olivier Miakinen
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
Olivier Miakinen
2008-06-22 19:27:23 UTC
Permalink
Post by Mickael Wolff
Je vais aller me flageller. En espérant trouver des orties fraîches.
Même pas cap ! ;-)
Post by Mickael Wolff
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.
Merci. Je ne suis pas sûr d'avoir compris ce que tu avais alors en tête,
mais je ne cherche plus car là ce serait vraiment du pinaillage. Je suis
juste rassuré de voir que nous sommes finalement d'accord.

Olivier Miakinen
2008-06-20 23:05:00 UTC
Permalink
Post by Dominique Ottello
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".
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"
Dominique Ottello
2008-06-21 07:25:57 UTC
Permalink
Post by Olivier Miakinen
Outre ma réponse précédente, tu devrais pouvoir faire la même chose en
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
Continuer la lecture sur narkive:
Loading...