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 :

requête sur 2 tables avec filtre sur date [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 35
    Points
    35
    Par défaut requête sur 2 tables avec filtre sur date
    bonsoir,

    j'ai créé un formulaire dans lequel j'ai 2 boutons (mois, annee) + 1 bouton "envoyer"
    ma requête fait appel à 2 tables: 1 table "clients" et 1 table "documents"
    dans ma table "documents", j'ai un champ 'clientID' qui joint l'ID de ma table "clients"... jusqu'ici tout va bien

    je souhaiterai créer une requête demandant à ce qu'on m'affiche la liste des clients (clients.nom_client) en filtrant cette liste par le champ 'temps' (au format: 2010-01-13 par ex.) qui contient à la fois le mois et l'année (suis-je suffisamment clair ?).

    voici le code de ma requête que je pensais juste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT clients.ID, clients.nom_client, documents.clientID, documents.temps
    FROM clients, documents
    WHERE documents.temps LIKE %colmois% AND documents.temps LIKE %colannee% AND clients.ID=documents.clientID
    ORDER BY clients.nom_client ASC
    merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    on jointure se fait avec JOIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT clients.ID, clients.nom_client, documents.clientID, documents.temps
    FROM clients JOIN documents ON clients.ID=documents.clientID
    Pour ton filtre tu peux utiliser les fonctions de date MONTH et YEAR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MONTH(documents.temps) = valeur_mois AND YEAR(documents.temps) = valeur_annee
    LIKE et % servent pour traiter des chaines de caractères.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 35
    Points
    35
    Par défaut
    bonsoir, et merci pour ta réactivité

    bon, maintenant, je m'y perd encore plus... (débutant oblige)
    je suis d'accord pour la jointure mais pour le filtre, j'ai modifié le champ 'temps' avec DATE... je n'ai plus que l'année, le mois et le jour... jusque là, je suis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MONTH(documents.temps) = valeur_mois AND YEAR(documents.temps) = valeur_annee
    mes 2 boutons (année et mois) avait comme valeur 2010, 2011... pour les années et '-01-', '-02-'... pour les mois...
    Est-ce que je dois corriger les valeurs de mes boutons... parce que je me retrouve avec "valeur_mois" et "valeur_annee" (voir code)... quelle est la signification de ces 2 éléments ?

    je me servais de "LIKE et % servent pour traiter des chaines de caractères", parce que je ne connaissais que cette manière de récupérer les infos...
    aujourd'hui tu m'apprends à passer par un autre chemin beaucoup plus efficace à priori... mais incompréhensible aujourd'hui pour moi...
    j'ai besoin de plus de pédagogie...


    merci

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 35
    Points
    35
    Par défaut
    ... j'oubliais...
    j'ai testé le champ 'temps' avec DATE comme type... tous mes futurs enregistrements me retournent maintenant comme valeur 0000-00-00 (???). Ce n'est évidemment pas souhaitable.

    le type TIMESTAMP m'offrait la possibilité d'avoir accès à "on update current timestamp" qui me permettait de créer une date de création et/ou de modification de l'enregistrement...
    j'ai oublié quelque chose ?

    merci

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Si tu preferes utiliser un type TIMESTAMP tu peux quand même obtenir les informations du mois et de l'années
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MONTH(FROM_UNIXTIME(documents.temps)) = valeur_mois
    Ici "valeur_mois" doit être le numéro du mois, d'ou qu'il vienne.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 35
    Points
    35
    Par défaut
    désolé pour ce réveil matinal...
    effectivement, je suis plus à l'aise avec un TIMESTAMP...
    je médite tes commentaires...

    mais, pour ma culture personnelle... DATE reste pour moi un échec...
    mes enregistrements doivent automatiquement être datés, qu'ils le soient en mode création ou en mode modification

    je te laisse tranquille pour aujourd'hui... week-end oblige

    merci encore

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 35
    Points
    35
    Par défaut page suivante, page précédente, etc.
    bonsoir,

    J'ai employé JOIN et ON pour mes jointures (OK). Le reste, je pense l'avoir assimilé... j'obtiens aujourd'hui ce que je voulais... une liste d'après ma requête SQL.
    Lorsque je liste sur ma page mes enregistrements, ils s'affichent correctement mais je voudrais qu'apparaisse sur 1 page un certain nombre d'enregistrement. Quand le nombre d'enregistrement est atteint sur une seule page, 4 boutons me permettent d'accéder à:
    page précédente, page suivante, début de la liste et fin de la liste
    Or, l'affichage de la première page se passe bien, par contre, pour page suivante, page précédente, début liste, fin liste, les pages générées sont vides. Pourquoi ?
    Ma requête se fait sur 3 variables connues: mois, annee et marques
    Suis-je sensé retrouver ces trois variables dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="<?php printf("%s?pageNum_rsRecap=%d%s", $currentPage, max(0, $pageNum_rsRecap - 1), $queryString_rsRecap); ?>">page précédente</a>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="<?php printf("%s?pageNum_rsRecap=%d%s", $currentPage, min($totalPages_rsRecap, $pageNum_rsRecap + 1), $queryString_rsRecap); ?>">page suivante</a>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="<?php printf("%s?pageNum_rsRecap=%d%s", $currentPage, 0, $queryString_rsRecap); ?>">début de la liste</a>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="<?php printf("%s?pageNum_rsRecap=%d%s", $currentPage, $totalPages_rsRecap, $queryString_rsRecap); ?>">fin de la liste</a>
    ?

    Ma requête SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT clients.ID, clients.nom_client, documents.ID, documents.nom_doc, documents.icoMasterExe, documents.icoCom, documents.icoFab, documents.icoCrea, documents.icoGravure, documents.icoInfo, documents.icoExe, documents.clientID, documents.marqueID, documents.tempsH_com, documents.tempsMN_com, documents.tempsH_fab, documents.tempsMN_fab, documents.tempsH_crea, documents.tempsMN_crea, documents.tempsH_exe, documents.tempsMN_exe, documents.tempsH_info, documents.tempsMN_info, documents.tempsH_gravure, documents.tempsMN_gravure, documents.temps
    FROM documents JOIN clients ON documents.clientID = clients.ID
    WHERE documents.temps LIKE %col_mois% AND documents.temps LIKE %col_annee% AND documents.marqueID LIKE %col_marques%
    ORDER BY nom_doc ASC
    Mon jeu d'enregistrement complet:
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    <?php
    if (!function_exists("GetSQLValueString")) {
    function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
    {
      $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
     
      $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
     
      switch ($theType) {
        case "text":
          $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
          break;    
        case "long":
        case "int":
          $theValue = ($theValue != "") ? intval($theValue) : "NULL";
          break;
        case "double":
          $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
          break;
        case "date":
          $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
          break;
        case "defined":
          $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
          break;
      }
      return $theValue;
    }
    }
     
    $currentPage = $_SERVER["PHP_SELF"];
     
    $maxRows_rsRecap = 32;
    $pageNum_rsRecap = 0;
    if (isset($_GET['pageNum_rsRecap'])) {
      $pageNum_rsRecap = $_GET['pageNum_rsRecap'];
    }
    $startRow_rsRecap = $pageNum_rsRecap * $maxRows_rsRecap;
     
    $col_mois_rsRecap = "-1";
    if (isset($_POST['mois'])) {
      $col_mois_rsRecap = $_POST['mois'];
    }
    $col_marques_rsRecap = "-1";
    if (isset($_POST['marques'])) {
      $col_marques_rsRecap = $_POST['marques'];
    }
    $col_annee_rsRecap = "-1";
    if (isset($_POST['annee'])) {
      $col_annee_rsRecap = $_POST['annee'];
    }
    mysql_select_db($database_interface_c14, $interface_c14);
    $query_rsRecap = sprintf("SELECT clients.ID, clients.nom_client, documents.ID, documents.nom_doc, documents.icoMasterExe, documents.icoCom, documents.icoFab, documents.icoCrea, documents.icoGravure, documents.icoInfo, documents.icoExe, documents.clientID, documents.marqueID, documents.tempsH_com, documents.tempsMN_com, documents.tempsH_fab, documents.tempsMN_fab, documents.tempsH_crea, documents.tempsMN_crea, documents.tempsH_exe, documents.tempsMN_exe, documents.tempsH_info, documents.tempsMN_info, documents.tempsH_gravure, documents.tempsMN_gravure, documents.temps FROM documents JOIN clients ON documents.clientID = clients.ID WHERE documents.temps LIKE %s AND documents.temps LIKE %s AND documents.marqueID LIKE %s ORDER BY nom_doc ASC", GetSQLValueString("%" . $col_mois_rsRecap . "%", "text"),GetSQLValueString("%" . $col_annee_rsRecap . "%", "text"),GetSQLValueString("%" . $col_marques_rsRecap . "%", "text"));
    $query_limit_rsRecap = sprintf("%s LIMIT %d, %d", $query_rsRecap, $startRow_rsRecap, $maxRows_rsRecap);
    $rsRecap = mysql_query($query_limit_rsRecap, $interface_c14) or die(mysql_error());
    $row_rsRecap = mysql_fetch_assoc($rsRecap);
     
    if (isset($_GET['totalRows_rsRecap'])) {
      $totalRows_rsRecap = $_GET['totalRows_rsRecap'];
    } else {
      $all_rsRecap = mysql_query($query_rsRecap);
      $totalRows_rsRecap = mysql_num_rows($all_rsRecap);
    }
    $totalPages_rsRecap = ceil($totalRows_rsRecap/$maxRows_rsRecap)-1;
     
    $queryString_rsRecap = "";
    if (!empty($_SERVER['QUERY_STRING'])) {
      $params = explode("&", $_SERVER['QUERY_STRING']);
      $newParams = array();
      foreach ($params as $param) {
        if (stristr($param, "pageNum_rsRecap") == false && 
            stristr($param, "totalRows_rsRecap") == false) {
          array_push($newParams, $param);
        }
      }
      if (count($newParams) != 0) {
        $queryString_rsRecap = "&" . htmlentities(implode("&", $newParams));
      }
    }
    $queryString_rsRecap = sprintf("&totalRows_rsRecap=%d%s", $totalRows_rsRecap, $queryString_rsRecap);
    ?>

    merci pour votre patience

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta requete est toujours la requete pourrie du début.
    Enfin réflechi un peu, tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE documents.temps LIKE %col_mois% AND documents.temps LIKE %col_annee%
    ca n'a aucun sens.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 35
    Points
    35
    Par défaut
    La forme peut effectivement te paraître primaire, voire 'pourrie' dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE documents.temps LIKE %col_mois% AND documents.temps LIKE %col_annee%
    j'essaie simplement de rechercher un mois + une année dans le champ "temps" de la table "documents" (ANNEE-MOIS-JOUR). J'en suis à mes premiers pas, et ça ne me parait pourtant pas idiot.

    Le bon sens voudrait sans doute qu'il soit écrit comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE MONTH(FROM_UNIXTIME(documents.temps)) = valeur_mois
    idem pour l'année

    Si la syntaxe de cette requête est mal rédigée (je suis d'accord), pourquoi influence-t-elle le problème de l'affichage des points "page suivante", "page précédente"... cités avant ?

    Je ne demande qu'à apprendre.

  10. #10
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    de la table "documents" (ANNEE-MOIS-JOUR)
    Justement ta colonne n'a pas ce format Annee-Mois-Jour puisque c'est un Timestamp.

    Je ne demande qu'à apprendre.
    Justement je t'ai expliqué, je t'ai montré comment bien écrire et tu restes sur ta syntaxe qui est mauvaise.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 45
    Points : 35
    Points
    35
    Par défaut
    Tu me dis qu'il faut écrire comme tu me le montres... je n'ai rien contre puisque je suis là pour apprendre.

    Est-ce que, écrit comme ça, cette forme est correcte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT clients.ID, clients.nom_client, documents.ID, documents.nom_doc, documents.icoMasterExe, documents.icoCom, documents.icoFab, documents.icoCrea, documents.icoGravure, documents.icoInfo, documents.icoExe, documents.clientID, documents.marqueID, documents.tempsH_com, documents.tempsMN_com, documents.tempsH_fab, documents.tempsMN_fab, documents.tempsH_crea, documents.tempsMN_crea, documents.tempsH_exe, documents.tempsMN_exe, documents.tempsH_info, documents.tempsMN_info, documents.tempsH_gravure, documents.tempsMN_gravure, documents.temps
    FROM documents JOIN clients ON documents.clientID = clients.ID
    WHERE MONTH(FROM_UNIXTIME(documents.temps)) = valeur_mois AND YEAR(FROM_UNIXTIME(documents.temps)) = valeur_annee
    ORDER BY documents.nom_doc ASC
    ensuite, je voudrais bien comprendre ce qui se passe pour mes liens "page suivante"... pas de me donner du code mais qu'on explique.

    merci

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

Discussions similaires

  1. [AC-2010] probleme table de resultat sur 2 tables avec regroupement
    Par anofer dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 29/11/2010, 22h15
  2. problème sur requête sur 3 tables avec une somme
    Par tomguiss dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/12/2007, 16h44
  3. Requete SUM sur une table avec critère sur une autre
    Par wail00 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/05/2007, 16h58
  4. requete avec filtre sur la date
    Par petitours dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 12/02/2007, 11h49
  5. créer TRIGGER sur 1 table avec liaison sur 2 autre table
    Par shaka84 dans le forum Développement
    Réponses: 2
    Dernier message: 11/04/2006, 11h10

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