timestamp foire sur serveur unix. - PHP - Programmation
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. |
bien bien, et ton pb c'est koi ???
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.
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 ...
Marsh Posté le 03-11-2005 à 12:59:30
Siron a écrit :
|
Ok lol
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) ?
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.
Marsh Posté le 03-11-2005 à 13:26:17
Un aimant à quoi ?
C'est la question
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 : |
j'en ai déduit que c'est la cause de problème.
je me plante completement ?
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
edit : et stocker une date dans un int ... pfff ...
Marsh Posté le 03-11-2005 à 14:47:20
shakpana a écrit : sinon oui, un tournevis est incompatible avec un clou |
Ca ne vaut pas sur la catégorie PHP. Ici, tout est possible, même poster du MySQL / Unix.
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 ...
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 ?
Marsh Posté le 03-11-2005 à 15:36:18
Ouais. Un coup de pelle à clous (tm) ?
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 )
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 )
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 et le réflexe test étape par étape, par ce que certain risquent de pas te louper le prochain coup.
Marsh Posté le 03-11-2005 à 15:58:15
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 . "')" ); |
?
Marsh Posté le 03-11-2005 à 17:19:27
lol, je récapitule ce que je devine :
Résultat?
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)
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 : |
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 |
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.
Marsh Posté le 03-11-2005 à 18:11:04
Rajoute les deux lignes suivantes
Code :
|
entre la ligne d'insertion des données dans mysql et la ligne d'aprés.
Rajoute un
Code :
|
entre la ligne commencant par "$retour = mysql_query" et la suivante.
Rajoute un
Code :
|
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.
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 |
Et y'a que la date qui foire, toutes les autres données sont bien la.
En tout cas merci de m'aider.
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. |
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');
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 :
|
utilise
Code :
|
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.
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 ?
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 ?
Marsh Posté le 03-11-2005 à 19:45:46
Siron a écrit : Et maintenant j'ai 19/01/2038 @ 04h14 tout le temps. |
oui, c'est bizzard ...
tu pourrais faire
Code :
|
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 ?
Marsh Posté le 03-11-2005 à 21:13:03
Citation : |
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.
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. |
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.
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.
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