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 :

Créer un tableau à partir d'une requete SQL


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Créer un tableau à partir d'une requete SQL
    Bonjour,

    J'ai une requête SQL et je veux mettre le résultat dans un tableau que je vais parcourir par la suite.

    La requête renvoi plusieurs enregistrements de plusieurs utilisateur.En fait j'ai une table Pointage et j'extrait tout les utilisateurs pointés avec les dates.
    Simpelment je veux avoir comme résultat un utilisateur une seule fois et tous les dates expl:
    c'est ce que j'ai dans le résultat de la requette
    Util1 date1
    Util1 date2
    Util1 date3
    Util2 date1
    Util 2 date3....

    Je veux avoir comme resultat :
    Util1 date1 date2 date3
    Util2 date1 date2 date3..

    Est il possible de la faire j'ai passé un temps fou à créer ce tableau mais j'ai pas arrivé . Pouvez vous m'aider s'il vous plait?Ou y a t-il un autre moyen afin d'avoir un seul utilisateur avec tout les dates pointés?

    Merci d'avance

  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
    La méthode la plus direct est d'utiliser la fonction GROUP_CONCAT() de mysql.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Tu veux obtenir ce résultat directement avec MySQL ?

    Dans ce cas il faudra tout mettre dans une seule "colonne" avec GROUP_CONCAT( ).

    Vois les exemples sur la doc : http://dev.mysql.com/doc/refman/5.0/...n_group-concat
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Salut ,

    Merci pour votre aide j'ai tester la raquette suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom_prenom,Matricule, GROUP_CONCAT( date_import ) 
    FROM import_abs
    GROUP BY nom_prenom
    Elle m'affiche une seule ligne pour chaque utilisateur sauf que la colonne GROUP_CONCAT( date_import ) n'est pas lisible sur PHPMy admin il a la forme :[BLOB - 10 o] et [BLOB - 43 o]??!! je sais pas c'est quoi ce code , est ce que le GROUP_CONCAT peut afficher correctement un groupe de date?

    @Séb est il un autre moyen en php pour crée ce tableau avec une seule ligne pour chaque utilisateur avec tout les dates pointés?

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    je sais pas c'est quoi ce code
    phpMyAdmin considère le contenu de la colonne obtenue avec GROUP_CONCAT( ) comme un binaire, et ne l'affiche pas.

    est ce que le GROUP_CONCAT peut afficher correctement un groupe de date?
    Oui, teste sur une page web.

    est il un autre moyen en php pour crée ce tableau avec une seule ligne pour chaque utilisateur avec tout les dates pointés?
    Oui bien sûr.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    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
    Selon la configuration, phpmyadmin affiche ou non les BLOB.
    Mais bon ton but n'est pas de visualiser le résultat dans phpmyadmin donc je ne vois pas pourquoi tu t'arretes la dessus.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Salut,

    Oui effectivement ça m'affiche les dates correctement sur une page web , j'ai tester par la suite.

    à ce stade c'est bien j'ai une seule ligne par utilisateur et dans la colonne Group_contact que j'ai nommé as "result" tout les dates pointées séparés par des espaces. Maintenant je dois exploiter ce résultat pour comparer les dates pointés avec les dates de la période.

    là je pense à metrre le resultat dans un tableau et le parcourir pour la comparaison....

    Lorsque je rentre ce soir je vais vous fournir mon code si j'aurais des diff , et ça sera gentil de votre part de m'aider à finir ce code

    Merci

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Tu peux peut-être faire tout ça directement dans une requête.

    Faudrait qu'on ait les tenants et les aboutissants pour te conseiller au mieux.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    salut ,

    Tu peux peut-être faire tout ça directement dans une requête.
    comment je peux le faire via SQL, pour chaque pointage et date de la période? ça sera plus simple pour l'affichage.

    Car je viens de terminer le code avec des boucles :

    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
    <tr ><td width="10%"> <p> Employeur</p></td> <td><p> Matricule</p></td> // Affichage de l'entete 
     
    <?php 
     
    foreach($this->Tab_dates as $date):
    			$date_mois=date_mois_jour($date);
      			echo "<td>".$date_mois."</td>";
    	endforeach;
    			echo "</tr>";// affichage de la période
     
    // ici je commence à boucler pour chaque emlpoyeur si il est pointer la date en cours 
    	foreach($this->listeall as $info):
    			echo"<tr><td><p>".$info['nom_prenom']."</p></td>";
    			echo"<td><p>".$info['Matricule']."</p></td>";
    			$nbr=count($this->Tab_dates);
     
      for ($i=0;$i<$nbr;$i++)
    		{
    		  $split = explode(" ",$info['result']);// exploder les date de Group_Contact
    		  $nbrdate=count($split);
     
    		for($j=0;$j<$nbrdate;$j++)
    		 {
    		  $dateimport=$split[$j];
     
    		if($dateimport==($this->Tab_dates[$i]))
     
    		{
    				//echo "<td>".$dateimport."</td>";//juste pour tester
    				//echo "<td>".$this->Tab_dates[$i]."</td>";
    				echo"<td bgcolor='#00CC00'><font color='#ffffff'></td>";
    		}
    			else 
    				echo"<td bgcolor='#CCCCCC'><font color='#ffffff'></td>";
             }
           }
     
    		echo "</tr>";
     
     	endforeach;
    }?>
    Ce code permet d’afficher pour chaque utilisateur une ligne avec tout les pointage .... sauf que j'ai un pb d'affichage :/ il faut que les dates soient symétriques voir imprime ecran
    Images attachées Images attachées  

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    comment je peux le faire via SQL, pour chaque pointage et date de la période? ça sera plus simple pour l'affichage.
    Je ne sais pas. Faudrait qu'on ait plus d'infos.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  11. #11
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Ce que je veux c'est d'afficher un formulaire qui contient les employeurs les dates du mois et devant chaque employé s'il est pointé y aura une case verte sinon case grise:

    Employeur Matricule 01 02 03 04 05 06 07 ....... 30

    Emlp1 XXXX P P P A P P P .........A

    Empl2 YYYY P A P P P P ............

    Jusque la j'arrive à créer la partie Employeur Matricule et les dates Horizontale , j'ail la liste des dates de pointage grace à Group_Concat. je peux les mettre dans un tableau grace à la fonction explode puisque le séparateur c'est une espace.

    le problème c'est de boucler à partir de la 1er date vers la fin de la période et les dates pointés ... j'ai essayé de créer deux boucles en comptant le nombre de dates de la période sélectionnée et le tableau des dates pointés:

    par exemp Tab1 contient les dates de la période 01 02 03 04 .....>>30
    Tab 2 contient les dates pointés trié de plus petit au plus grand : 01 03 04 08 09..>>30 , le deuxième tableau ne contient pas forcement les meme date que le 1er. donc je boucle avec la 1er valeur du Tab1 tout le Tab2 pour voir si elle existe : l'employer est présent ( mais je dois tenir en compte de la correspondance de la ligne horizontale des dates de la période) .

    j'ai esseyé ce code mais je galère avec

    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
     
     $nbr=count($this->Tab_dates);
     		  $split = explode(" ",$info['result']);// exploder les date de Group_Concat
    		  sort($split);
    		  $nbrdate=count($split);
    		  $i=0;
    		  $j=0;
     
    while($i<$nbr)
    {
    $compar1=date_mois_jour($this->Tab_dates[$i]);// renvoi le jour de la date
    $compar2=date_mois_jour($split[$j]);//renvoi le jour de la date
    		if($compar1==$compar2)
    		{
    			echo"<td  bordercolordark='#000000' bgcolor='#00CC00'>P<font  size='1%'color='#ffffff'></font></td>";
     
     
    		$j++;
     
    		}
    		else
    			{	echo"<td  width='' bgcolor='#CCCCCC'>".$this->Tab_dates[$i]."<font  size='+1'color='#ffffff'></font></td>";
     
     
     
    		$i++;
    	}
    Pouvez vous m'aider à comparer les deux tableaux en affichant chaque fois si c'est l'employeur est présent ou pas?

  12. #12
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Au final tu veux savoir si un élément donné (un jour) se trouve dans un tableau (les pointages).

    Pour cela il existe in_array( ).
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Merci pour ta proposition, simplement le in_array() va juste vérifier l’existence de l'élément dans le deuxième tableau, mais je veux que l'affichage soit à la même indice pour être en symétrie avec la période en haut.

    Bon j'ai rajouter :$i++ dans la boulce

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if($compar1==$compar2)
    {
    	echo"<td  bordercolordark='#000000' bgcolor='#00CC00'>P<font  size='1%'color='#ffffff'></font></td>";
    	$j++;
            $i++/ pour incrémenter l'indice du 1er tableau 
    }
    ==> il aura des Notices d'erreur
    Notice: Undefined offset: 2 in C:\wamp\www\Conge\application\views\scripts\absences\calendrierabs.html on line 95
    ... j'esaye de améliorer ce code pour qu'il soit sans erreur de notification

  14. #14
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    in_array() va juste vérifier l’existence de l'élément dans le deuxième tableau, mais je veux que l'affichage soit à la même indice pour être en symétrie avec la période en haut.
    Je ne vois pas où est le problème.

    Tu as un tableau contenant les jours du mois,
    un autre tableau des pointages,
    tu boucles sur les jours du mois,
    pour chacun d'eux tu vérifies si l'employé a pointé ou pas avec in_array( ).
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  15. #15
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Vraiment mille merci je me compliquait la vie en cherchant avec d'autre solution, voici le code et ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for ($i=0;$i<$nbr;$i++)
    {
     
    if(in_array($this->Tab_dates[$i],$split))
    {			echo"<td  bordercolordark='#000000' bgcolor='#00CC00'>P<font  size='1%'color='#ffffff'></font></td>";
     
    }
    else 
    			{	echo"<td  width='' bgcolor='#CCCCCC'>A<font  size='+1'color='#ffffff'></font></td>";
    			}
     
    }
    Maintenant je veux afficher la période de congé donc j'ai une date de début et date de fin; il se peut que l'employeur logue deux congé séparer donc je dois faire aussi un group_concat avec la date début et la date fin.
    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
     $nbr=count($this->Tab_dates);
     		  $splitdebut = explode(" ",$info['resultdebut']);
    		  $splitfin=explode(" ",$info['resultfin']);
    		  sort($splitdebut);
    		  sort($splitfin);
    		  $taball=array_merge($splitdebut,$splitfin);
     
    for ($i=0;$i<$nbr;$i++)
    {
     
    if(in_array($this->Tab_dates[$i],$taball))
    {			echo"<td  bordercolordark='#000000' bgcolor='#00CC00'>P<font  size='1%'color='#ffffff'></font></td>";
     
    }
    else 
    			{	echo"<td  width='' bgcolor='#CCCCCC'>A<font  size='+1'color='#ffffff'></font></td>";
    			}
     
    }
    Via la fonction array_merge j'ai rassembler les deux tableau contenant les dates de début et les dates de fin , si j'applique la même fonction j'aurai en vert juste la date de début et la date de fin, Comment je peux avoir toute la période en vert? Avez_vous une idée?

Discussions similaires

  1. [SQL-Server] Créer fichier CSV à partir d'une requete SQL
    Par slimshady2878 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/12/2013, 19h02
  2. Réponses: 3
    Dernier message: 10/09/2007, 20h31
  3. Réponses: 5
    Dernier message: 27/02/2007, 20h55
  4. Comment faire du MDX à partir d'une requete SQL?
    Par Immobilis dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 10/11/2005, 09h46
  5. Tableau a partir d'une requete sql
    Par 10-nice dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/10/2004, 16h37

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