Trier résultat de 2 requetes

Trier résultat de 2 requetes - PHP - Programmation

Marsh Posté le 09-11-2009 à 08:56:23    

Bonjour,
 
je viens vers vous suite à un problème sur mon développement.
 
En effet, j'ai deux requêtes (une sur la table étudiant, l'autre personnel) avec des champs différents, sauf un champ NOM (en gros). J'ai donc fait mes 2 requêtes, que j'ai mis dans un tableau.
J'ai donc un tableau avec mes résultat des 2 requêtes, mais il n'est pas trier.
 
Auriez vous une solution pour mélanger les 2 et les trier par nom? J'ai entendu parler de "array_multisort" mais je ne vois pas comment l'utiliser ni l'afficher par la suite...
 
 
Je vous joint les 2 requêtes et mon tableau.
 
Merci d'avance !
 
 

Code :
  1. $sql_etu="select NO_ETUDIANT as no_etu, NOM_USUEL as nom, PRENOM as prenom, NOM_PATRONYMIQUE as nom_patro, D_NAISSANCE as naiss, INE as ine, ADR_EMAIL as email, ADR_EMAIL_RENVOI as email_renvoi, LOGIN as login
  2.       FROM EXPLOIT_aua_etudiant
  3.       WHERE ((NOM_USUEL LIKE '{$valeur}')
  4.       OR (NOM_PATRONYMIQUE LIKE '{$valeur}')
  5.       OR (PRENOM LIKE '{$valeur}')
  6.       OR (ADR_EMAIL LIKE '{$valeur}')
  7.       OR (ADR_EMAIL_RENVOI LIKE '{$valeur}')
  8.       OR (LOGIN LIKE '{$valeur}'))";
  9.      
  10.           $sql_pers="select NO_INDIVIDU as no_ind, NOM_USUEL as nom, PRENOM as prenom, NOM_PATRONYMIQUE as nom_patro, ADR_EMAIL as email, LOGIN as login
  11.       FROM EXPLOIT_aua_personnel
  12.       WHERE ((NOM_USUEL LIKE '{$valeur}')
  13.       OR (NOM_PATRONYMIQUE LIKE '{$valeur}')
  14.       OR (PRENOM LIKE '{$valeur}')
  15.       OR (ADR_EMAIL LIKE '{$valeur}')
  16.       OR (LOGIN LIKE '{$valeur}'))";
  17.           $i=0;
  18.          
  19.       $tab_general= Array();
  20.       $query=mysql_query($sql_etu);
  21.           while ($ligne=mysql_fetch_object($query))
  22.           {
  23.             $tab_general[]=$ligne;
  24.           }
  25.       $query=mysql_query($sql_pers);
  26.           while ($ligne=mysql_fetch_object($query))
  27.           {
  28.             $tab_general[]=$ligne;
  29.           }


Message édité par Crawdge le 09-11-2009 à 09:06:49
Reply

Marsh Posté le 09-11-2009 à 08:56:23   

Reply

Marsh Posté le 09-11-2009 à 09:15:17    

mais après si tu regroupe des données différentes dans le même tableau , comment tu vas faire l'affichage ? tu ne saur pas si tu a un étudiant ou un personnel

 

pour les like, il me semble que la syntaxe est LIKE '%$valeur%'


Message édité par flo850 le 09-11-2009 à 09:15:44

---------------

Reply

Marsh Posté le 09-11-2009 à 09:22:35    

Je peux savoir s'il est étudiant ou personnel en fonction du NO_ETUDIANT (que pour étudiant) ou du NO_INDIVIDU. (que pour le personnel)...
 
Pour l'affichage, je ne mets que le nom, prénom, adresse email et login...

Reply

Marsh Posté le 09-11-2009 à 09:27:34    

tu peux peut être pas revoir le modèle de données (dans ce cas je suis HS), mais la logique serait sans doute d'avoir une table générique (individu ou personne) qui contient tout ce qui est commun à ces 2 tables (nom, prénom, mail, login, etc...) et ensuite une table spécifique avec les infos spécifique (n° étudiant, ce genre de chose). enfin du bête héritage quoi, ce qui te permettrait d'extraire ces infos en une seule requête ensuite.


Message édité par pataluc le 09-11-2009 à 09:28:07
Reply

Marsh Posté le 09-11-2009 à 09:39:51    

Malheureusement non, c'est pas moi qui ai fait la BDD... :-(

Reply

Marsh Posté le 09-11-2009 à 09:41:40    

tu copie tout dans le meme tableau tableau  
ensuite tu utilises usort


---------------

Reply

Marsh Posté le 09-11-2009 à 09:46:17    

j'ai bien tout dans mon tableau $tab_general....
Cependant je ne vois pas trop comment l'utiliser (enfin quoi lui mettre en paramètre, ni comment afficher ses résultats)
 

Reply

Marsh Posté le 09-11-2009 à 09:49:26    

c'est plus simple que ça en a l'air

Code :
  1. usort($tab_general, "compareMesEtudiantsEtMesPersonnelsSuivantLeNom" );
  2.  
  3. function compareMesEtudiantsEtMesPersonnelsSuivantLeNom($a,$b){
  4. return strcmp($a['nom'],$b['prenom']);
  5. }


tu peux aussi ajouter une comparaison sur le prénom si le nom est identique

Message cité 1 fois
Message édité par flo850 le 09-11-2009 à 09:49:38

---------------

Reply

Marsh Posté le 09-11-2009 à 09:51:08    

juste une petite question elles sont en innoDB ou en myISAM tes tables ?

Reply

Marsh Posté le 09-11-2009 à 09:54:14    

Il me mets une erreur : Fatal error: Cannot use object of type stdClass as array ...
 
 
(Elles sont en myISAM)

Reply

Marsh Posté le 09-11-2009 à 09:54:14   

Reply

Marsh Posté le 09-11-2009 à 09:57:00    

oups, j'ai oublié que tu utilisais mysql_fetch_object
 
remplace $a['nom']  par $a->nom


---------------

Reply

Marsh Posté le 09-11-2009 à 10:01:47    

Crawdge a écrit :

Il me mets une erreur : Fatal error: Cannot use object of type stdClass as array ...
 
 
(Elles sont en myISAM)


 
 
si t'es en myISAM ca serai plus pratique d'utilisé FullText deja pour ta requete (apres avoir mi ton fulltext biensur):
 
WHERE MATCH (NOM_USUEL, NOM_PATRONYMIQUE, PRENOM, ADR_EMAIL LIKE, ADR_EMAIL_RENVOI, LOGIN)  AGAINST  ('{$valeur}')";
 
 
sinon t'as PDO d'activer sur ton serveur ?
 

Reply

Marsh Posté le 09-11-2009 à 10:02:02    

En effet ça marche mieux :)
 
cependant elles ne sont pas forcement trier, mais mélanger... rste a trouver avec quoi elles sont trier ^^ lol
 
Merci en tout cas !

Reply

Marsh Posté le 09-11-2009 à 10:03:03    

stealth35 a écrit :


 
 
si t'es en myISAM ca serai plus pratique d'utilisé FullText deja pour ta requete (apres avoir mi ton fulltext biensur):
 
WHERE MATCH (NOM_USUEL, NOM_PATRONYMIQUE, PRENOM, ADR_EMAIL LIKE, ADR_EMAIL_RENVOI, LOGIN)  AGAINST  ('{$valeur}')";
 
 
sinon t'as PDO d'activer sur ton serveur ?
 


Je ne sais pas désolé de ne pouvoir te répondre :-/

Reply

Marsh Posté le 09-11-2009 à 10:06:09    

un simple   phpinfo()   fera l'affaire...

Reply

Marsh Posté le 09-11-2009 à 10:08:50    

Il a l'air d'activer, mais je n'ai pas la main pour voir s'il l'est également sur le serveur de production...

Reply

Marsh Posté le 09-11-2009 à 10:59:16    

bon de tete et a l'arrache tu pourais faire ca

 

$s = array();
 
 foreach($total as $key => $value)
 {
  $s[$key] = $value->nom);
 }
 
 sort($s);
 
 $total_sort = array();
 
 foreach($s as $key => $value)
 {
  array_push($total_sort, $total[$key]);
 }


Message édité par stealth35 le 09-11-2009 à 10:59:43
Reply

Marsh Posté le 09-11-2009 à 11:15:15    

en version propre avec array_multisort
 

$listnom = array();
 
foreach($tab_general as $user)
{
    array_push($listnom, $user->nom);
}
 
array_multisort($tab_general, SORT_ASC, SORT_STRING, $listnom);

Message cité 1 fois
Message édité par stealth35 le 09-11-2009 à 11:15:33
Reply

Marsh Posté le 09-11-2009 à 11:18:18    

tu sais que j'ai déjà donné  une solution qui n'implique pas de créer des tableaux supplémentaires ?


---------------

Reply

Marsh Posté le 09-11-2009 à 11:21:33    

Crawdge a écrit :


cependant elles ne sont pas forcement trier, mais mélanger... rste a trouver avec quoi elles sont trier ^^ lol


 

Reply

Marsh Posté le 09-11-2009 à 11:31:10    

stealth35 a écrit :

en version propre avec array_multisort
 


$listnom = array();
 
foreach($tab_general as $user)
{
    array_push($listnom, $user->nom);
}
 
array_multisort($tab_general, SORT_ASC, SORT_STRING, $listnom);


j'a testé mais ca ne me sort pas non plus mon tableau trier.... c'est bizarre...  
 
C'est p'tet a mon affichage du coup...
pourtant j'ai :

Code :
  1. foreach($tab_general as $key)
  2.   {
  3.        ....
  4. }


Me serais-je trompé ?

Reply

Marsh Posté le 09-11-2009 à 13:07:08    

envoi tout ton code

Reply

Marsh Posté le 09-11-2009 à 13:14:14    

stealth35 a écrit :

envoi tout ton code


Code :
  1. $sql_etu="select NO_ETUDIANT as no_etu, NOM_USUEL as nom, PRENOM as prenom, NOM_PATRONYMIQUE as nom_patro, D_NAISSANCE as naiss, INE as ine, ADR_EMAIL as email, ADR_EMAIL_RENVOI as email_renvoi, LOGIN as login
  2.       FROM EXPLOIT_aua_etudiant
  3.       WHERE ((NOM_USUEL LIKE '{$valeur}')
  4.       OR (NOM_PATRONYMIQUE LIKE '{$valeur}')
  5.       OR (PRENOM LIKE '{$valeur}')
  6.       OR (ADR_EMAIL LIKE '{$valeur}')
  7.       OR (ADR_EMAIL_RENVOI LIKE '{$valeur}')
  8.       OR (LOGIN LIKE '{$valeur}'))";
  9.      
  10.           $sql_pers="select NO_INDIVIDU as no_ind, NOM_USUEL as nom, PRENOM as prenom, NOM_PATRONYMIQUE as nom_patro, ADR_EMAIL as email, LOGIN as login
  11.       FROM EXPLOIT_aua_personnel
  12.       WHERE ((NOM_USUEL LIKE '{$valeur}')
  13.       OR (NOM_PATRONYMIQUE LIKE '{$valeur}')
  14.       OR (PRENOM LIKE '{$valeur}')
  15.       OR (ADR_EMAIL LIKE '{$valeur}')
  16.       OR (LOGIN LIKE '{$valeur}'))";
  17.           $i=0;
  18.    
  19.       $tab_general= Array();
  20.       $query=mysql_query($sql_etu);
  21.           while ($ligne=mysql_fetch_object($query))
  22.           {
  23.             $tab_general[]=$ligne;
  24.           } 
  25.          
  26.       $query=mysql_query($sql_pers);
  27.           while ($ligne=mysql_fetch_object($query))
  28.           {
  29.             $tab_general[]=$ligne;
  30.           }
  31.          
  32.     $listnom = array();
  33.     foreach($tab_general as $user)
  34.     {
  35.         array_push($listnom, $user->prenom);
  36.     }
  37.    
  38.     array_multisort($tab_general, SORT_ASC, SORT_STRING, $listnom); 
  39.    
  40.    
  41.              
  42.       echo "<br /><br /><table class='ui-widget ui-widget-content'>";
  43.    
  44.       echo "<thead class="ui-widget-header">
  45.         <tr>
  46.         <th>Nb</th>
  47.         <th>Statut</th>
  48.         <th>Nom</th>
  49.         <th>Pr&eacute;nom</th>
  50.         <th>Nom Patronymique</th>
  51.         <th>Login</th>
  52.         <th>Email</th>
  53.         <th>Email Renvoi</th>
  54.         </tr>
  55.        </thead>";
  56.      
  57.        foreach($tab_general as $key)
  58.         {
  59.         $i++; // Compteur
  60.        
  61.         echo "<tr>
  62.         <td>".$i."</td>";
  63.         if (isset($key->no_etu)){
  64.           $img_statut="<img src="utilisateurs/images/user-etu.png" alt="Etudiant" title="Etudiant">";
  65.         }else{
  66.            if (isset($key->no_ind)){
  67.           $img_statut="<img src="utilisateurs/images/user-perso.png" alt="Personnel" title="Personnel">";
  68.         }else{
  69.             $img_statut="";
  70.           }
  71.         }
  72.         echo "<td style="text-align:center;">{$img_statut}</td>
  73.         <td>".$key->nom)."</td>
  74.         <td>".$key->prenom."</td>
  75.         <td>".$key->nom_patro."</td>
  76.         <td>".$key->login."</td>
  77.         <td><a href="mailto:".$key->email."">".$key->email."</a></td>
  78.         <td>";
  79.          if (isset($key->email_renvoi)){
  80.             echo "<a href="mailto:".$key->email_renvoi."">".$key->email_renvoi."</a>";
  81.          }
  82.          echo "</td>
  83.         </tr>";
  84.        
  85.         }
  86.      
  87.      
  88.      
  89.       echo "</table>";

Reply

Marsh Posté le 09-11-2009 à 13:23:49    

ligne 36, faut mettre 'nom'  si tu veu trier par nom

Reply

Marsh Posté le 09-11-2009 à 13:45:05    

oui j'avais change pour voir si ca triait par prenom si je changeais, mais ca ne change rien :)
 
j'ai juste oublié de remettre

Reply

Marsh Posté le 09-11-2009 à 13:47:48    

t'as les erreurs d'activé ?, parce que deja ton  '$i++' devrai t'en généré une

Message cité 1 fois
Message édité par stealth35 le 09-11-2009 à 13:48:00
Reply

Marsh Posté le 09-11-2009 à 13:50:38    

stealth35 a écrit :

t'as les erreurs d'activé ?, parce que deja ton  '$i++' devrai t'en généré une


why?

Reply

Marsh Posté le 09-11-2009 à 13:56:06    


 
parce que $i n'exite pas
 
faire d'hab $i = 0;
 
sinon  
 

Notice:  Undefined variable: i

Reply

Marsh Posté le 09-11-2009 à 13:59:07    

ligne 17 :spamafote:  (même si je te t'accorde que ca aurait été plus propre ligne 57)

Message cité 1 fois
Message édité par pataluc le 09-11-2009 à 13:59:54
Reply

Marsh Posté le 09-11-2009 à 14:00:10    

 

pas vu ils etaient caché  :pt1cable:

 

(ca aurai été plus simple d'utilisé la clé du tableau en plus)


Message édité par stealth35 le 09-11-2009 à 14:01:01
Reply

Marsh Posté le 09-11-2009 à 14:05:16    

En effet ca aurai été plus logique plus bas la déclaration ^^
 
C'est que je faisais des tests et des ajouts et pas forcement au bon endroit ^^

Reply

Marsh Posté le 10-11-2009 à 10:54:28    

flo850 a écrit :

c'est plus simple que ça en a l'air

Code :
  1. usort($tab_general, "compareMesEtudiantsEtMesPersonnelsSuivantLeNom";);
  2.  
  3. function compareMesEtudiantsEtMesPersonnelsSuivantLeNom($a,$b){
  4. return strcmp($a['nom'],$b['prenom']);
  5. }


tu peux aussi ajouter une comparaison sur le prénom si le nom est identique


Bon après une nuit de sommeil et de retour dessus, j'ai réutilisé ceci et ca marche....  [:crawdge:1]  
 
je comprend pas ce que j'ai fait de plus/moins, mais bon c'est nickel avec ça !  
 
Merci à tous ! ;)

Reply

Marsh Posté le 10-11-2009 à 11:03:26    

:sol:


---------------

Reply

Marsh Posté le 10-11-2009 à 14:05:07    

moi je comprend pa le coup du 'strcmp' y'a un truc qui m'échappe dans la fonction 'usort', va falloir que je me penche dessus.  :whistle:


Message édité par stealth35 le 10-11-2009 à 14:05:29
Reply

Marsh Posté le 10-11-2009 à 14:51:38    

Félicitations. Tu viens de réaliser coté code ce que ta base aurait fait en plus facile et plus rapide avec une requete 'union'.

Reply

Marsh Posté le 10-11-2009 à 15:03:45    

fred777888999 a écrit :

Félicitations. Tu viens de réaliser coté code ce que ta base aurait fait en plus facile et plus rapide avec une requete 'union'.

 

non,

 

The used SELECT statements have a different number of columns


Message édité par stealth35 le 10-11-2009 à 15:04:01
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed