requete dynamique

Invité
Invité n'ayant pas de compte PHPfrance

10 mai 2006, 11:04

j'ai regardé sur ce topic mais dans cet exemple les tables sur laquelle la requete ets éfféctuée est toujour la même.

Voici mes requêtes
$sql ="SELECT * 
					FROM office o, office_sub_specialization os, sub_specialization s, specialization sp
					WHERE o.id_office=os.id_office
					AND sp.id_specialization =  s.id_specialization
					AND os.id_sub_specialization=s.id_sub_specialization 
					AND s.id_sub_specialization=".$sub_spec.";";		
					
					
if(isset($_POST['area']) && $_POST['area'] != -1 && $_POST['specialization'] >= 346 ){					
		$sql ="SELECT * 
				FROM office o, office_sub_specialization os, sub_specialization s, office_address oa, area a, specialization sp
				WHERE o.id_office=os.id_office 
				AND sp.id_specialization =  s.id_specialization
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND oa.id_area=a.id_area AND oa.id_office=o.id_office 
				AND s.id_sub_specialization=".$sub_spec." 
				AND a.id_area =".$area." ;";
}	
		
if($_POST['specialization'] >= 346 ){
		$sql ="SELECT * FROM office o, office_sub_specialization os, sub_specialization s, specialization sp
				WHERE o.id_office=os.id_office 
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND s.id_specialization=sp.id_specialization
				AND sp.id_specialization=".$spec;
}			
		
if(isset($_POST['area']) || $_POST['area'] != -1){					
		$sql ="SELECT * 
				FROM office o, office_sub_specialization os, sub_specialization s, office_address oa, area a, specialization sp
				WHERE o.id_office=os.id_office 
				AND sp.id_specialization =  s.id_specialization
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND oa.id_area=a.id_area AND oa.id_office=o.id_office 
				AND s.id_sub_specialization=".$sub_spec." 
				AND a.id_area =".$area." ;";
}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 mai 2006, 11:05

Quel topic ? Quel est la question ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

10 mai 2006, 11:05


Invité
Invité n'ayant pas de compte PHPfrance

10 mai 2006, 11:07

et bien réaliser le meme type d'opération mais avec des requetes portant sur tables différentes

Eléphanteau du PHP | 20 Messages

10 mai 2006, 11:35

bon je continue

dans les exemples que j'ai trouvés les requetes ne portent toutes que sur la même table:
$sub_spec = (isset($_POST["sub_specialization"])  && $_POST["sub_specialization"] != "tout") ? $_POST["sub_specialization"] : "";
$spec   = (isset($_POST["specialization"])) ? $_POST["specialization"]  : "";
$area  = (isset($_POST["area"])) ? $_POST["area"] : "";


			$requete= "SELECT * FROM la table WHERE 1=1 ";
			
			if (!empty($sub_spec))
					$requete .= " AND id_sub_specialization = '".$sub_spec."' ";
			
			if (!empty($spec))
					$requete .= " AND id_specialization = '".$spec."' ";
					
			if (!empty($area))
					$requete .= " AND id_area = '".$area."' ";
mais mes requetes sont sur plusieurs table comme ici:
$sql ="SELECT * 
					FROM office o, office_sub_specialization os, sub_specialization s, specialization sp
					WHERE o.id_office=os.id_office
					AND sp.id_specialization =  s.id_specialization
					AND os.id_sub_specialization=s.id_sub_specialization 
					AND s.id_sub_specialization=".$sub_spec.";";		
					
					
if(isset($_POST['area']) && $_POST['area'] != -1 && $_POST['specialization'] >= 346 ){					
		$sql ="SELECT * 
				FROM office o, office_sub_specialization os, sub_specialization s, office_address oa, area a, specialization sp
				WHERE o.id_office=os.id_office 
				AND sp.id_specialization =  s.id_specialization
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND oa.id_area=a.id_area AND oa.id_office=o.id_office 
				AND s.id_sub_specialization=".$sub_spec." 
				AND a.id_area =".$area." ;";
}	
		
if($_POST['specialization'] >= 346 ){
		$sql ="SELECT * FROM office o, office_sub_specialization os, sub_specialization s, specialization sp
				WHERE o.id_office=os.id_office 
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND s.id_specialization=sp.id_specialization
				AND sp.id_specialization=".$spec;
}			
		
if(isset($_POST['area']) || $_POST['area'] != -1){					
		$sql ="SELECT * 
				FROM office o, office_sub_specialization os, sub_specialization s, office_address oa, area a, specialization sp
				WHERE o.id_office=os.id_office 
				AND sp.id_specialization =  s.id_specialization
				AND os.id_sub_specialization=s.id_sub_specialization 
				AND oa.id_area=a.id_area AND oa.id_office=o.id_office 
				AND s.id_sub_specialization=".$sub_spec." 
				AND a.id_area =".$area." ;";
}
j'aimerais savoir comment je pourrais rendre le choix de mes tables aussi dynamique?

Invité
Invité n'ayant pas de compte PHPfrance

10 mai 2006, 15:29

personne :(

Invité
Invité n'ayant pas de compte PHPfrance

11 mai 2006, 08:56

il y a beaucoups d'expert sur ce forum, j'aimerais juste savoir si je vais dans la bonne direction. Si vous avez une remarque ou l'autre n'hésiter pas.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 mai 2006, 11:26

Je lis bien ton sujet mais j'ai du mal à voir où se situe le problème

Le topic que tu as cité, ce sont juste des petites astuces pour rajouter des conditions dynamiquement, en évitant une multitude de tests redondant.

A priori ça ne change si tes requêtes s'effectuent sur plusieurs tables.

Invité
Invité n'ayant pas de compte PHPfrance

11 mai 2006, 11:51

c'est pourtant simple, dans les exemples que cité on peut voir que c'est la clause WHERE qui est dynamique mais moi dans mon cas j'utilise des jointures et il faudrait que je puisse choisir directement le choix des tables dans le FROM. Il faudrait donc pour mon moteur de recherche en fonction du type de recherche éfféctuée joindre telle ou telle table. Je peux le faire comme je l'ai montré plus haut, oui certe cela fonctionne mais c'est parce que je n'ai que 4 combinaisons de recherche mais j'aimerais le faire de façon plus professionelle, que si maintenant j'avais 100 critères de recherche je puisse le faire sans problème avec la même requete.

Est ce plus claire?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

11 mai 2006, 12:05

Et bien tu peux construire ta requête en plusieurs morceaux, par exemple :
$donnees = "SELECT col1, col2, col3";
$table = "FROM table1";
if ($condition == 'toto') {
   $jointures = " INNER JOIN table2 ON colA = colB";
} else {
   $jointures = " INNER JOIN table3 ON colA = colB";
}

if ($condition == "titi") {
   $filtrage = " WHERE colA = 'TRUC'";
}

$requete = $donnees.$table.$jointures.$filtrage;
Donc déjà ta place je sortirais tes jointures de ton WHERE, en utilisant JOIN, et en ne gardant donc dans le WHERE que ce qui relève du filtrage.

Ce sera a priori plus simple à gérer