8795 sujets

Développement web côté serveur, CMS

Bonjour, je suis face à bug mystérieux que je n'arrive pas à résoudre...

Voilà j'ai une page de Témoignages, j'entre le texte et les dates dans une BDD sql, puis fait l'affichage sur le site. Dans mon tableau de gestion, tout s'affiche normalement, mais sur la page officiel des Témoignages, les dates s'affichent avec un décalage d'un mois de retard par rapport à ce qui est entré dans la BDD! Smiley biggol

J'ai beau chercher je n'arrive pas à comprendre pourquoi ça fait ça!

Page en ligne -http://www.spypoint.com/testimonials.php
mon code:
$req = "SELECT * FROM SP_temoignages ORDER BY date DESC, id DESC";
		$infos = $DB->get_data($req);
		foreach($infos as $info){
	?>
        <article class="bdr-orange-bottom">
            <p><?php echo stripslashes(nl2br($info->text)); ?></p>
            <p><strong><?php echo stripslashes($info->nom); ?></strong>
            <?php
                if(!empty($info->note)){
                    echo '- '.stripslashes($info->note).' ';
                }

                if($lang == "FR"){
                    $date = date($info->date);
                    setlocale(LC_TIME, "fr_FR.utf8");
                    echo ' ('.ucfirst(strftime("%b %Y", $date)).')';
                }
                else{
                    echo ' ('.date("M", $info->date).' '. date("Y", $info->date).')';
                }
            ?></p>
        </article>
	<?php
		}
Bonjour dans votre BDD votre date Mois et enregistre comment ( 01 - 02 - 03.. ou Janvier, fer...)
J'utilise mktime() pour entrer les dates dans ma bdd, ça donne un truc du genre: 1430438400

Mais peu importe, puisque l'affichage des dates est correct dans mon panneau de gestion. C'est donc que le problème n'est pas là, mais ailleurs... où? c'est là le mystère...
Oui, et le décalage est encore là...

J'ai fait afficher la date d'aujourd'hui, avant, à l'intérieur et après la requête avec date("F Y"); ça afficher bien May 2015, mais dès que j'ajoute $info->date dans la fonction date il y a un décalage d'un mois...
salut,
que donne un var_dump($info->date) ? Quel est le type de date de ta colonne et comment elle est affichée dans ton panneau de gestion ?
J'ai l'impression que c'est plus un strtotime que tu dois utiliser au lieu de la variable "$date"

strftime("%b %Y", $date);

Le problème doit probablement se situer au niveau de :

$date = date($info->date);

À moins que ça ne soit autre chose.

Tu peux insérer une date plus simplement en SQL avec "now()" ou "curdate()". Il faut juste penser à spécifier le bon fuseau horaire dans ton script avec "date_default_timezone_set".
Salut,

Comment enregistres-tu le timestamp en BDD ?
Enregistres-tu uniquement le mois et l'année (sans l'heure et le jour) ?

Si c'est le cas, quand tu enregistres seulement le mois et l'année, SQL va compléter avec le jour 01 du mois et l'heure à 00:00:00.
Donc si ton fuseau horaire de lecture est différent du fuseau horaire d'enregistrement il y aura un décalage. Comme tu es à la limite d'un mois (à la seconde près...) tu peux avoir un décalage sur le mois précédent.
Ex : 2015-05-01T00:00:00+00:00 (GMT) en BDD (ou son équivalent timestamp : 1430431200) affichera 2015-04-30T18:00:00-06:00 (à NY par exemple)

Donc si tu enregistres une date en Europe et l'affiche localement plus l'ouest tu auras un décalage d'un mois en arrière.

Je suis persuadé que c'est un problème de timezone.
Et donc, tu suis le conseil de Zelalsan : configure proprement ta timezone.
Modifié par MatthieuR (21 May 2015 - 09:38)
Zelalsan a écrit :
que donne un var_dump($info->date) ? Quel est le type de date de ta colonne et comment elle est affichée dans ton panneau de gestion ?


var_dump($info->date) me renvoi 1430438400, soit le numéro qu'il y a dans ma BDD.
Affichage très simple dans mon panneau de gestion : $date = date("F Y", $info['date']); Mais si j'utilise la même formule sur la page en ligne, il y a quand même un décalage, donc le problème se situ sur la page en ligne.

Zelalsan a écrit :
J'ai l'impression que c'est plus un strtotime que tu dois utiliser au lieu de la variable "$date"

strftime("%b %Y", $date);

Le problème doit probablement se situer au niveau de :

$date = date($info-&gt;date);


J'ai regarder du côté de strtotime(), mais n'ai pas compris comment l'utiliser... Ce que j'essaie ne fonctionne pas.
Zelalsan a écrit :
Tu peux insérer une date plus simplement en SQL avec "now()" ou "curdate()".
Pas approprié ici.
Zelalsan a écrit :
Il faut juste penser à spécifier le bon fuseau horaire dans ton script avec "date_default_timezone_set".
C'est déjà défini dans le init.php appelé en tout début sur la page en ligne. date_default_timezone_set('America/Montreal');

MatthieuR a écrit :
Comment enregistres-tu le timestamp en BDD ?
Enregistres-tu uniquement le mois et l'année (sans l'heure et le jour) ?
Oui, seulement le mois et l'année psuique je n'est pas besoin du reste dans ce cas-ci.
MatthieuR a écrit :
Si c'est le cas, quand tu enregistres seulement le mois et l'année, SQL va compléter avec le jour 01 du mois et l'heure à 00:00:00.
Donc si ton fuseau horaire de lecture est différent du fuseau horaire d'enregistrement il y aura un décalage. Comme tu es à la limite d'un mois (à la seconde près...) tu peux avoir un décalage sur le mois précédent.
Ex : 2015-05-01T00:00:00+00:00 (GMT) en BDD (ou son équivalent timestamp : 1430431200) affichera 2015-04-30T18:00:00-06:00 (à NY par exemple)
Je pense que tu as mis le doigt sur le bobo, mais comme mentionné plus haut, le timezone est déjà défini dans la page.
juliesunset a écrit :

C'est déjà défini dans le init.php appelé en tout début sur la page en ligne. date_default_timezone_set('America/Montreal');


Et oui, justement, un timestamp enregistré sur le fuseau du serveur (si tu ne configures pas de fuseau à l'enregistrement) et une lecture de celui-ci sur un fuseau horaire différent = décalage.
Il vaudrait mieux que tu enregistres tes dates non pas en timestamp mais en datetime, tu verrais mieux les données.
Et si tu n'arrives pas à régler le problème (les timezones c'est toujours un peu embêtant) tu enregistres toutes tes dates au jour 2 du mois Smiley langue
Sinon il faudrait que tu montres ton code concernant l'enregistrement, le problème est sans doute là...
Modifié par MatthieuR (21 May 2015 - 23:49)
Merci beaucoup pour vos pistes!

Effectivement à bien y pensé il fallait que je change le timestamp pour autre chose dans ma bdd.
J'ai appliqué un format date manuellement, heureusement je n'avais qu'une 40taines de lignes! Smiley langue

Donc voici où j'en suis, j'ai du reconvertir en timestamp pour le français car je n'arrivais pas à faire un trucs cours autrement...
	$req = "SELECT * FROM SP_temoignages ORDER BY date DESC, id DESC";
	$infos = $DB->get_data($req);
	foreach($infos as $info){

            $datetime = date_create($info->datetime);
	       ?>
        <article class="bdr-orange-bottom">
            <p><?php echo stripslashes(nl2br($info->text)); ?></p>
            <p><strong><?php echo stripslashes($info->nom); ?></strong>
            <?php
                if(!empty($info->note)){
                    echo '- '.stripslashes($info->note).' ';
                }

                if($lang == "FR"){
                    $datetime = date_timestamp_get($datetime);
                    setlocale(LC_TIME, "fr_FR.utf8");
                    echo ' ('.ucfirst(strftime("%b %Y", $datetime)).')';
                }
                else{
                    echo ' ('.date_format($datetime, 'M Y').')';
                }
            ?></p>
        </article>
	<?php
	}

Maintenant les dates s'affichent correctement!

Je vais aller modifier mon formulaire pour que les dates soient entré correctement la prochaine fois!

Encore merci pour votre aide!