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 :

PHP et MySQL


Sujet :

PHP & Base de données

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Eragny
    Inscrit en
    Mai 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Eragny

    Informations forums :
    Inscription : Mai 2019
    Messages : 1
    Par défaut PHP et MySQL
    Salut à toute la communauté,

    Je débute totalement et, comme tout le monde ici, j'ai besoin d'aide concernant PHP et MySQL. Si une âme charitable passait par là...

    Voici mon cas :

    Grâce à la validation d'un formulaire à 3 inputs ('agence' (nom de l'agence de location de voitures), 'debut' (date de début de la location souhaitée), 'fin'(date de fin de la location souhaitée), j'accède à une nouvelle page dans laquelle doit s'afficher la disponiblité des voitures à louer selon les critères préalablement choisis. Ce qui signifie que s'il l'on souhaite louer un vehicule dans telle agence à telles dates, ne s'afficheront que les vehicules TOTALEMENT libres de cette agence.

    Il y a donc une jointure entre la table "vehicules" (qui regroupe tous les vehicules des differentes agences) et la table commandes (qui concerne toutes les commandes). Le but étant de conserver à l'affichage uniquement ce qui reste de la table "vehicules" moins la table "commandes " comme dans le schema ci-dessous avec la partie bleu:

    Nom : SQL_Joins.svg.jpg
Affichages : 105
Taille : 14,8 Ko

    J'ai réussi a retranscrire cela dans mon code grâce à un LEFT JOIN et cela marche très bien. Mais mon problème est que cela ne fonctionne qu'avec une seule commande. Dès que j'en mets une deuxieme, tout part en vrille. Je suppose qu'il faudrait faire en sorte que mes conditions présentes dans mon 'if' s'applique commande par commande. Avec une boucle peut-être ? Mais j'ai aucune idée de comment faire... Et c'est pas faute d'avoir essayé

    Aussi quelqu'un saurait comment faire ? Merci par avance pour votre aide

    PS : Voici mon code (je précise que la fonction execRequete est une function qui a été prédefini et qui regroupe le "$pso->query" le BindValue etc...):

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    if ( !empty($_POST['agence']) && !empty($_POST['debut']) && !empty($_POST['fin']) ) {
     
     
    $commandes = execRequete("SELECT * FROM commandes" );
     
     
          while( $commande = $commandes->fetch() ){  
     
    //on fait un explode pour retirer les tirets des dates
    $debut = explode("-", $_POST['debut']);
    $fin = explode("-", $_POST['fin']);
    $date_heure_depart = explode("-", $commande['date_heure_depart']);
    $date_heure_fin = explode("-", $commande['date_heure_fin']);
     
    // on concatene le resultat des explodes pour obtenir un entier exploitable pour les comparaisons
    $debut_concat =  $debut[0] . $debut[1] . $debut[2];
    $fin_concat = $fin[0] . $fin[1] . $fin[2];
    $date_heure_depart_concat = $date_heure_depart[0] . $date_heure_depart[1] . $date_heure_depart[2];
    $date_heure_fin_concat = $date_heure_fin[0] . $date_heure_fin[1] . $date_heure_fin[2];
     
    }
     
    //conditions si les dates choisies sont avant ou apres les dates de location deja enregistrées en BDD
      if(($debut_concat < $date_heure_depart_concat && $fin_concat < $date_heure_depart_concat) || ($debut_concat > $date_heure_fin_concat && $fin_concat > $date_heure_depart_concat)){
     
    //alors on affiche tous les vehicules
    $vehicules = execRequete("SELECT * 
    FROM vehicules v
    WHERE id_agence =:id_agence", array(
      ':id_agence' => $_POST['agence']
    ));
     
    }
     
     
    else{
    //sinon on affiche que ceux qui n'on pas encore été loués
     
    $vehicules = execRequete("SELECT *
    FROM vehicules v
    LEFT JOIN commandes c
    ON v.id_vehicule = c.id_vehicule
    WHERE c.id_commande IS NULL
    AND v.id_agence =:id_agence", array(
      ':id_agence' => $_POST['agence']
    ));
     
     } 
    }

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 503
    Par défaut
    Bonjour,

    Pour moi, toutes cette partie est incorrecte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // on concatene le resultat des explodes pour obtenir un entier exploitable pour les comparaisons
    $debut_concat =  $debut[0] . $debut[1] . $debut[2];
    $fin_concat = $fin[0] . $fin[1] . $fin[2];
    $date_heure_depart_concat = $date_heure_depart[0] . $date_heure_depart[1] . $date_heure_depart[2];
    $date_heure_fin_concat = $date_heure_fin[0] . $date_heure_fin[1] . $date_heure_fin[2];
     
    }
     
    //conditions si les dates choisies sont avant ou apres les dates de location deja enregistrées en BDD
      if(($debut_concat < $date_heure_depart_concat && $fin_concat < $date_heure_depart_concat) || ($debut_concat > $date_heure_fin_concat && $fin_concat > $date_heure_depart_concat)){
    Vous transformer du temps en entier, allez plutôt voire du côté de DateTime();

    Ensuite dans vos requêtes

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT *
    FROM vehicules v
    LEFT JOIN commandes c
    ON v.id_vehicule = c.id_vehicule
    WHERE c.id_commande IS NULL
    AND v.id_agence =:id_agence", array(
      ':id_agence'

    ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE c.id_commande IS NULL
    , fais que votre requête ne devrais rien retourner, car un id doit être obligatoire et unique, si il est null, c'est que la commande n'existe pas.
    Vous pourriez faire une sous requête qui retourne tout les véhicule qui ne sont pas en commande. (malheureusement je ne connais pas attributs de table, donc je ne peux qu'être approximatif).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    SELECT * FROM vehicules
    WHERE id_vehicule NOT IN (SELECT id_vehicule FROM commandes)

Discussions similaires

  1. [SGBD] requête sql en php pour mysql
    Par Thierry8 dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/09/2005, 22h31
  2. [SGBD] Probleme Avec Php et Mysql
    Par junior258 dans le forum Installation
    Réponses: 2
    Dernier message: 20/09/2005, 10h39
  3. Serv apach 2, php 5, mysql 4
    Par Bouki dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 24/06/2005, 15h32
  4. Travailler avec PHP / Apache / MySQL
    Par R3iTt0R dans le forum Linux
    Réponses: 22
    Dernier message: 24/06/2004, 11h03

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