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

Langage PHP Discussion :

Récupérer des enregistrements de ma base de données


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2014
    Messages : 180
    Points : 58
    Points
    58
    Par défaut Récupérer des enregistrements de ma base de données
    Bonjour,

    J'ai une table passage qui enregistre les passages d'une déchetterie.
    Pour chaque utilisateur, je souhait rechercher tous les passages mais j'aimerais récupérer les passages uniquement si pour le même jour j'ai un enregistrement qui a un intervalle <= à 15min
    et ça sur une année entière.

    J'ai essayé de faire un bout de code mais rien de probant !
    En fait je ne sais pas comment tester intervalle de 15 min pour le même jour et pour le même utilisateur
    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
    <?php
    try
    {
    	$cnx = new PDO('mysql:host=localhost;dbname=smtom', 'root', '');
    }catch(Exception $e)
    {
    	die('Erreur : '.$e->getMessage());
    }
     
    $h = $cnx->query("SELECT * FROM habitants ORDER BY lastname") or die("ERROR H");
    	while ($row = $h->fetch(PDO::FETCH_ASSOC))
    	{
    		$p = $cnx->query("SELECT * FROM dechetterie_passages WHERE habitant = '".$row['id']."'") or die("ERROR P");
    		$passage = $p->fetch(PDO::FETCH_ASSOC);
    		while ($passage)
    		{
    			//echo "Habitant : ".$row["lastname"]." ".$row["firstname"]." Passage : ".$passage["datetime"]."<br><br>";
    			$interval = $passage["datetime"];
    		}
    		while($passage["datetime"]->diff($interval)<= 900)
    		{
    			echo "Habitant : ".$row["lastname"]." ".$row["firstname"]." Passage : ".$passage["datetime"]."<br><br>";
    		}
    	}
    ?>

  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
    Deja fait une jointure au lieu de deux requêtes.
    Ensuite n'apelle pas tes colonnes "datetime", ici j'ai renommé en "date_passage".
    Et pour finir pour que ça fonctionne il faut que tes resultats soient triés par "date_passage"
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT habitants.lastname, habitants.firstname, habitants.id,  dechetterie_passages.date_passage FROM habitants 
    LEFT JOIN dechetterie_passages ON habitants.id = dechetterie_passages.habitant
    ORDER BY lastname, date_passage

    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
    $prec_passage = '';
    $prec_habitant = '';
     
    while ($row = $h->fetch(PDO::FETCH_ASSOC)) {
      // on a deux lignes successives avec le même habitant
      if ($row['habitant'] == $prec_habitant) {
             $objDatepassage = date_create($row['date_passage']);
             $passage = $objDatepassage->format('U');
              if (($passage - $prec_passage) <= 15*60  {
                   echo "Habitant : ".$row["lastname"]." ".$row["firstname"]." Passage : ".$passage["date_passage"]."<br><br>";     
              }
      }
      $prec_passage = $passage;
      $prec_habitant = $row['id'];
    }
    Fais attention à ce que tu écris, ne mets pas des boucles while n'importe ou à toutes les sauces.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2014
    Messages : 180
    Points : 58
    Points
    58
    Par défaut
    Alors déjà merci pour ton aide !!

    Dans mon code, le "datetime" correspond au nom de ma colonne dans ma table "passage".
    En testant ce code j'ai un problème avec la variable passage qui lors du premier passage dans ma boucle, cette variable n'est pas définie car je ne passe pas dans mon premier if, donc la variable "$prec_passage = rien"


    De plus, lorsque tu met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($row['habitant'] == $prec_habitant) {}
    Je suppose que $row['habitant'] correspond à l'id de l'habitant ?

  4. #4
    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
    oui je me suis trompé c'est $row['id'] et pas $row['habitant'].

    Concernant "datetime" j'ai bien compris ; je te disais justement que c'est une mauvaise idée.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2014
    Messages : 180
    Points : 58
    Points
    58
    Par défaut
    le problème c'est que je n'ai pas créé la bdd donc on est d'accord que c'est pas super !!!!

    Pour ma variable $passage, as tu une autre idée ?

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2014
    Messages : 180
    Points : 58
    Points
    58
    Par défaut
    Bon j'ai essayé autrement seulement j'aimerais exclure les enregistrements où il n'y a qu'un seul passage.

    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
    <?php
    try
    {
    	$cnx = new PDO('mysql:host=localhost;dbname=smtom', 'root', '');
    }catch(Exception $e)
    {
    	die('Erreur : '.$e->getMessage());
    }
    $h = $cnx->query("SELECT a.* FROM `dechetterie_passages` AS a, `dechetterie_passages` AS b WHERE a.`habitant` = b.`habitant` AND a.`datetime` > b.`datetime` AND DATEDIFF(a.`datetime`, b.`datetime`)< 900 ORDER BY habitant, datetime DESC");
    while($row = $h->fetch(PDO::FETCH_ASSOC))
    {
    	echo "Habitant : ".$row["id"]." Passage : ".$row["datetime"]."<br><br>";
    }
     
    ?>

  7. #7
    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
    Comme ça :
    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
    <?php
    $h = $cnx->query("SELECT habitants.lastname, habitants.firstname, habitants.id, dechetterie_passages.`datetime`, UNIX_TIMESTAMP(dechetterie_passages.`datetime`) as passage_timestamp
    FROM habitants 
    LEFT JOIN dechetterie_passages ON habitants.id = dechetterie_passages.habitant
    ORDER BY lastname, date_passage");
     
    $prec_passage = '';
    $prec_habitant = '';
     
    while ($row = $h->fetch(PDO::FETCH_ASSOC)) {
     
      $passage = $row['passage_timestamp']
     
      if ($row['id'] == $prec_habitant) {
    		if (($passage - $prec_passage) <= 15*60))  {
    		   echo "Habitant : ".$row["lastname"]." ".$row["firstname"]." Passage : ".$passage["datetime"]."<br><br>";
    		}
      }
      $prec_passage = $passage;
      $prec_habitant = $row['id'];
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2014
    Messages : 180
    Points : 58
    Points
    58
    Par défaut
    Voici le résultat obtenu :
    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
    Habitant : 1842 Passage : 2014-04-11 17:06:51
     
    Habitant : 1842 Passage : 2014-04-12 16:46:03
     
    Habitant : 1518 Passage : 2014-03-20 15:17:05
     
    Habitant : 163 Passage : 2014-05-17 09:00:14
     
    Habitant : 94 Passage : 2014-01-08 09:07:52
     
    Habitant : 1041 Passage : 2014-05-09 14:55:37
     
    Habitant : 1004 Passage : 2014-05-10 15:37:36
     
    Habitant : 574 Passage : 2014-01-17 10:59:22
     
    Habitant : 348 Passage : 2014-04-14 14:12:16
     
    Habitant : 540 Passage : 2014-05-10 15:47:19
     
    Habitant : 540 Passage : 2014-05-16 11:07:31
    On voit bien qu'il y a des enregistrement où il y a qu'un passage pour le même habitant. De plus, je n'ai pas l'impression que le délais de 15 min soit respecté.

    Voici mon code
    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
    <?php
    try
    {
    	$cnx = new PDO('mysql:host=localhost;dbname=smtom', 'root', '');
    }catch(Exception $e)
    {
    	die('Erreur : '.$e->getMessage());
    }
    $h = $cnx->query("SELECT habitants.lastname, habitants.firstname, habitants.id, dechetterie_passages.datetime, UNIX_TIMESTAMP( dechetterie_passages.datetime ) AS passage_timestamp
    FROM habitants
    LEFT JOIN dechetterie_passages ON habitants.id = dechetterie_passages.habitant
    ORDER BY lastname, datetime");
     
    $prec_passage = '';
    $prec_habitant = '';
     
    while ($row = $h->fetch(PDO::FETCH_ASSOC)) {
     
      $passage = $row['passage_timestamp'];
     
      if ($row['id'] == $prec_habitant) {
    		if (($passage - $prec_passage) <= 15*60)  {
    		   echo "Habitant : ".$row["id"]." Passage : ".$row["datetime"]."<br><br>";
    		}
      }
      $prec_passage = $passage;
      $prec_habitant = $row['id'];
    }
    ?>

  9. #9
    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 voit bien qu'il y a des enregistrement où il y a qu'un passage pour le même habitant
    Non on ne le verrait pas ici puisqu'on n'affiche que le deuxième passage dans le 15 minutes.

    Si tu veux les deux ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "Habitant : ".$row["id"]." Passage : ".$row["datetime"].'<br/>Passage précédent : ' . date('Y-m-d H:i:s',$prec_passage) . '<br/>';
    Par contre dans la requête il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY lastname, id, `datetime`
    car plusieurs personnes peuvent avoir le même nom.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Janvier 2014
    Messages : 180
    Points : 58
    Points
    58
    Par défaut
    Merci je viens de tester ton code, il fonctionne parfaitement, comment je peux filtrer uniquement pour l'année en cours? je n'avais pas compris que ça prenais en compte le passage précèdent dans l'affichage.

    Maintenant que j'ai tous les résultat, est il possible de supprimer les passages?

    exemple:

    1: passage à 10h
    2: passage à 10h10
    3: passage à 10h12
    4: passage à 10h30

    j'aimerais supprimer les enregistrement 2 et 3

    Le but c'est de recalculer les passages, les passages avec un intervalle de 15 min n'aurais pas due être enregistré (Ce qui influe sur les compteurs des clients) Donc je dois recalculer les compteur de chaque habitant (environ 2000 d'où le soft) !!!!

Discussions similaires

  1. [Débuter] Récupérer des informations d'une base de données SQL
    Par takago dans le forum Qt Creator
    Réponses: 1
    Dernier message: 02/12/2013, 17h24
  2. [Débutant] Ajout des enregistrement d'une base de donnes acces via une autre base acces
    Par nefzawi dans le forum Visual Studio
    Réponses: 0
    Dernier message: 14/04/2013, 21h42
  3. Réponses: 5
    Dernier message: 28/02/2011, 21h42
  4. récupérer des valeurs de la base de donnée
    Par marwa580 dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/05/2010, 22h43
  5. [MySQL] je cherche une aide pour récupérer des champs d'une base de donnée
    Par maya24 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 23/09/2007, 12h14

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