timestamp foire sur serveur unix.

timestamp foire sur serveur unix. - PHP - Programmation

Marsh Posté le 03-11-2005 à 11:35:30    

Bonjours, j'utilise la fonction timestamp, et il y'a un problème.
 
La seule chose que ça me retourne c'est soit 01/01/1970 @ 01h00 soit 19/01/2038 @ 04h14.
 
J'ai lu que ça venait d'un problème de compatibilté avec le timestamp de unix.
 
J'aimerai savoir comment contourner le problème ?
 
Merci d'avance.
 
Siron

Reply

Marsh Posté le 03-11-2005 à 11:35:30   

Reply

Marsh Posté le 03-11-2005 à 11:56:51    

Siron a écrit :

Bonjours, j'utilise la fonction timestamp, et il y'a un problème.
 
La seule chose que ça me retourne c'est soit 01/01/1970 @ 01h00 soit 19/01/2038 @ 04h14.
 
J'ai lu que ça venait d'un problème de compatibilté avec le timestamp de unix.
 
J'aimerai savoir comment contourner le problème ?
 
Merci d'avance.
 
Siron


bien bien, et ton pb c'est koi ???


Message édité par bl@p_psx le 03-11-2005 à 11:57:19

---------------
:Moultiplayers:.:Quatuor Chevalier:.:Admin G15-france.com:.:Wiki -G15-france:.:-Papa-:.
Reply

Marsh Posté le 03-11-2005 à 12:19:27    

Citation :

J'aimerai savoir comment contourner le problème ?


 
Mon problème : je ne sais pas comment contourner le problème.

Reply

Marsh Posté le 03-11-2005 à 12:25:10    

Siron a écrit :

Bonjours, j'utilise la fonction timestamp, et il y'a un problème.


et timestamp de quoi ?
je veux dire : vu que la fonction timestamp() n'existe pas en fonction intégrée à php ...
Parlerais-tu de mysql ? ou bien d'autre chose encore ...


---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 03-11-2005 à 12:59:30    

Siron a écrit :

Citation :

J'aimerai savoir comment contourner le problème ?


 
Mon problème : je ne sais pas comment contourner le problème.


 
Ok lol  [:jar jar]


---------------
http://www.alsacreations.com, http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net. A ne surtout pas prendre en exemple : http://www.worldinternet.be
Reply

Marsh Posté le 03-11-2005 à 13:04:34    

timestamp de mysql.
 
Je l'utilise comme variable pour savoir quand un post à été posté.
Le code source fonctionnait sous un serveur windows, et maintenant je l'ai repris mais sur un serveur unix.
 
Y'a pas une variable équivalente sous mysql qui est compatible avec celle de linux (avec la date et l'heure) ?


Message édité par Siron le 03-11-2005 à 13:04:58
Reply

Marsh Posté le 03-11-2005 à 13:05:03    

C'est vendredi ?

Reply

Marsh Posté le 03-11-2005 à 13:14:25    

[:dawa]
 
 
 
 
 
 
[:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 03-11-2005 à 13:17:56    

Il faut tout de même le remarquer : ça parle de MySQl et de Unix, ça n'a ni queue ni tête, et où ça attérit ? Dans la cat PHP.
 
Cette cat agit comme un aimant.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 03-11-2005 à 13:26:17    

Un aimant à quoi ?  
 
C'est la question [:pingouino]


---------------
http://www.alsacreations.com, http://www.openweb.eu.org. Mon CV : http://cv.roane-irkana.net. A ne surtout pas prendre en exemple : http://www.worldinternet.be
Reply

Marsh Posté le 03-11-2005 à 13:26:17   

Reply

Marsh Posté le 03-11-2005 à 14:05:16    

Citation :

mysql_query("INSERT INTO siron_blog VALUES('', '" .$titre . "', '" . time() . "', '" . $style . "', '" . $remarque . "', '" . $texte . "', '" . $blog_img . "')" );


 
Et quand je veux afficher la data avec la fonction date() :::    <? echo date('d/m/Y \@ H\hi', $timestamp); ?>
 
Et j'ai bien la variable timestamp en 3 iem position dans la table adéquate.
 
Ca ne m'affiche qu'une des 2 dates cité plus haut.
 
or j'ai lu sur un site :  
 

Citation :


Dans un soucis de faciliter le stockage et le traitement d'une date entre MySQL et PHP j'utilise le format INT car il y a une incompatibilité entre le TIMESTAMP MySQL et le TIMESTAMP Unix.


 
j'en ai déduit que c'est la cause de problème.
 
je me plante completement ?

Message cité 1 fois
Message édité par Siron le 03-11-2005 à 14:07:57
Reply

Marsh Posté le 03-11-2005 à 14:46:06    

Siron a écrit :

or j'ai lu sur un site :


faut pas croire tout ce qu'on lit sans vérifier de quoi ça cause ...
un MySQL TIMESTAMP n'a rien à voir avec un UNIX TIMESTAMP
sinon oui, un tournevis est incompatible avec un clou
[:pingouino]
 
edit : et stocker une date dans un int ... pfff ...

Message cité 1 fois
Message édité par shakpana le 03-11-2005 à 14:49:35

---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 03-11-2005 à 14:47:20    

shakpana a écrit :

sinon oui, un tournevis est incompatible avec un clou
[:pingouino]


 :non: Ca ne vaut pas sur la catégorie PHP. Ici, tout est possible, même poster du MySQL / Unix.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 03-11-2005 à 14:53:06    

héhé, j'oubliais, tu as raison, un bon coup de pelle à clou(tm) et y'a pu de tournevis qui tienne ...


Message édité par shakpana le 03-11-2005 à 14:53:19

---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 03-11-2005 à 15:06:04    

Bon soit.
 
Et qu'est ce qui pourrait provoquer le problème alors ?
 
Le serveur oublie de garder l'heure ?
 

Reply

Marsh Posté le 03-11-2005 à 15:36:18    

Ouais. Un coup de pelle à clous (tm) ? [:itm]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 03-11-2005 à 15:41:13    

attente de la fonction date de php : le nombre de seconde depuis le premier janvier 1970 à minuit. (voir  [:rtfm] )
exemple de valeur retourné par mysql : 2005-11-03 15:39:19 (simple test : j'ai créé une colone timestamp dans une table, j'y ai affecté now() et j'ai fait un select * derriére [:airforceone] )
 
Y aurait pas comme un probléme de logique quelque part dans ta façon de faire?
 
EDIT : La prochaine fois qu'on te dit que ca a rien à voir même si ca porte le même nom, t'auras intéret à avoir le réflexe [:rtfm] et le réflexe test étape par étape, par ce que certain risquent de pas te louper le prochain coup.


Message édité par omega2 le 03-11-2005 à 15:45:21
Reply

Marsh Posté le 03-11-2005 à 15:58:15    

Reply

Marsh Posté le 03-11-2005 à 16:37:17    

Je trouve pas de problème de logique.
 
En fait le code n'est pas de moi.
Et jusqu'a hier je connaissais casi rien en php et rien en mysql, et comme je suis forcé d'adapter le code au serveur de base de donnée sans aucune info sur les tables ou quoi, j'apprends sur le ta pour comprendre.
 
Normallement y'a aucun problème avec la logique pour sauvegarder la date et l'heure et les affichers, ça marche très bien chez la personne qui m'a donné le code, et j'ai rien du modifier dans cette partie.
 
c'est comme si la fonction time() ne fesait pas son travail, ou encore que la variable timestamp de la table oubliait son contenu.
 
la syntaxe est bonne la :
 

Citation :

mysql_query("INSERT INTO siron_blog VALUES('', '" .$titre . "', '" . time() . "', '" . $style . "', '" . $remarque . "', '" . $texte . "', '" . $blog_img . "')" );


?


Message édité par Siron le 03-11-2005 à 16:41:18
Reply

Marsh Posté le 03-11-2005 à 17:19:27    

lol, je récapitule ce que je devine :  

  • tu mets un nombre dans une colone timestamp sans vérifier que l'insertion c'est bien passé. (pas de mysql_affected_rows )
  • Et quand tu relis tes données, tu utilises le résultat sans vérifier que t'as reçu quelque chôse. (pas de mysql_num_rows ni de test sur la variable retourné par la requette)  
  • Et je parirais que s'il y a eu des messages d'alerte tu les as caché en utilisant un @. (voire tu l'y a mis dessuite pour faire comme dans les exemple de tel ou tel pas trés bon site de tutoriel)


Résultat?  

  • T'as rien inséré dans mysql. (message d'erreur de mysql : "Incorrect datetime value: 'lenombre' for column 'madate' at row 1" que tu n'as pas pu voir s'afficher vu que tu n'as pas pris la peine de vérifier que ca s'est bien affiché)
  • Tu recois rien (rien = "" pour une chaine et 0 pour un nombre) quand tu vérifie plus tard mais tu t'en rends pas compte faute d'avoir vérifier comme il faut.
  • la fonction date de php te retourne ensuite une date bidon vu qu'elle recoit elle même une donnée 100% bidon.


 
 
Est ce que j'ai raison dans mes hypothéses ou est ce que j'ai tord? Dans tous les cas, maintenant on va arrêter de tous perdre notre temps à jouer au chat et à la souris au fond des bois un soir d'hivers et on va faire les chôses dans l'ordre :
Etape 1 : Montre nous ton code et pas jsute une ligne qui se balade toute seule. (on véra ensuite pour les autres étapes)


Message édité par omega2 le 03-11-2005 à 17:19:53
Reply

Marsh Posté le 03-11-2005 à 17:42:41    

Ben tu as raison.
 
Je connais pas vraiment le php et mysql, je peux +- comprendre un code avec l'aide d'un dico php et mysql, mais je ne peux en aucun cas dire si la méthode utilisée est efficiente et pertinente pour : le resultat recherché et la securité.
 
Envoit des données sur la base mysql :
 

Citation :


//On écrit dans la db MySQL
if (isset($texte))
{
mysql_query("INSERT INTO siron_blog VALUES('', '" .$titre . "', '" . time() . "', '" . $style . "', '" . $remarque . "', '" . $texte . "', '" . $blog_img . "')" );
}


 
Ici la date est l'heure sont indiqué par time().
 
Réception des données :
 

Citation :

$retour = mysql_query('SELECT * FROM siron_blog ORDER BY id DESC LIMIT ' . $premiereNews . ', ' . $NewsParPage);


 
Traitement :
 

Citation :

while ($donnees = mysql_fetch_array($retour)) //Les arranger en array
  {
  //Quelques transformations de variables
  $id = $donnees['id'];
  $titre = stripslashes($donnees['titre']);
  $timestamp = $donnees['timestamp'];
  $style = stripslashes($donnees['style']);
  $remarque = stripslashes($donnees['remarque']);
  $texte = nl2br(stripslashes($donnees['texte'])); //nl2br génère les entrée html, stripslashes vire les backslashs de sécurité
  $blog_img = $donnees['blog_img'];  
  //Compteur de mots et chars
 
  $word = split(" *[][ ,.;:?!'\"{()}] *", $texte);
  $nbr_word = count($word);
  $nbr_char = strlen($texte);


 
Affichage de la date et heure :
 

Citation :

<? echo date('d/m/Y \@ H\hi', $timestamp); ?>


 
Voila, j'espere que j'ai rien oublié.
 
Dans tous les cas, le systeme fonctionne (en excluant les erreurs de syntaxes qui auraient pu être corrigées) sur 2 autres serveurs avec la même logique.


Message édité par Siron le 03-11-2005 à 17:43:10
Reply

Marsh Posté le 03-11-2005 à 18:11:04    

Rajoute les deux lignes suivantes

Code :
  1. echo "nombre de lignes insérés :".mysql_affected_rows();
  2. echo "derniére erreur détecté par mysql :".mysql_error();

entre la ligne d'insertion des données dans mysql et la ligne d'aprés.
 
Rajoute un

Code :
  1. echo "nombre de lignes insérés :".mysql_num_rows();

entre la ligne commencant par "$retour = mysql_query" et la suivante.
 
Rajoute un

Code :
  1. print_r($donnees);

juste aprés la ligne "while ($donnees = mysql_fetch_array($retour)) //Les arranger en array"
 
Tout ça permettra de voir s'il y a un probléme et à quel niveau.
 
 
PS : C'est normal d'avoir un peu de mal quand on se lance dans la modif d'un script qu'est pas de nous tout en débutant. Le fait de rajouter des echo et des print_r bien placé permet de vérifier le contenu de certaines variables ou le résultat de certaines fonctions.

Reply

Marsh Posté le 03-11-2005 à 18:40:42    

Pour l'insertion de donné, il me met :
 
1 ligne inséré et aucun nombre pour erreur detecté.
 
Pour l'afficheage des données j'ai :
 

Citation :

Warning: Wrong parameter count for mysql_num_rows() in /home/irision/www/blog/admin/blog.php on line 70
nombre de lignes insérés :Array ( [0] => 28 [id] => 28 [1] => Titre abd [titre] => Titre abd [2] => 00000000000000 [timestamp] => 00000000000000 [3] => style abd [style] => style abd [4] => rem abd [remarque] => rem abd [5] => Voici un texte [texte] => Voici un texte [6] => [blog_img] => )
[-]
Titre:  Titre abd
Time: 01/01/1970 @ 01h00
Style.style abd
Remarque: rem abd
 
Voici un texte


 
Et y'a que la date qui foire, toutes les autres données sont bien la.
 
En tout cas merci de m'aider.


Message édité par Siron le 03-11-2005 à 18:44:21
Reply

Marsh Posté le 03-11-2005 à 19:03:37    

Je reprends le fil ...
 
la valeur renvoyer par time() donne par exemple 1131041007 (c'était y'a qlq minutes)
un champ MySQL TIMESTAMP à le format DATETIME, la doc :
 

Citation :

The DATETIME, DATE, and TIMESTAMP types are related. This section describes their characteristics, how they are similar, and how they differ.  
 
The DATETIME type is used when you need values that contain both date and time information. MySQL retrieves and displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'. (``Supported'' means that although earlier values might work, there is no guarantee that they will.)


 
donc faire rentrer 1131041007 dans un format 'YYYY-MM-DD HH:MM:SS' ne peut fonctionner (clous / tournevis), et malheureusement la doc nous dit aussi que les dates mal-formattées sont silencieusement mises à 0000-00-00 00:00:00 dans les versions pré-v5.0.2 ou ALLOW_INVALID_DATES était le mode par défaut.

Citation :

Starting from MySQL 5.0.2, MySQL will give warnings/errors if you try to insert an illegal date. You can get MySQL to accept certain dates, such as '1999-11-31', by using the ALLOW_INVALID_DATES SQL mode. (Before 5.0.2, this mode was the default behavior for MySQL).


conclusion il faut transformer time() pour matcher 'YYYY-MM-DD HH:MM:SS', par ex. date('Y-m-d H:i:s')
 
maintenant si tu veux absolument un TIMESTAMP UNIX, tes requêtes
SELECT FROM_UNIXTIME(1131041007);
SELECT UNIX_TIMESTAMP('2005-11-03 19:03:27');
 


---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 03-11-2005 à 19:03:59    

Quand tu vois la valeur de timestamp, le comportement de la fonction date est normale. A la place d'un champ timestamp, il aurait falut utiliser un champ integer (ou bigint peut être) afin de pouvoir stocker le nombre de seconde en question et non pas uen date à la forme "yyyy/mm/dd hh/nn/ss".
 
Au fait, petite optimisation : à la place de  

Code :
  1. while ($donnees = mysql_fetch_array($retour)) //Les arranger en array

utilise

Code :
  1. while ($donnees = mysql_fetch_array($retour, MYSQL_ASSOC)) //Les arranger en array

MYSQL_ASSOC indique à la fonction de créer une tableau où les noms des indices seront ceux des colones retourné par la requette et de ne pas créer d'indice numérique. Le tableau sera donc deux fois plus petit qu'actuellement.


Message édité par omega2 le 03-11-2005 à 19:07:30
Reply

Marsh Posté le 03-11-2005 à 19:21:32    

J'ai modifier comme ça :
 

Citation :

mysql_query("INSERT INTO siron_blog VALUES('', '" .$titre . "', '" . date('Y-m-d H:i:s') . "', '" . $style . "', '" . $remarque . "', '" . $texte . "', '" . $blog_img . "')" );


 
Et maintenant j'ai 19/01/2038 @ 04h14 tout le temps.
 
Peut être que mon code est une machine à voyager dans le temps ?
 
En fait si je comprends bien : c'est pas parceque j'ai pas parceque j'ai pas un champ timestamp que je peux pas utiliser timestamp ?
Si je mets le champ timestamp de la table en int, plus de problème ?

Message cité 1 fois
Message édité par Siron le 03-11-2005 à 19:22:32
Reply

Marsh Posté le 03-11-2005 à 19:26:10    

J'ai changé dans ma table le timechamp en type int, et c'est bon ça marche.
En fait j'avais été abusé par le nom timestamp en pensent que ça allait d'office avec un nom de champ de table timestamp.
Merci encore pour l'aide.
 
Et sinon omega2, avec ton optimisation je dois rien changer d'autre ?

Message cité 1 fois
Message édité par Siron le 03-11-2005 à 19:26:35
Reply

Marsh Posté le 03-11-2005 à 19:45:46    

Siron a écrit :

Et maintenant j'ai 19/01/2038 @ 04h14 tout le temps.
 
Peut être que mon code est une machine à voyager dans le temps ?
 
En fait si je comprends bien : c'est pas parceque j'ai pas parceque j'ai pas un champ timestamp que je peux pas utiliser timestamp ?
Si je mets le champ timestamp de la table en int, plus de problème ?


oui, c'est bizzard ...
 
tu pourrais faire

Code :
  1. echo time()."<br />\n";
  2. echo date('Y-m-d H:i:s')."<br />\n";

histoire de voir si ça te retourne des valeurs correctes ...
 
EDIT : et si tu faisais un echo de ta requête, ça pourrais servir ...  
et un 2ème echo de la valeur "timestamp" récupérée sans formattage aucun ie pas de date() ça semble obvious mais on sait jamais ...
 
Sinon, le int, encore une fois, utilisons les choses pour ce quoi elles sont faites, non ?


Message édité par shakpana le 03-11-2005 à 20:16:28

---------------
Il faut toujours arrondir les angles -- Raymond Poincaré (à moins que ce soit de Cicéron)
Reply

Marsh Posté le 03-11-2005 à 21:13:03    

Citation :


Sinon, le int, encore une fois, utilisons les choses pour ce quoi elles sont faites, non ?
 


 
Ben oui mais bon, moi je savais pas.
 
Sinon pour les essais, je les ferai mais aps tout de suite, car j'ai encore pas mal de pain sur la planche.

Reply

Marsh Posté le 03-11-2005 à 22:54:13    

Siron a écrit :

J'ai changé dans ma table le timechamp en type int, et c'est bon ça marche.
En fait j'avais été abusé par le nom timestamp en pensent que ça allait d'office avec un nom de champ de table timestamp.
Merci encore pour l'aide.
 
Et sinon omega2, avec ton optimisation je dois rien changer d'autre ?


L'optimisation dont je t'ai parlé, c'est juste pour éviter la création des indices numériques. Les autres indices (ceux qui correspondent aux noms de colones) ne sont pas touchés par cette optimisation. Donc tant que t'utilises pas des $donnees[2] (par exemple), tu n'auras rien d'autre à modifier.

Reply

Marsh Posté le 04-11-2005 à 17:54:42    

Ok, je l'ai appliquée et y'a rien qui est parti en couille.
 
Merci pour l'aide.
 
Prochaine étape ::> codé un nouveau systeme d'identification pour admin avec des sessions, mais la ça devrait aller, car j'ai déjà coder une page de test avec session et ça marche bien.


Message édité par Siron le 04-11-2005 à 17:55:01
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed