Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/04/2006, 12h05   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 107
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mars 2006
Messages : 107
Points : 13
Points : 13
Par défaut [SQL] Concaténer des requêtes SQL en PHP

Bonjour,

Je suis en train de faire un site et il faut que je gère un formulaire de recherche selon 5 critères. Il faut que je fasse un fichier de requêtes SQL pour chercher les résultats de la recherche mais le problème c'est que si je fais les cas un par un le code va vraiment être lourd et long... Est-ce qu'il est possible de trouver un moyen pour concaténer des bout de requête sql? j'ai essayé mais je n'y arrive pas...
Pourriez-vous m'en donner un exemple?

Merci
brotelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 12h31   #2
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
contenu d'un tableau 2D, on ne connait ni l'echelle X, ni l'Y, ni la val dedans

$typeX = 'heure';
$typeY = 'ordinateur';
$val = 'bug';
$table = 'BUG_ORDI';

$sql = "SELECT ".$typeX." as x, ".$typeY." as y, ".$val." as val
FROM ".$table;

va te retourner ici un tableau du nombre de bug au cours du temps pour chaque ordi.
Un exemple comme un autre..
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 12h41   #3
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
j'ai un formulaire un peu comme toi, 3 champs de type liste avec entrée à sélectionner, et un champ libre mot clef.
J'ai fait une requête du type
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   $sql = 'SELECT blab, alba, bla FROM table '; 
   if (isset($_SESSION['public'])&&($_SESSION['public'])!="#") 
   { 
     $sql .= ' AND  public = "'.$_SESSION['public'].'"'; 
   } 
   if (isset($_SESSION['lieu'])&&($_SESSION['lieu'])!="#") 
   { 
      $sql .= ' AND  lieu = "'.$_SESSION['lieu'].'"'; 
   } 
// là c'est le mot clef-----------------------
   if (isset($_SESSION['mot'])&&($_SESSION['mot'])!="#") 
   { 
   $sql .= ' AND  (accontact LIKE "%'.strtolower($_SESSION['mot']).'%" OR description LIKE "%'.strtolower($_SESSION['mot']).'%" OR  lieu LIKE "%'.strtolower($_SESSION['mot']).'%" OR  dates LIKE "%'.strtolower($_SESSION['mot']).'%" OR  specifique LIKE "%'.strtolower($_SESSION['mot']).'%")';   }
   $sql .=' ORDER BY activite ASC LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;
C'est ca qui te semble trop lourd ? tu as 5 champs libres ? Pourquoi pas un seul avec une seule recherche par motS clef ?
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 13h37   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 107
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mars 2006
Messages : 107
Points : 13
Points : 13
Voilà en fait le commencement de mon code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
require('fonction.inc'); 
// Vérification que les variables du formulaires ne sont pas vides
if(isset($_POST['marque']) && isset($_POST['modele']) && isset($_POST['vo_prix_vente_min']) && isset($_POST['vo_prix_vente_max']) && isset($_POST['energie'])){
$marque = $_POST['marque'];
$modele = $_POST['modele'];
$vo_prix_vente_min = $_POST['vo_prix_vente_min'];
$vo_prix_vente_max = $_POST['vo_prix_vente_max'];
$energie = $_POST['energie'];
//echo($marque.$modele.$vo_prix_vente_min.$vo_prix_vente_max.$energie);
// Vérification que les variables affectées ne sont pas vides
    if(!empty($marque) && !empty($modele) && !empty($vo_prix_vente_min) && !empty($vo_prix_vente_max) && !empty($energie)){
  //tous les véhicules
  if( $marque== '(vide)' && $modele == '(vide)' && $vo_prix_vente_min== '(vide)' &&  $vo_prix_vente_max== '(vide)' && $energie == '(vide)')
  {
   $res= executer_requete("SELECT * FROM vehicule ORDER BY marque ASC");
   $num = mysql_num_rows($res);
  }
  //marque non vide
  if( $marque!= '(vide)' && $modele == '(vide)' && $vo_prix_vente_min== '(vide)' &&  $vo_prix_vente_max== '(vide)' && $energie == '(vide)')
  {
   $res= executer_requete("SELECT * FROM vehicule WHERE marque='$marque' ORDER BY modele ASC");
   $num = mysql_num_rows($res);
  }
Donc j'ai commencé plusieurs cas, j'ai fait le fait que rien n'était saisi, et l'autre qu'il y avait juste la marque de saisi. Si je continue à faire tous les cas, je vais avoir une tonne de code.... Et je vois pas trop comment faire pour alléger
brotelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 14h12   #5
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
Et qqch du genre
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = 'SELECT marque, energie,  bla,  bla,  bal, FROM vehicule WHERE premiere condition; 
// j'ai mis première condition car c'est le code que j'ai employé, et il explique les AND ensuite)
 if (isset($_SESSION['marque'])&&($_SESSION['marque'])!="")  
   { 
     $sql .= ' AND  marque = "'.$_SESSION['marque'].'"'; 
   } 
   if (isset($_SESSION['vo_prix_vente_min'])&&($_SESSION['vo_prix_vente_min'])!="")    { 
      $sql .= ' AND  ventemini = "'.$_SESSION['vo_prix_vente_min'].'"'; 
   } 
  if (isset($_SESSION['energie'])&&($_SESSION['energie'])!="")       { 
      $sql .= ' AND  energie = "'.$_SESSION['energie'].'"'; 
   } 
$sql .=' ORDER BY activite' ;
 // on exécute la requête
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
et tu répètes if () {sql . } pour chaque critère. Comme ça on regarde à chaque fois si la variable est définie (!="") et si c'est le cas on la prend en compte.

au passage, si après tu veux faire un affichage page par page des résultats, je te conseille de tout passer en variables de session.
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 14h38   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 107
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mars 2006
Messages : 107
Points : 13
Points : 13
Bon je suis en train de m'embrouiller complet... C'est quoi "première condition"? Et ensuite, là tu rentres direct "SELECT blabla WHERE" mais si ya pas de condition après, ça va planter parce qu'il ne devrait pas y avoir de where. Et si la première condition n'est pas bonne, les autres vont commencer par AND, donc ça va faire "WHERE AND", lol... Je comprends plus rien...
Oui par contre je vais vouloir afficher pages par pages mais je sais pas comment on fait et ni pourquoi il faut mettre $_SESSION...
brotelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 14h55   #7
Membre chevronné
 
Inscription : juillet 2003
Messages : 625
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 625
Points : 600
Points : 600
pour ta premiere condition tu peux eventuellement mettre une condition vraie qui rendrait la presence du where persistante genre :

__________________
Le savoir est utile que s'il est partagé par tous.
/(bb|[^b]{2})/
!sleep() ? array((string))
syl2095 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 15h07   #8
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
je t'ai copié mon script dans lequel j'ai effectivement une première condition avec "WHERE" qui fait que j'ai des "And" ensuite.

Le principe est d'ajouter à chaque fois un morceau de requête (sql .) Chaque nouveau morceau reprend un des champs du formulaire et vérifie si il a été rempli (!="") et si c'est le cas l'ajoute aux conditions à chercher.

POur les variables de sessions,
1. tu ouvres une session (ca aide... : )
Code :
1
2
<?php
session_start ();?>
2 tu définis que $_SESSION = $_POST :par exemple
Code :
 $_SESSION['lieu'] = $_POST['lieu'] ;
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 15h23   #9
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 107
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : mars 2006
Messages : 107
Points : 13
Points : 13
Merci, j'ai mis 1 à la suite du WHERE et ça a marché. Maintenant il faut que j'affiche les résultats page par page et je ne sais pas du tout commment faire... Pourquoi il faut que je mette des variables de session?
brotelle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2006, 19h53   #10
Membre régulier
 
Avatar de carelha
 
Inscription : mars 2006
Messages : 168
Détails du profil
Informations personnelles :
Localisation : France, Yvelines (Île de France)

Informations forums :
Inscription : mars 2006
Messages : 168
Points : 74
Points : 74
si tu ne fais pas ca, les résultats seront affichés pour la page 1 mais aprés les variables seront "oubliées". C'est rageant. Enfin, c'est ce qui vient de m'arriver et c'est la solution qu'on m'a proposée sur ce forum, et ca fonctionne.
carelha est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h41.


 
 
 
 
Partenaires

Hébergement Web