php-mysql c pas possible les sous-requetes ?

php-mysql c pas possible les sous-requetes ? - PHP - Programmation

Marsh Posté le 31-01-2003 à 10:00:22    

bonjour a tous,
j'ai un pb avec une requete:
select nMembre from membre where 1 and nMembre in( select nMembre from encadre where 1);
 
ne me dites pas qu'on peut faire ca avec une jointure simple, la requete est bcp plus longue, mais c le coup du ...in(select... qui marche pas.

Reply

Marsh Posté le 31-01-2003 à 10:00:22   

Reply

Marsh Posté le 31-01-2003 à 10:40:08    

il me semble que les sous requêtes ne sont supportées qu'à partir du dernier mysql (sorti il y a qques jours je crois).
 
edit: cf http://forum.hardware.fr/forum2.ph [...] subcat=395


Message édité par dropsy le 31-01-2003 à 10:41:32
Reply

Marsh Posté le 31-01-2003 à 11:37:12    

arf ca c bon a savoir
Hao pq mets tu where 1  
je trouves ca inutile meme si il le mette ds phpmyadmin  

Reply

Marsh Posté le 01-02-2003 à 09:32:24    

@weed:
 
le but de cette requete, c qu'elle se construise au fur et a mesure.
donc au debut "select.....where 1"
et puis apres: requete=requete." and nom like \"toto\"";
par exemple.et ainsi de suite

Reply

Marsh Posté le 01-02-2003 à 22:20:12    

merci Hao pour mais en fait je connais les sous interrogations et les jointures simple, auto et .....
 
ma question est pourquoi tu fais comme phpmyadmin qui met a chaque fois un where 1 ce qui est inutile pour moi ...
 
select nMembre from membre where nMembre in( select nMembre from encadre);  
 
sinon ds ta requete étant tres longue tu n'oses pas trop faire une jointure, bizzare ms c vrai que l'on m'a dit que le must etait de faire des sous interrogation chose car plus puissant que les jointures ms j'aime pas trop ....
dc en fait cela comfirme ce que j'ai entendu, c un peu plus court en sous interrogation ....  
 

Reply

Marsh Posté le 03-02-2003 à 15:35:22    

bon, pour résumer voila un morceau du code, essaie de voir ce que ca donnerait sans 'where 1' :
 
 $requete = "select * from membre where 1";
 if($anneeArrivee != null)
  $requete = $requete." and anneeArrivee = \"$anneeArrivee\"";
   
 if($nom != null)
  $requete = $requete." and nom like \"%$nom%\"";
   
 if($prenom != null)
  $requete = $requete." and prenom like \"%$prenom\"%";
 
 if($age != null)
  $requete = $requete." and age = \"$age\"";
   
 if($adresse != null)
  $requete = $requete." and adresse like  \"%$adresse%\"";
 
 
 
etc.....


Message édité par hao le 03-02-2003 à 15:36:10
Reply

Marsh Posté le 04-02-2003 à 10:28:17    

je ne comprends pas trop stript  
je repose ma question qu'est que ca change un where 1
parce que la clause WHERE permet de faire une selection  
c tt du moins ce que j'ai appris

Reply

Marsh Posté le 04-02-2003 à 11:09:23    

weed a écrit :

je ne comprends pas trop stript  
je repose ma question qu'est que ca change un where 1
parce que la clause WHERE permet de faire une selection  
c tt du moins ce que j'ai appris


 
si tu ne rentres dans aucun if, tu as qd même une requête valide et réciproquement, si tu rentres dans un if (n'importe lequel) tu as aussi une requête valide


Message édité par dropsy le 04-02-2003 à 11:11:00
Reply

Marsh Posté le 04-02-2003 à 12:39:34    

c le mot d'ordre SELECT qui fait la selection
where est la pour imposer des contraintees sur les resultats du select
and ca fait pareil, ca rajoute des conditions, mais faut avaoir fait un where avant
reprend le code du dessus sans le where et essaie devierses possiblites, tu verras ca marchera jamais

Reply

Marsh Posté le 04-02-2003 à 13:28:53    

Heu, un exemple sans "where=1" !
 
Et qui permet d'ajouter des champs sans recopier des lignes de codes qui font la même chose  ;)  
 

Code :
  1. $champ[] = "anneeArrivee";
  2. $champ[] = "nom";
  3. $champ[] = "prenom";
  4. $champ[] = "age";
  5. $champ[] = "adresse";
  6. $where = "";
  7. for( $i=0; $i<count($champ); $i++ )
  8. {
  9. if( $$champ[$i] != null )
  10. {
  11.  if( empty( $where ) )
  12.   $where = "where ";
  13.  else
  14.   $where .= " and ";
  15.  $were . = "$champ[$i] ) \"" . $$champ[$i] . "\"";
  16. }
  17. }
  18. $requete = "select * from membre $where";


 
C'est un exemple, hein.
A adapter si besoin...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 04-02-2003 à 13:28:53   

Reply

Marsh Posté le 04-02-2003 à 13:55:12    

deja qu'en php le code c le bordel, je trouve que ca alourdit pas mal. sinon ca marche, mais ca revient au meme :)

Reply

Marsh Posté le 04-02-2003 à 15:11:45    

Arrête tout de suite le PHP :heink:


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 04-02-2003 à 17:12:16    

:??:
 
les pages qui font 3k lignes, avec du html a printer dedans qui donne un truc super mal indenté c qd meme UN PEU plus le bordel qu'un truc oo...


Message édité par hao le 04-02-2003 à 17:12:37
Reply

Marsh Posté le 04-02-2003 à 17:26:26    

c'est pas parce que tu fais du php que t'es obligé de bosser comme un porc hein..
 
eh puis rien ne t'empêche de faire ton php en objet :heink:


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 04-02-2003 à 17:54:29    

Hao a écrit :

:??:
 
les pages qui font 3k lignes, avec du html a printer dedans qui donne un truc super mal indenté c qd meme UN PEU plus le bordel qu'un truc oo...


 
 
Tiens, voilà un bout de code en cous de dev.
 
C'est une méthode d'un objet qui sert à gérer des requêtes quasiement créés dynamiquement par l'utilisateur.
 

Code :
  1. // Génération de la requete SQL.
  2. function gen_sql()
  3. {
  4.  // Opérateurs utilisables en fonction du type de donnée.
  5.  // Dans les chaînes, l'@' doit être remplacé par le nom du champs, et le '$' par la valeur s'il y a lieu.
  6.  $aOperateurs = array( "text" => array(  "EQ" => "@ = '$'",
  7.             "N-EQ" => "@ != '$'",
  8.            "INF" => "@ < '$'",
  9.            "INF-EQ" => "@ <= '$'",
  10.            "SUP" => "@ > '$'",
  11.            "SUP-EQ" => "@ >= '$'",
  12.            "NULL" => "@ IS NULL",
  13.            "N-NULL" => "@ IS NOT NULL" ,
  14.            "BEGIN" => "@ LIKE '$%'",
  15.            "LIKE" => "@ LIKE '%$%'",
  16.            "N-LIKE" => "@ NOT LIKE '%$%'" ),
  17.        "nombre" => array( "EQ" => "@ = $",
  18.            "N-EQ" => "@ != $",
  19.            "INF" => "@ < $",
  20.            "INF-EQ" => "@ <= $",
  21.            "SUP" => "@ > $",
  22.            "SUP-EQ" => "@ >= $",
  23.            "NULL" => "@ IS NULL",
  24.            "N-NULL" => "@ IS NOT NULL" ),
  25.        "date" => array( "EQ" => "TO_CHAR( @, 'YYYYMMDD' ) = '$'",
  26.            "INF-EQ" => "TO_CHAR( @, 'YYYYMMDD' ) <= '$'",
  27.            "SUP" => "TO_CHAR( @, 'YYYYMMDD' ) > '$'",
  28.            "SUP-EQ" => "TO_CHAR( @, 'YYYYMMDD' ) >= '$'" ) );
  29.  // On commence par le tronc
  30.  $query = $this->sql;
  31.  // Flag pour premier critère
  32.  $first = true;
  33.  // Chaque critère est pris en compte s'il est valorisé, c'est à dire si une condition éxiste dessus.
  34.  foreach( $this->aCriteres as $key => $value )
  35.  {
  36.   if( $value['valorise'] )
  37.   {
  38.    // Cas du premier critère
  39.    if( $first )
  40.    {
  41.     $query .= " WHERE ";
  42.     $first = false;
  43.    }
  44.    else
  45.    {
  46.     $query .= " AND ";
  47.    }
  48.    // Récupération de la valeur
  49.    $valeur = $value['valeur'];
  50.    // Si le champ est une date, c'est un objet oDate et non une chaîne.
  51.    if( $value['type'] == "date" )
  52.    {
  53.     // Donc il faut récupérer la valeur chaîne de la date dans le format AAAAMMJJ pour pouvoir faire des comparaisons.
  54.     $valeur = $value['valeur']->toDB();
  55.    }
  56.    // Récupération de la chaîne de comparaison en fonction du type et de l'opérateur.
  57.    if( isset( $aOperateurs[$value['type']][$value['operateur']] ) )
  58.    {
  59.     // On remplace l'@' par le nom du champ dans la chaîne de comparaison  
  60.     $comparaison = str_replace( "@", $key, $aOperateurs[$value['type']][$value['operateur']] );
  61.     // On remplace le '$' par la valeur du champ dans la chaîne de comparaison  
  62.     $comparaison = str_replace( "$", $valeur, $comparaison );
  63.    }
  64.    else
  65.    {
  66.     message( "ERR_CNTX_OPER", array( "champ"=>$key, "type"=>$value['type'], "operateur"=>$value['operateur'] ) );
  67.     return false;
  68.    }
  69.    $query .= $comparaison;
  70.   }
  71.  }
  72.  // Flag pour premier ordre de tri
  73.  $first = true;
  74.  // On tri le tableau des tris dans l'ordre des 'ordre'. (Trop fort ! ! !)
  75.  array_multisort( $this->aTris, SORT_ASC );
  76.  // Chaque tri est pris en compte s'il est utilisé, c'est à dire si son ordre est > 0.
  77.  foreach( $this->aTris as $key => $value )
  78.  {
  79.   if( $value['ordre'] > 0 )
  80.   {
  81.    // Cas du premier critère
  82.    if( $first )
  83.    {
  84.     $query .= " ORDER BY ";
  85.     $first = false;
  86.    }
  87.    else
  88.    {
  89.     $query .= ", ";
  90.    }
  91.    $query .= "$key {$value['sens']}";
  92.   }
  93.  }
  94.  return $query;
  95. }


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 04-02-2003 à 23:35:24    

Mara's dad  
je suis un peu curieux, ms ne m'en veux pas, je suis pas tres bon en PHP je connais assez bien la POO avec le C++
 
tu parles de methoses, ms la tu n'as pas encore construits ta classe, si je me trompes pas ???
 
et en 3 mots ce morceaux que te permet t'il ??? esplique moi avec un exemple pour que ce soit plus facile à m'expliquer ...

Reply

Marsh Posté le 05-02-2003 à 01:41:02    

C'est une méthode isolée, sortie de son contexte...
 
Justement, la classe en question (qu'on ne voit pas dans ce court extrait) sert à stocker le contexte d'une page.
 
Dans ce contexte, on trouve des requetes SQL qui sont composées d'un corp (select blabla...from...), de critères (les clauses du where, et d'ordres de tri pour l'ORDRE BY.
 
Certain critères peuvent être modifiés par l'utilisateur pour affiner sa recherche, certains sont obligatoires, d'autres non...
Pareil pour les ordres de tri.
 
La méthode présentée permet de reconstruire les requêtes à partir des élements de description (corp, critères, tris) et des données du contexte stocké en session. ( Les données viennent d'un formulaire. Elles sont controlées avant d'être stockées en cession dans des contextes )
 
Sur le formualire présenté à l'utilisateur, il y a une liste des champs sur lesquels il peux faire des sélections et ou des tris.
En fonction du type de donnée de chaque champ, les opérateurs de comparaisons possibles sont présentés dans des listes déroulantes. Le tableau $aOperateurs sert à constituer les partie des clauses where en fonction des types de champs et de l'opérateur choisi.
 
Ce bout de code n'est qu'une infime partie d'un moteur qui génère des pages à partir d'une description XML des objets à afficher (champ, liste, sélecteur de donnée, images, textes...).
Les données sont lue (en XML) à partir de bases Oracle ou PostgreSql et fusionnées avec des XSL pour générer au choix des pages web ou des éditions PDF.
 
Tout çà pour montrer que la génération de requête dynamiques n'impose pas de mettre des "where 1" à tout bout de champs, même sur un projet important illustré par le bout de code :

Code :
  1. // Cas du premier critère  
  2. if( $first )
  3. {
  4.    $query .= " WHERE ";
  5.    $first = false;
  6. }
  7. else
  8. {
  9.    $query .= " AND ";
  10. }


 
En fait, on a le même problème pour la clause 'ORDER BY'
 
Comment fait Hao pour mettre un 'ORDRE BY' par défaut s'il en  propose qui sont facultatifs ?
Surtout qu'il peut aussi être intéressant de laisser l'itilisateur choisir l'odre d'application des ordres de tri :D  
 

Code :
  1. // On tri le tableau des tris dans l'ordre des 'ordre'. (Trop fort ! ! !)  
  2. array_multisort( $this->aTris, SORT_ASC );


 
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Sujets relatifs:

Leave a Replay

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