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 :

datetime dans input


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut datetime dans input
    bonjour,

    Le sujet a déjà été abordé en parti mais je ne vois pas comment je peux l'adapter à mon code.
    D'un coté, j'ai un formulaire pour une réservation.
    Si je sélectionne le type de location et la ville, y'a pas de soucis, j'obtiens ben tous les résultats de ma BDD.
    Par contre, au niveau de la date, je bloque.
    En dehors que je pense que je dois faire une jointure sur ma table, il y'a cette histoire de donnée dans mon var_dump qui est différentes des données dans ma BDD
    J'aimerai faire apparaitre ttes les salles ou véhicules dispo selon si auparvant le select type est bien selectionné c'est a dire toutes celle qui ne sont pas enregistrées dans la base.
    Je pense que je fais faire 2 conditions, un pour les vehicules et un pour les salles. ( comme j'ai fais avant pour les types et les villes)



    Nom : table_locations.png
Affichages : 82
Taille : 180,5 Ko

    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     <fieldset>
                        <legend>Jour et heure de réservation</legend>
                        <div class="">
                            <label for="start_datetime" class="">Début</label>
                            <input type="datetime-local" class="" name="start_datetime" id="start_datetime">
                        </div>
                        <div class="">
                            <label for="end_datetime" class="">Fin</label>
                            <input type="datetime-local" class="" name="end_datetime" id="end_datetime">
                        </div>
     
                    </fieldset>
    page save.php ( je sais, j'aurai du l'appelé affichage et non save )
    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
     
     if (isset($_POST['start_datetime'])) {   // si on a reçu une valeur du formulaire
            $date = date('Y-m-d', strtotime(str_replace('T', '', $_POST['start_datetime'])));
            if ($date !== '2022-12-31 14:50') {
                $heure = $conn->query("SELECT ");
                while ($ligne = $heure->fetch(PDO::FETCH_ASSOC)) {
     
                    echo "nom:" . $ligne['Id_salle'] . '<br>';
                    echo "nom:" . $ligne['Id_voiture'] . '<br>';
                    echo "lieu:" . $ligne['lieu']  . '<br>';
                    echo '<button>réserver</button><br><br>';
                }
            } else {
                echo 'error';
            }
        }
    Je n'arrive pas a comprendre .

    Merci par avance de l'aide apportée

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 521
    Par défaut
    Bonjour,

    Avec ceci $date = date('Y-m-d', strtotime(str_replace('T', '', $_POST['start_datetime']))); vous supprimez le temps (les heures et minutes) de la date, alors qu'une durée de location pourrait bien être dans le même jour mais seulement entre deux heures différentes, et donc vous devriez garder le temps $date=date('Y-m-d H:i:s', strtotime($_POST["start_datetime"]));.

    Pour faciliter un peu la tâche, essayez d'exécuter cette requête sous phpmyadmin pour mieux comprendre ce qui se passe.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    set @lieu=1;
    set @dateDebut="2023-01-17 13:00:00";
    set @dateFin="2023-01-18 13:00:00";
     
    select nom as 'Nom Salle',nom_lieu as 'Nom lieu'
    from salles s 
    inner join lieux l on l.id_lieu=s.id_lieu
    left join location loc on (s.idSalle=loc.idSalle ) 
    where s.id_lieu=@lieu
    and (
    	(DateDebut is not null and (DateDebut > @dateFin or DateFin < @dateDebut))
    	or DateDebut is null and DateFin is null
    )
    group by s.idSalle

    Ceci devrait vous afficher toutes les salles non louées (n'existent pas dans la table location) ou bien déjà louées (existent dans location) mais avec une période qui ne se croise pas avec la @dateDebut et la @dateFin.

    Les 3 premieres variables sont là juste pour simuler les valeurs, elles seront remplacés par les valeurs PHP lorsque vous exécutez une requête via le formulaire.

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Effectivement j'ai supprimé les heures, grosse erreur de ma part.

    Quant aux variables en dur pour tester , pas de soucis, je les comprends.

    Je ne comprends pas la requête , je veux bien la tester dans SQL de phpMyadmin

    Je comprend que la fin quand tu dis que la date de début de la BDD est supérieur a la date fin de l'utilisateur et que la dateFin en BDD est inférieur à la date de début de l'utilisateur

    Ca fait longtemps que je n'ai pas manipulé des données dans différentes tables

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 521
    Par défaut
    Bonjour,

    Qu'est ce que vous ne comprenez pas dans la requête ?

    Le mot clé left join permet de joindre la table "location" pour récupérer les salles louées et aussi celles qui ne le sont pas (n'existent pas dans location).

    Si vous mettez inner join ceci vous renverra seulement les salles qui existent dans "location".

  5. #5
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Je veux faire afficher toutes les salles et les voitures disponibles à l'heure demandé qui ne sont pas dans la table locations .( selon ma logique) car la table location, ce sont toutes les locations effectuées qui apparaissent dans cette table

    Ce n'est pas les commandes que je comprends pas mais les noms des tables.
    Tu parle de nom de salle mais l'agent ne choisis dans le formulaire que le lieu, le type qu'il désire et la date .

    pourquoi des s a la fin de certains valeurs?

    lieu 1 après inner a quoi il correspond? à moins que ca sois un l pour location?
    et left join avec location loc, il sors d'ou?
    idem le s.id_lieu

    le id_lieu oui, c'est l'id de mon lieu

    Group by, j'avoue ne jamais l'avoir utilisé auparavant.. apparemment c'est pour éviter les doublons
    Moi j utilisais distinct pour ne pas avoir les doublons
    Je crois comprendre la différence entre les 2 , distinct élimine les doublons dès le départ, quand a group by, c'est a la fin de la requête

    Vous éliminez également mon T de str_replace?
    Je l'avais mis car dans mon var_dump , j'ai un T et que j'ai pas dans ma base de données au niveau des heures

  6. #6
    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 gabinou7 Voir le message
    Je veux faire afficher toutes les salles et les voitures disponibles à l'heure demandé qui ne sont pas dans la table locations .( selon ma logique) car la table location, ce sont toutes les locations effectuées qui apparaissent dans cette table
    Il me semble sage d'attendre d'avoir finalisé le modèle tabulaire (autre sujet en cours dans le forum modélisation/schéma) avant de s'attaquer aux requêtes
    Quoi qu'il en soit, pour vérifier qu'il n'existe pas de réservation pour la période envisagée, il faut faire un test de chevauchement

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * 
    from LOCATION as LOC
    where LOC.date_deb_location =< date_fin_envisagee
      and LOC.date_fin_location >= date_deb_envisagee


    Citation Envoyé par gabinou7 Voir le message
    Group by, j'avoue ne jamais l'avoir utilisé auparavant.. apparemment c'est pour éviter les doublons
    Moi j utilisais distinct pour ne pas avoir les doublons
    Je crois comprendre la différence entre les 2 , distinct élimine les doublons dès le départ, quand a group by, c'est a la fin de la requête
    DISTINCT sert à éliminer les doublons, GROUP BY sert à effectuer des regroupements pour calculer des agrégats tels que des sommes, moyennes, mini, maxi... et HAVING permet d'appliquer une restriction sur le résultat de ces calculs d'agrégats

  7. #7
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    même si ma base n'est pas correcte, je cherche une façon future de faire toutes les requêtes que j'aurai besoin et rien qu'avec ceci, je vois qu'effectivement que ceci est loin d'être au point

  8. #8
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    J'ai trouvé une requete qui me permets d'afficher toutes les salles louées ou pas sans la condition de l'heure.

    J'ai plus qu'a mettre la condition pour l'heure

    Nom : 2023-01-18_16h43_57.png
Affichages : 56
Taille : 43,8 Ko

  9. #9
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    Merci @toufik, je viens de comprendre ce que tu voulais me dire dans tes messages précédents avec ton INNER JOIN

    maintenant avec les conditions d'heure, ce que je ne comprends pas c'est que ma date en dur que j'ai rentré correspond a une date qui est dans la table location donc elle ne devrai pas etre indiquée comme libre

    filtrage avec date et heure
    Nom : sallesdispo.png
Affichages : 59
Taille : 50,5 Ko

    toutes les réservations de la table locations

    Nom : table salle location.png
Affichages : 63
Taille : 37,5 Ko

    toutes les salles ou non dispo
    Nom : toutes les locations.png
Affichages : 58
Taille : 43,8 Ko

  10. #10
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 521
    Par défaut
    Bonjour,

    Citation Envoyé par gabinou7 Voir le message
    ... ce que je ne comprends pas c'est que ma date en dur que j'ai rentré correspond a une date qui est dans la table location donc elle ne devrai pas etre indiquée comme libre
    La requête retourne un résultat correcte, parce que le idSalle de la salle affichée est 1, et pas 2 (celle ayant la même date que vous avez utilisé)

  11. #11
    Membre chevronné Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    341
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 341
    Par défaut
    Vérifie ta condition "DateDebut < ....", cela ne devrait pas être > ou >= ? ... pour être entre 2 dates.

  12. #12
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    sauf que les dates que j'ai indiqué la salle Nev est louée donc elle ne devrai pas apparaitre comme libre.

    J'ai essayé avec des egal et j'ai une erreur dans mysql, il veux pas le prendre en compte

    J'ai donc remplacé le and par le where et j'obtiens le bon résultat, l'id 2 n'apparait plus mais est ce vraiment la bonne solution????

    Je vais donc remplir ma table pour faire d'autre tests.

    Merci a tous pour votre aide.

  13. #13
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    je n'arrive pas à transformer mon var_dump dans le mm format que la BDD

    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
     
     
    if ($_POST['submit']) {
     
     
        //heure de reservation
        if (isset($_POST['start_datetime']) && isset($_POST['end_datetime'])) {   // si on a reçu une valeur du formulaire
            // $debut = date('Y-m-d H:i:s', strtotime($_POST["start_datetime"]));
            $debut = date('Y-m-d H:i:s', strtotime(str_replace('T', '', $_POST['start_datetime'])));
            // $depart = date('Y-m-d H:i:s', strtotime($_POST["end_datetime"]));
            $depart = date('Y-m-d H:i:s', strtotime(str_replace('T', '', $_POST['end_datetime'])));
     
            $heure = $conn->query("SELECT DISTINCT * FROM salles LEFT JOIN locations ON salles.Idsalle = locations.Idsalle where( (DateDebut is not null and (DateDebut < . $debut  and  DateFin < . $depart )). or DateDebut is null and DateFin is null) ");
            while ($ligne = $heure->fetch(PDO::FETCH_ASSOC)) {
     
                echo "nom:" . $ligne['nom'] . '<br>';
                echo "nom:" . $ligne['lieu'] . '<br>';
     
                echo '<button>réserver</button><br><br>';
            }
        }
    }
    Nom : erreurSQL.png
Affichages : 53
Taille : 25,8 Ko

  14. #14
    Membre confirmé
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2022
    Messages : 89
    Par défaut
    J'avance petit a petit

    J'obtiens bien toutes les salles dans mon formulaire
    La seule qui apparait pas est celle de LE malgré qu'elle est disponible dans ma base et que si je fais la requête via mysql, elle apparait bien

    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
    34
    35
     
     (isset($_POST['start_datetime']) && isset($_POST['end_datetime'])) {   // si on a reçu une valeur du formulaire
     
     
            // // $debut = date('Y-m-d H:i:s', strtotime($_POST["start_datetime"]));
            // $debut = date('Y-m-d H:i:s', strtotime(str_replace('T', '', $_POST['start_datetime'])));
            // // $depart = date('Y-m-d H:i:s', strtotime($_POST["end_datetime"]));
            // $depart = date('Y-m-d H:i:s', strtotime(str_replace('T', '', $_POST['end_datetime'])));
     
            // Retrieve the debut
            $debut = $_POST['start_datetime'];
            $depart = $_POST['end_datetime'];
     
            // Convert it to a DateTime object
            $datetimedebut = date_create($debut);
            $datetimefin = date_create($depart);
     
            // Get the Unix timestamp
            $timestampd = $datetimedebut->getTimestamp();
            $timestampf = $datetimefin->getTimestamp();
     
            // Use the timestamp in the database query
            $heure = $conn->query("SELECT DISTINCT * FROM salles LEFT JOIN locations ON salles.Idsalle = locations.Idsalle where( (DateDebut is not null and (DateDebut > $timestampd  and  DateFin < $timestampf )) or DateDebut is null and DateFin is null) ");
     
     
     
        //loop   
            while ($ligne = $heure->fetch(PDO::FETCH_ASSOC)) {
     
                echo "nom:" . $ligne['nom'] . '<br>';
                echo "nom:" . $ligne['lieu'] . '<br>';
     
                echo '<button>réserver</button><br><br>';
            }
        }

Discussions similaires

  1. [4.x] Afficher input datetime dans Twig
    Par dubitoph dans le forum Symfony
    Réponses: 8
    Dernier message: 02/12/2018, 16h09
  2. Affichage champ datetime dans input type datetime-local
    Par ParisElliot dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/04/2017, 16h08
  3. [Utile]Rajout automatique dans input et verif date
    Par matpal dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 08/11/2004, 16h36
  4. utilisation de "LIKE" avec un type datetime dans r
    Par ericmart dans le forum Langage SQL
    Réponses: 8
    Dernier message: 06/11/2003, 14h58
  5. Réponses: 3
    Dernier message: 23/09/2003, 09h12

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