Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/04/2011, 16h04   #1
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Par défaut fonction date - afficher des heures au délas de 24H

J'ai une application qui charge des données dans mysql, champ time. Celui-ci accepte des durées, en heures, supérieure à 24H. Quel intérêt ? Ici définir le nombre d'heure (et de minutes) du travail hebdomadaire, soit entre 18 et 39H ou mensuel... Le type time dans mysql le gère.

Par contre, sous PHP j'utilise plusieurs couches objets pour les formulaires et l'accès à la base de données. La couche formulaire me vérifie la validité de la saisie (c'est bien une heure) et me retourne la donnée au format HH:MM:SS par défaut à l'aide de la fonction .

Le paramètre 'H:i:s' est paramétrable. Si j'ai une saisie de 37h30 il va me retourner 13:30:00 ce qui n'est pas bon. J'ai beau avoir démonter google je ne trouve rien de plus que ce qui est dit sur la fonction date().

Y aurait-il un paramètre inusuel mais efficace qui permettrait de récupérer un 37:30:0 ou un 162:00:00 ?

Si non, faut que je casse l'objet (ce qui sera plus rapide, mais moins propre).
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 16h14   #2
Membre régulier
 
Homme
Chef de projet NTIC
Inscription : juin 2007
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Chef de projet NTIC
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2007
Messages : 69
Points : 70
Points : 70
Salut Michel Rotta,

Je ne pense pas qu'un champ date soit approprié pour le stockage d'une durée. Même si une date en bdd est stockée comme une durée, leurs gestions sont différentes.
Pourquoi ne pas stocker un temps en secondes ou minutes ? Puis pour un affichage plus sympatique tu utilises une vue ou une fonction stockée pour te convertir cette durée en heure-minutes.
Cobalt59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 16h30   #3
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
La zone de stockage en base est de type TIME. Ce type sous MySql est conçu pour gérer des heures (heures, minutes, seconde, centième), les trier, les comparer et calculer dessus.

La gestion en PHP fonctionne bien. Passer par un champ integer en minutes reviendrait à avoir a réinventer une bonne partie de la roue, ce qui ne me semble pas indispensable.

La notion de date est trompeuse, la fonction date() permet de mettre un timestamp en forme que ce timestamp (en notion PHP) contienne une date, une date et une heure ou uniquement une heure, c'est la fonction date() qui traite l'affichage, il faut donc comprendre ici date() comme formatage_de_lheure()

Je pense que je vais ré-écrire le validateur et coder entièrement la restitution de l'heure. Ce sera beaucoup moins lourd que d'avoir à réinventer la roue et les rayons.

Sauf a trouver le salvateur paramètre qui afficherait la durée au délà de 24h...
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 16h46   #4
Membre régulier
 
Homme
Chef de projet NTIC
Inscription : juin 2007
Messages : 69
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Chef de projet NTIC
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2007
Messages : 69
Points : 70
Points : 70
Je te proposais cela car il me semble non conforme de faire passer une date avec une nombre d'heure > à 24. Ni ton sgbd ni php ne voudra le faire.
Tant qu'a réinventer la roue tu pourrais tout aussi bien créer un nouveau type de données dans ton sgbd
Cobalt59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h07   #5
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Le type TIME de MySql est conçu pour cela avec une amplitude qui va de -839h à +839h soit un peu plus de 34 jours au dessus de 0, largement ce qu'il me faut.

Faut juste pouvoir faire rentre les données dedans !
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/04/2011, 00h19   #6
Modérateur
 
Avatar de Vil'Coyote
 
Développeur Web
Inscription : février 2008
Messages : 3 302
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : février 2008
Messages : 3 302
Points : 4 480
Points : 4 480
sauf qu'il est bien indiqué dans le lien que tu as fournie. la fonction date ne permet d'avoir une heure que sur 12 ou 24 et pas plus car elle ne sert qu'à récupérer une heure valide et non une durée chose que semblerait il tu attende. donc je pense que la fonction date en elle même ne peut pas réaliser ce que tu souhaite.
Vil'Coyote est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 10h36   #7
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Désolé pour le délais de réponse, quelques jours de vacances loin de sql et php !

Le manuel dit : "La raison de cet intervalle de validité si large est que les colonnes de type TIME peuvent être utilisés pour représenter non seulement des heures du jour, mais aussi des durées entre deux événements (ce qui peut dépasser largement les 24 heures, ou même, être négatif). " et plus particulièrement : "ce qui peut dépasser largement les 24 heures".

Je ne vois pas de mention contradictoire dans la page sur des durées qui ne pourraient dépasser les 24H. De plus les formats données parlent bien, en plus des heures d'un nombre de jours, sauf que ceci est donnés pour le SQL, pas pour le PHP
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 13h54   #8
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
Bonjour,

Citation:
Envoyé par Michel Rotta Voir le message
Faut juste pouvoir faire rentre les données dedans !
La colonne "duree" de la table contient "24:00:00", soit 24 heures.
Le formulaire retourne :
Code :
<?php $duree = '37:00:00'; ?>
Une simple requête permet d'incrémenter la durée :
Code :
1
2
3
4
5
6
7
8
9
10
<?php
  include('SetPath.php');
 
  $connexion = connexion();
 
  $duree = '37:00:00';
  $sql = 'UPDATE test
          SET duree = ADDTIME(duree, \'' . $duree . '\')';
  mysql_query($sql);
?>
La colonne contient désormais "61:00:00".

Je ne sais pas si c'est cela que tu recherches, car ton discours contient un mélange de problème d'affichage et de stockage.
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 15h39   #9
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
Citation:
Envoyé par Michel Rotta Voir le message
Désolé pour le délais de réponse, quelques jours de vacances loin de sql et php !

Le manuel dit : "La raison de cet intervalle de validité si large est que les colonnes de type TIME peuvent être utilisés pour représenter non seulement des heures du jour, mais aussi des durées entre deux événements (ce qui peut dépasser largement les 24 heures, ou même, être négatif). " et plus particulièrement : "ce qui peut dépasser largement les 24 heures".

Je ne vois pas de mention contradictoire dans la page sur des durées qui ne pourraient dépasser les 24H. De plus les formats données parlent bien, en plus des heures d'un nombre de jours, sauf que ceci est donnés pour le SQL, pas pour le PHP
En fait la fonction date() ne te donnera pas la réponse que tu attends car elle formate une date valide.
Donc 36h pour lui c'est 24h + 12h donc : le jour suivant à 12h.
Car une journée de 36h n'existe pas pour lui.

Je crains donc que tu doives te faire ta propre fonction d'affichage.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 10h13   #10
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Effectivement, je pense que je vais devoir en passer pour ma propre fonction d'affichage (et de saisie).

Pour la récupération cela s'annonce un peu plus coton vu que je travail avec doctrine (1.2) et que le blocage semble venir de là, il faut que je vois si je peux facilement rajouter un type de données.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h04.


 
 
 
 
Partenaires

Hébergement Web