IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Formater une date issue d'une variable


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 412
    Par défaut Formater une date issue d'une variable
    Bonjour,
    Je ne sais pas si ce que je vais vous demander est possible.

    J'affiche des noms et dates de naissance avec le code ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     <?php
    include('../config.php');
    $select = '	SELECT nom, ddn, ddn_en FROM rh WHERE MONTH(ddn_en) = MONTH(CURRENT_DATE) ORDER BY ddn ASC';
     
     
    $result = $conn->query($select);
    $total = mysqli_num_rows($result);
     
     
    if($total) {
     
     
     
     
    while($row = mysqli_fetch_array($result)) {
     
     
    echo '<span>'.$row["nom"].'</span>'; 
    echo '<span> </span>'; 
    echo '<span style="color:#000cff; font-weight:bold">'.$row["ddn"].'</span>'; 
    echo '<br>'; 
    echo '<br>';
     
     
    }
    }
     
     
    mysqli_free_result($result);
     
     
    ?>
    Le résultat :

    Toto : 01 /05/1985
    Dada 28/05/1970

    J'aimerai que le format de la date à l'affichage soit un peu different du genre :

    Toto : 01 /05
    Dada 28/05

    ou

    Toto : 01 mai
    Dada 28 mai

    je sais pas ce qui est possible mais quoi qu'il en soit, à l'affichage, j'aimerai que l'année n'apparaisse pas

    Est-ce possible?

    Merci à vous

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 619
    Billets dans le blog
    10
    Par défaut
    bonjour,

    Les fonctions chaînes de caractères peuvent être différentes d'un SGBD à l'autre, mais ceci devrait fonctionner avec la plupart d'entre eux :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select NOM
         , concat(substring(cast(DDN as char(10)), 09, 02) 
                 ,substring(cast(DDN as char(10)), 05, 03)) as DDN
    from RH
    order by NOM

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 412
    Par défaut
    Merci escartefigue

    ton code m'à bien plu en prime abord mais il ne fonctionne pas

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 341
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 341
    Billets dans le blog
    17
    Par défaut
    Avec DATE_FORMAT(), et en supposant que ddn_en est une colonne de type DATE :

    Toto : 01 /05
    Dada 28/05
    Avec des numériques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT nom, ddn, ddn_en, DATE_FORMAT(ddn_en, '%d/%m') AS jour_mois
    FROM ...
    Toto : 01 mai
    Dada 28 mai
    Pour le mois en toute lettres selon la locale du serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT nom, ddn, ddn_en, DATE_FORMAT(ddn_en, '%d %M') AS jour_mois
    FROM ...
    https://dev.mysql.com/doc/refman/8.0...on_date-format

    Par ailleurs, tu ne devrais pas avoir 2 colonnes ddn et ddn_en,
    mais 1 colonne ddn au format DATE que tu formates ponctuellement au besoin

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 619
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par UDSP50 Voir le message
    Merci escartefigue

    ton code m'à bien plu en prime abord mais il ne fonctionne pas
    Je viens de le tester sous DB Fiddle avec MySQL 8.0, MariaDB 10.6, Postgres 15 et SQL server 2022 , ça fonctionne très bien.
    Un message d'erreur ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 412
    Par défaut
    Alors Séb je pige pas

    ton code à fonctionné mais la plus rien il réaffiche comme avant

    Là sérieux c'est trop chelou

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Citation Envoyé par Séb. Voir le message
    en supposant que ddn_en est une colonne de type DATE
    Ta colonne ddn (ou ddn_en, au moins l'une des deux) est-elle oui ou non de type DATE?



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $total = mysqli_num_rows($result);
     
    if($total) {
        while($row = mysqli_fetch_array($result)) { //...
    Aussi, sauf si tu as un usage ultérieur de ta variable $total, mysqli_num_rows() n'est pas faite pour savoir si la requête renvoie des résultats, mais pour savoir combien il y en a.
    Pour savoir s'il y a des résultats, le premier fetch te l'indiquera de toute manière. D'ailleurs dans le cas présent tu peux trés bien écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $result = $conn->query($select);
    $rows = $result->fetch_all(MYSQLI_ASSOC);
     
    foreach($rows as $row) { //...
    S'il n'y a aucun résultat, la boucle foreach ne s'exécutera pas.

    Et si malgré ça, une envie irrépressible de connaître le nombre de résultats te prend => count($rows)

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 412
    Par défaut
    bonjour,

    ma date "ddn" est un format texte, pour des raisons de facilité, c'est une transformation de ma date "ddn_en"

    ma date"ddn_en" elle est au format date en anglais

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 412
    Par défaut
    voila ce que j'ai mis mais la date reste entière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    include('../config.php');
    $select = "SELECT nom, ddn, ddn_en, DATE_FORMAT(ddn_en, '%m/%d') AS jour_mois FROM rh WHERE MONTH(ddn_en) = MONTH(CURRENT_DATE) ORDER BY ddn ASC";
     
     
    $result = $conn->query($select);
    $total = mysqli_num_rows($result);
     
     
    if($total) {
     
     
     
     
    while($row = mysqli_fetch_array($result)) {
     
     
    echo '<span>'.$row["nom"].'</span>'; 
    echo '<span> </span>'; 
    echo '<span style="color:#000cff; font-weight:bold">'.$row["ddn"].'</span>'; 
    echo '<br>'; 
    echo '<br>';

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 341
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 341
    Billets dans le blog
    17
    Par défaut
    ma date "ddn" est un format texte, pour des raisons de facilité, c'est une transformation de ma date "ddn_en"
    En fait ça complique largement les choses
    Si tu stockes ta date dans une colonne SQL DATE tu bénéficies de tout un tas de fonctions PHP / SQL permettant de calculer / formater tes dates.
    Ne pas stocker tes dates dans une colonnes DATE c'est scier ta branche.

    ma date"ddn_en" elle est au format date en anglais
    Tu veux dire mm/dd/yyyy ou avec des noms de jours/mois en anglais ?

    Donne-nous le type SQL réel de ta colonne et un exemple de données en base
    Et utilise les bons types
    Sinon on ne s'en sortira jamais

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Je pense qu'il faut bien réfléchir avant de s'appuyer sur des fonctions propres au SGBD choisi, même si c'est pratique, car on se lie à un SGBD et si on veut migrer vers un autre type eg de Myqsl vers Postgresql ou Oracle, alors un audit et une ré-écriture du code sera nécessaire.
    Avec de la malchance, une évolution de ce SGBD peut-même casser des trucs (des fonctions peuvent être deprecated/retired à la longue).

    De plus, cette approche est dépendante de la locale du serveur donc attention.

    Oui, stocker des dates dans dans des champs datetime c'est la base, et je dirais même stocker le timezone avec pour contextualiser les données. Le jour où le système sera distribué dans plusieurs pays (ou un grand pays) ce sera un problème d'avoir des valeurs datetime "naïves" par opposition aux valeurs "time zone-aware". 3 heures du matin à Los Angeles c'est pas la même heure qu'à NYC.
    Imaginez que votre application soit dotée d'une fonction de prise de rendez-vous et distribué dans différentes contrées avec différents fuseaux horaires.

    D'autre part, il faut prévoir de la souplesse: le format de date, de nombres etc c'est typiquement un réglage qui peut varier d'un utilisateur à l'autre. Donc vous pouvez laisser le frontend gérer cette partie en fonction des préférences de l'utilisateur.

    Par ailleurs, de nos jours on utilise des frameworks, des ORM... Certes l'apprentissage des bases du SQL et tout ça est nécessaire et bénéfique mais je pense qu'il faudra envisager de monter en compétences par la suite.
    Par exemple se mettre à Doctrine (ORM) en combinaison avec un framework: Symfony, Laravel ou autre, ce qui augmentera votre valeur sur le marché de l'emploi.

    Je ne dis pas qu'il faut le faire tout de suite, sauf si vous travaillez déjà comme dév ou envisagez de le devenir. Car il y aura de moins en moins de demande pour le code "artisanal" de ce genre, puisqu'il existe des outils high-level pour définir et gérer des objets de bases de données avec un certain niveau d'abstraction et même une certaine portabilité. L'ORM permet aussi de redéfinir les objets quand c'est nécessaire: ça se résume généralement à adapter un fichier de classe et l'exécuter.

    A part ça, il pourrait aussi être intéressant de créer des vues afin de mieux séparer la logique DB du code PHP.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 412
    Par défaut
    J'ai réussi après un long travail

    donc j'ai suivi les conseils

    ma date est dans ma table au format date style "2023-05-18"

    Pour les néophytes comme moi , j'ai fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $date = $row["ddn_en"];
    list($annee, $mois, $jour) = sscanf($date, "%d-%d-%d"); 
     
     
    echo '<span style="color:#000cff; font-weight:bold">'.$jour."/".$mois.'</span>';
    Cela fonctionne

    Merci à vous tous de vous êtes penchés sur mon souci


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] VBA: Formater une variable numérique
    Par kimou75 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/03/2016, 10h27
  2. Réponses: 2
    Dernier message: 29/04/2014, 17h12
  3. [Smarty] Formater une variable
    Par heldev dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 06/01/2012, 16h15
  4. Création d'une variable date au Format MMYYS7.
    Par MEGAMIND2 dans le forum SAS Base
    Réponses: 29
    Dernier message: 30/05/2011, 21h48
  5. Réponses: 6
    Dernier message: 14/02/2005, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo