Moteur de recherche qui ne fonctionne pas

Eléphanteau du PHP | 25 Messages

27 nov. 2006, 12:53

bonjour,
voici le code que j'ai, qui ne fonctionne pas (résultats affichés illogiques/enregistrements de la table):
// RECUPERATION DES VARIABLES ENVOYEES PAR LE FORMULAIRE DE LA PAGE index01.PHP 
$categorie_loc=$_POST["categorie_loc"];
$capacite_loc=$_POST["capacite_loc"];
$dept_loc=$_POST["dept_loc"];
// CONNEXION AU SERVEUR ET SELECTION DE LA BASE
include ("../includes/fonctions/connexion.php");
//ECRITURE DE LA REQUETE DE RECHERCHE EN FONCTION DES CRITERES CHOISIS
if (!empty($dept_loc))
		{
		$requete_recherche="SELECT 	
		num_loc
 		FROM locations WHERE dept_loc='$dept_loc' ";
		}
	
if (!empty($categorie_loc))
		{
		$requete_recherche="SELECT 
                                num_loc	
                                FROM locations WHERE             categorie_loc='$categorie_loc' ";
		}
		
if (!empty($capacite_loc))
		{
		$requete_recherche="SELECT 	
		num_loc,
 		FROM locations WHERE 
                                capacite_loc='$capacite_loc'";
		}	
if (!empty($dept_loc)&&!empty($categorie_loc))
		{
		$requete_recherche="SELECT 	
		num_loc
 		FROM locations WHERE dept_loc='$dept_loc' AND categorie_loc='$categorie_loc' ";
		}
if (!empty($dept_loc)&&!empty($capacite_loc))
		{
		$requete_recherche="SELECT 	
		num_loc
 		FROM locations WHERE dept_loc='$dept_loc' AND capacite_loc='$capacite_loc' ";
		}

if (!empty($categorie_loc)&&!empty($capacite_loc))
		{
		$requete_recherche="SELECT 	
		num_loc
 		FROM locations WHERE categorie_loc='$categorie_loc' AND capacite_loc='$capacite_loc' ";
		}
if (!empty($dept_loc)&& !empty($capacite_loc)&& !empty($categorie_loc))
		{
		$requete_recherche="SELECT 	
		num_loc
 		FROM locations WHERE dept_loc='$dept_loc' AND capacite_loc='$capacite_loc' AND categorie_loc='$categorie_loc' ";
		}
//EXECUTION DE LA REQUETE
$resultat_recherche=mysql_query($requete_recherche);
if($resultat_recherche)
{ //début de if
    while ($donnees=mysql_fetch_array($resultat_recherche))
    { //début de while
 	 $num_loc=$donnees['num_loc'];

                 if ($num_loc=='100')
                {$num="bravo";}

	echo "$num";

    } //fin de while
}//fin de if
  
else
{//début de else
echo "aucune lrésultat ne correspond à vos critères de recherche!";
}//fin de else

// FERMER LA BASE DE DONNEES
mysql_close();

?>

si qqun peut m'aider...merci d'avance

Mammouth du PHP | 1776 Messages

27 nov. 2006, 13:03

Ton titre en majuscule est assez "agressif" : MOTEUR DE RECHERCHE QUI NE FONCTIONNE PAS. Ca ne pouvait pas être en minuscules ?
Sinon, pour ton soucis, il faut connaitre tes tables, et savoir ce que tu souhaites ! Si tes résultats sont illogiques, ta prog est illogique de base et logique face aux résultats :wink:
Maintenant, avant toute chose, décris ce que tu veux faire et corrige ton code. Quand je vois ça
 echo "$num"; 
je bondis ! (sans compter les variable imbriquées en texte dans tes requêtes...)

note: dans ton fonctionnement, ta requête est trop complexe...enfin, pas complexe, mais ton mode de construciton et tordu...
Commence par prendre exemple ici => http://www.phpfrance.com/forums/voir_sujet-24716.php

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 nov. 2006, 13:07

Affiche donc ta requête avant de l'exécuter (ne serait-ce que pour vérifier ce qu'elle contient, peut être cela ne correspond pas à ce que tu attends d'après les paramètres passés)

Tu peux ainsi également la jouer dans mysql pour vérifier les résultats qu'elle te renvoi :)

Affiche également un petit quelque chose dans ta plétore de if(), tu verras qu'il passe dans beaucoup d'entre eux inutilement, et comme la requête est écrasée à chaque fois, seul le dernier if() contiendra la bonne requête.

Pourquoi ne pas simplement construire ta requête dynamiquement ?
$sqlCond = array();
$sql = "SELECT ... FROM ... "; // début de la requête
if(!empty($crit1)) // critère 1 non vide
  $sqlCond[] = "crit1 = $crit1";
if(!empty($crit2)) // critère 2 non vide
  $sqlCond[] = "crit2 = $crit2";
...
if(count($sqlCond)>0) // s'il ya des critères non vide, les sépares par un AND et complète la requête.
  $sql.= " WHERE " . implode(" AND ", $sqlCond);
Y a d'autre façon de faire bien entendu :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

27 nov. 2006, 13:36

Au sujet des majuscules ;)

Imagine que tu rentres dans un bureau avec des gens qui peuvent t'aider, tu t'approches et tu hurles ... Les gens risquent de t'envoyer bouler et de passer à autre choses.
Sur un forum, les majuscules, c'est hurler ...

De plus, quand tu écris en Majuscule, un humain met en moyenne 33% de plus pour te lire car toutes les lettre ont la même taille ;)

Je te conseille donc, même dans tes commentaires, de préférer les minusules au majuscules

PS : au fait, j'ai modifié ton titre ;)
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

Eléphanteau du PHP | 25 Messages

27 nov. 2006, 16:46

merci Ryle pour tes explications avec lesquelles je vais bosser.
excusez moi pour les majuscules, la touche ctrl était enfoncée :oops:

Mammouth du PHP | 1776 Messages

27 nov. 2006, 16:48

J'ai la vague impression que l'on passe quelque fois au dessus de mes réponses. Quelqu'un voit mes messages ??

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 nov. 2006, 17:07

HS : Ca vient de ma machine où bien vous aussi vous entendez ce bruit de fond assez étrange qui semble se déclencher sur certains topics ? ;) :langue:
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 1776 Messages

27 nov. 2006, 17:09

zgsqfhesheaELDFHYJFGUYVGOLVELJHVLHVljvhylyv
Ryle, j'ai bondis !
Ne trouve-tu pas que
$sqlCond = array(); 
$sql = "SELECT ... FROM ... "; // début de la requête 
if(!empty($crit1)) // critère 1 non vide 
  $sqlCond[] = "crit1 = $crit1"; 
if(!empty($crit2)) // critère 2 non vide 
  $sqlCond[] = "crit2 = $crit2"; 
... 
if(count($sqlCond)>0) // s'il ya des critères non vide, les sépares par un AND et complète la requête. 
  $sql.= " WHERE " . implode(" AND ", $sqlCond);
ce n'est pas top à lui proposer ?
Qu'il vaut mieux
$sqlCond = array(); 
$sql = "SELECT ... FROM ... "; // début de la requête 
if(!empty($crit1)) // critère 1 non vide 
  $sqlCond[] = "crit1 = '".$crit1."'"; 
if(!empty($crit2)) // critère 2 non vide 
  $sqlCond[] = "crit2 = '".$crit2."'"; 
... 
if(count($sqlCond)>0) // s'il ya des critères non vide, les sépares par un AND et complète la requête. 
  $sql.= " WHERE " . implode(" AND ", $sqlCond);

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 nov. 2006, 17:29

Hs : Et ben voilà, qu'est ce que je vous disais, ca recommence !! ;)

Bon ceci dit, c'est sur que c'est clairement mieux de sortir les variables :) (c'est nottament plus lisible)

Et ça peut également être mieux aussi avec les apostrophes s'il s'agit de chaines ou de dates comme c'est probablement le cas, mais pas s'il s'agit de nombres : MySQL les tolères et fait lui même la conversion quand il réalise que le type ne correspond pas (et je suis sur qu'en secret il jure à l'encontre du développeur ;)), mais ce n'est pas parce qu'il rattrappe ces erreurs, qu'il faut les commettre :)

Hs : Damned, je me suis fait eu par cette petite voix dans ma tête, j'ai craqué et lui ai répondu !! ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 25 Messages

28 nov. 2006, 10:08

bonjour et merci pour vos réponses. j'ai essayé les 2 solutions, mais il ne trouve aucun résultat (alors qu'il y en a !), voici le code:
// RECUPERATION DES VARIABLES 
$categorie_loc=$_POST["categorie_loc"];
$capacite_loc=$_POST["capacite_loc"];
$dept_loc=$_POST["dept_loc"];
// CONNEXION AU SERVEUR ET SELECTION DE LA BASE
include ("../includes/fonctions/connexion.php");

$sqlcond=array();
$sql="SELECT num_loc FROM locations";

if (!empty($dept_loc))
{
$sqlcond[]="dept_loc='".$dept_loc."'";
}
if (!empty($categorie_loc))
{
$sqlcond[]="categorie_loc='".$categorie_loc."'";
}
if (!empty($capacite_loc))
{
$sqlcond[]="capacite_loc='".$capacite_loc."'";
}

	if (count($sqlcond)>0)
	{
	$sql.=" WHERE ". implode(" AND ", $sqlcond);
	}

//EXECUTION DE LA REQUETE 
$resultat_recherche=mysql_query($requete_recherche); 
if($resultat_recherche) 
{ //début de if 
    while ($donnees=mysql_fetch_array($resultat_recherche)) 
    { //début de while 
      $num_loc=$donnees['num_loc']; 

                 if ($num_loc=='100') 
                {$num="bravo";} 

    echo "$num"; 

    } //fin de while 
}//fin de if 
   
else 
{//début de else 
echo "aucune résultat ne correspond à vos critères de recherche!"; 
}//fin de else 

// FERMER LA BASE DE DONNEES 
mysql_close(); 

?> 

encore merci pour voter aide
	

Mammouth du PHP | 1776 Messages

28 nov. 2006, 10:22

// RECUPERATION DES VARIABLES  
$categorie_loc=$_POST["categorie_loc"]; 
$capacite_loc=$_POST["capacite_loc"]; 
$dept_loc=$_POST["dept_loc"]; 
// CONNEXION AU SERVEUR ET SELECTION DE LA BASE 
include ("../includes/fonctions/connexion.php"); 

$sqlcond=array(); 
$sql="SELECT num_loc FROM locations"; 

if (!empty($dept_loc)) 
{ 
$sqlcond[]="dept_loc='".$dept_loc."'"; 
} 
if (!empty($categorie_loc)) 
{ 
$sqlcond[]="categorie_loc='".$categorie_loc."'"; 
} 
if (!empty($capacite_loc)) 
{ 
$sqlcond[]="capacite_loc='".$capacite_loc."'"; 
} 

    if (count($sqlcond)>0) 
    { 
    $sql.=" WHERE ". implode(" AND ", $sqlcond); 
    } 

//EXECUTION DE LA REQUETE  
echo $requete_recherche;
$resultat_recherche=mysql_query($requete_recherche);  
if($resultat_recherche)  
{ //début de if  
    while ($donnees=mysql_fetch_array($resultat_recherche))  
    { //début de while  
      $num_loc=$donnees['num_loc'];  

                 if ($num_loc=='100')  
                {$num="bravo";}  

    echo "$num";  

    } //fin de while  
}//fin de if  
    
else  
{//début de else  
echo "aucune résultat ne correspond à vos critères de recherche!";  
}//fin de else  

// FERMER LA BASE DE DONNEES  
mysql_close();  

?>
Essaie cela, ça va t'afficher ta requête et je pense que tu comprendras tout de suite ton erreur :wink:

Eléphant du PHP | 152 Messages

28 nov. 2006, 11:07

$resultat_recherche=mysql_query($requete_recherche);
Est ce que c'est normal que ta variable $requete_recherche
n'apparait nulle part ?

Ne devrais-tu pas la remplacer par $sql ?

ViPHP
ViPHP | 3607 Messages

28 nov. 2006, 11:11

il allait le découvrir normalement :wink: (LHDN92 essayait de le faire en tout cas)

Eléphanteau du PHP | 25 Messages

28 nov. 2006, 11:24

merci de m'avoir expliqué comment afficher ma requête. affectivement je sais d'où vient l'erreur maintenant... franzt a raison, j'avais rectifié en mettant $sql.
c'est super sympa de m'aider à progresser en php,
merci, merci beaucoup :P

Mammouth du PHP | 1776 Messages

28 nov. 2006, 12:10

il allait le découvrir normalement :wink: (LHDN92 essayait de le faire en tout cas)
C'est toujours mieux que la personne se rende compte de son erreur elle même car c'est qu'elle a compris et reverifiera ce problème là une fois suivante :wink:
En attirant son attention sur le fait que sa requête était vide, son âme de débuggueur aurait refait surface et avec un peu de curiosité aurait trouvé l'erreur.