Probl=c3=a8me PHP / Mysql sur une date et une seule

6 réponses
Avatar
Didier
Bjr,
J'ai une petite appli en php, qui gère une base MySQL avec une seule
table. J'ai une colonne date dans la table.
Depuis plusieurs années, tout roule.
Mais ... les enregistrements dont la date est 2020-01-10 sont bien
enregistrés, et tous vus depuis PHP My Admin.
Par contre mon script php me mélange un peut tout à l'affichage et ne me
montre pas tous les enregistrements.
La requète est :
select * from ecritures order by date asc limit <ici un nombre>
Si je remplace, via PHP MyAdmin, les dates 2020-01-10 par 2020-01-11,
tout rentre dans l'ordre. Et aucun problème sur aucune autre date (comme
je l'ai dit depuis plusieurs années).
Si vous aviez des pistes de recherche à me proposer, je suis preneur.
Merci.
Didier.

6 réponses

Avatar
Eric Demeester
Bonjour,
Didier (Sun, 26 Jan 2020 23:01:54 +0100 - fr.comp.lang.php) :
J'ai une petite appli en php, qui gère une base MySQL avec une seule
table. J'ai une colonne date dans la table.

Une colonne qui s'appelle 'date', une colonne dont le type est 'DATE',
les deux ?
select * from ecritures order by date asc limit <ici un nombre>
Si je remplace, via PHP MyAdmin, les dates 2020-01-10 par 2020-01-11,
tout rentre dans l'ordre. Et aucun problème sur aucune autre date (comme
je l'ai dit depuis plusieurs années).
Si vous aviez des pistes de recherche à me proposer, je suis preneur.

Je ne vois pas trop pourquoi le problème se produit uniquement avec
cette date, je le soupçonne d'être ailleurs :)
Pourrais-tu donner ici la structure précise de ta table (onglet
structure dans phpMyAdmin), ainsi que le code PHP de ta requête SQL ?
Avatar
Didier
Le 29/01/2020 à 09:03, Eric Demeester a écrit :
Bonjour,
Didier (Sun, 26 Jan 2020 23:01:54 +0100 - fr.comp.lang.php) :
J'ai une petite appli en php, qui gère une base MySQL avec une seule
table. J'ai une colonne date dans la table.

Une colonne qui s'appelle 'date', une colonne dont le type est 'DATE',
les deux ?

Oui je sais, je n'aurais pas dû, mais ça fonctionne ..
Je ne vois pas trop pourquoi le problème se produit uniquement avec
cette date, je le soupçonne d'être ailleurs :)
Pourrais-tu donner ici la structure précise de ta table (onglet
structure dans phpMyAdmin), ainsi que le code PHP de ta requête SQL ?

Voici la structure (je n'ai mis que le nom et le type, je ne sais pas
trop comment mettre tout ça en forme sur le post) :
# Nom Type
1 idPrimaire int(20)
2 date date
3 libelle varchar(256)
4 montant_cr double
5 montant_deb double
6 retire tinyint(4)
Et la requête dans mon code php :
$req_ecr="select * from ecritures order by ".$tri." ".$sens." limit
".$decalage.",".$limite;
$tri indique la colonne sur laquelle les lignes sont triées (à la
demande de l'utilisateur)
$sens indique le sens du tri
$decalage correspond à la pagination de l'affichage
$limite correspond au nombre de lignes à afficher par page
Merci.
Didier.
Avatar
Didier
Le 29/01/2020 à 09:48, Didier a écrit :
Le 29/01/2020 à 09:03, Eric Demeester a écrit :
Bonjour,
Didier (Sun, 26 Jan 2020 23:01:54 +0100 - fr.comp.lang.php) :
J'ai une petite appli en php, qui gère une base MySQL avec une seule
table. J'ai une colonne date dans la table.

Une colonne qui s'appelle 'date', une colonne dont le type est 'DATE',
les deux ?

Oui je sais, je n'aurais pas dû, mais ça fonctionne ..
Je ne vois pas trop pourquoi le problème se produit uniquement avec
cette date, je le soupçonne d'être ailleurs :)
Pourrais-tu donner ici la structure précise de ta table (onglet
structure dans phpMyAdmin), ainsi que le code PHP de ta requête SQL ?

Voici la structure (je n'ai mis que le nom et le type, je ne sais pas
trop comment mettre tout ça en forme sur le post) :
#     Nom         Type
1     idPrimaire     int(20)
2     date         date
3     libelle     varchar(256)
4     montant_cr     double
5     montant_deb     double
6     retire     tinyint(4)
Et la requête dans mon code php :
$req_ecr="select * from ecritures order by ".$tri." ".$sens." limit
".$decalage.",".$limite;
$tri indique la colonne sur laquelle les lignes sont triées (à la
demande de l'utilisateur)
$sens indique le sens du tri
$decalage correspond à la pagination de l'affichage
$limite correspond au nombre de lignes à afficher par page
Merci.
Didier.

En complément, ça vient de se reproduire avec la date du 2020-01-20.
Didier.
Avatar
Olivier Miakinen
Le 26/01/2020 23:01, Didier a écrit :
Bjr,

Oui, bjr aussi Ddr.
J'ai une petite appli en php, qui gère une base MySQL avec une seule
table. J'ai une colonne date dans la table.
Depuis plusieurs années, tout roule.
Mais ... les enregistrements dont la date est 2020-01-10 sont bien
enregistrés, et tous vus depuis PHP My Admin.

Si c'était un problème de base de données, je t'aurais suggéré de poser
la question sur fr.comp.applications.sgbd. Mais puisque tout va bien
depuis PHP My Admin le problème doit être ailleurs.
Par contre mon script php me mélange un peut tout à l'affichage et ne me
montre pas tous les enregistrements.
La requète est :
select * from ecritures order by date asc limit <ici un nombre>
Si je remplace, via PHP MyAdmin, les dates 2020-01-10 par 2020-01-11,
tout rentre dans l'ordre. Et aucun problème sur aucune autre date (comme
je l'ai dit depuis plusieurs années).

Comme te l'a répondu Éric, il n'y a aucune raison pour que le problème se
produise sur une date donnée et pas les autres. D'ailleurs tu l'as toi-même
reproduit avec une autre date.
Du coup, il doit y avoir un souci dans ton code PHP.
Si vous aviez des pistes de recherche à me proposer, je suis preneur.

En voici une. Vu que PHP est faiblement typé, il arrive que des conversions
automatiques de nombres en chaînes de caractères, ou l'inverse, soient à
l'origine de bugs bizarres. Du coup, recherche dans ton code tous les
endroits où tu traites de nombres (sous forme de chaînes ou autres).
En particulier, regarde les endroits où tu manipules la date avant de
l'afficher.
--
Olivier Miakinen
Avatar
Eric Demeester
Bonjour,
Didier (Wed, 29 Jan 2020 09:48:43 +0100 - fr.comp.lang.php) :
# Nom Type
1 idPrimaire int(20)
2 date date

Déjà, je te suggère de remplacer le nom 'date' de la colonne 2, par
exemple par 'la_date', parce que même si tu dis que ça fonctionne, et je
te crois, utiliser un mot réservé comme nom de variable finit un jour ou
l'autre par avoir des effets de bord imprévisibles, dont, qui sait, le
problème rencontré.
$req_ecr="select * from ecritures order by ".$tri." ".$sens." limit ".$decalage.",".$limite;

C'est peut-être une erreur de copié/collé, mais je pense qu'il manque un
« " » pour terminer ta chaîne.
Par ailleurs, quand ta chaîne est entourée par des « " », tu peux y
inclure directemenr des variables sans avoir besoin de les concaténer.
$req_ecr = "SELECT * FROM ecritures ORDER BY $tri $sens...";
$tri indique la colonne sur laquelle les lignes sont triées (à la
demande de l'utilisateur)

Ok.
$sens indique le sens du tri

Donc 'ASC' ou 'DESC', j'imagine.
Essaye (normalement les passages à la ligne ne posent pas de problème et
ça permet de clarifier ce qu'on écrit) :
$req_ecr = "SELECT * FROM ecritures
ORDER BY $tri $sens
LIMIT $decalage, $limite";
Si le problème persiste, suis les conseils d'Olivier et méfie-toi des
conversions sauvages de variables non typées.
Avatar
Didier
Le 29/01/2020 à 11:24, Olivier Miakinen a écrit :
Le 26/01/2020 23:01, Didier a écrit :
Bjr,

Oui, bjr aussi Ddr.
J'ai une petite appli en php, qui gère une base MySQL avec une seule
table. J'ai une colonne date dans la table.
Depuis plusieurs années, tout roule.
Mais ... les enregistrements dont la date est 2020-01-10 sont bien
enregistrés, et tous vus depuis PHP My Admin.

Si c'était un problème de base de données, je t'aurais suggéré de poser
la question sur fr.comp.applications.sgbd. Mais puisque tout va bien
depuis PHP My Admin le problème doit être ailleurs.
Par contre mon script php me mélange un peut tout à l'affichage et ne me
montre pas tous les enregistrements.
La requète est :
select * from ecritures order by date asc limit <ici un nombre>
Si je remplace, via PHP MyAdmin, les dates 2020-01-10 par 2020-01-11,
tout rentre dans l'ordre. Et aucun problème sur aucune autre date (comme
je l'ai dit depuis plusieurs années).

Comme te l'a répondu Éric, il n'y a aucune raison pour que le problème se
produise sur une date donnée et pas les autres. D'ailleurs tu l'as toi-même
reproduit avec une autre date.
Du coup, il doit y avoir un souci dans ton code PHP.
Si vous aviez des pistes de recherche à me proposer, je suis preneur.

En voici une. Vu que PHP est faiblement typé, il arrive que des conversions
automatiques de nombres en chaînes de caractères, ou l'inverse, soient à
l'origine de bugs bizarres. Du coup, recherche dans ton code tous les
endroits où tu traites de nombres (sous forme de chaînes ou autres).
En particulier, regarde les endroits où tu manipules la date avant de
l'afficher.

Merci à vous deux de vous être penchés sur mon problème.
Je pense que les deux dates concernées le sont par pur hasard.
En effet, après avoir modifié le nom du champ 'date' par 'datevaleur',
rien de changé toujours la même erreur.
J'ai fait afficher la requête dans ma page html, puis je l'ai
copiée/collée dans l'onglet sql de phpmyadmin : résultat ok.
Et j'ai essayé un truc tout bête : je limite à 20 le nombre de lignes
affichées à l'écran, avec une gestion 'page suivante' et 'page
précédente', qui nécessite un petit calcul de pagination.
Ayant 58 lignes à afficher, j'ai fixé la limite par écran à 70, et tout
est ok. J'ai donc juste un pb de calcul de la pagination, du moins on
dirait.
Comme aurit Boris Vian, "j'y retourne immédiatement" ;-)
Encore merci.
Didier.