Problème d'affichage de résultats dans recherche par 4 listes déroulantes

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème d'affichage de résultats dans recherche par 4 listes déroulantes

par cw75116 » 28 mars 2008, 16:56

Les valeurs passent bien dans l'url :
recherche_choice.php?type=1&etat=&budget=&secteur=&submit=rechercher

Question bête, le print_r je l'intègre où? Je ne connais pas du tout ..
Ca serait sous cette forme ?
if (isset(print_r ($_GET['etat']))) { // si un état est specifié  

Concernant le fait que le contenu de $_GET soit vide, ca ne serait pas parce que chaque liste est chargée par une BDD mais la valeur a afficher est celle dans la table principale mulhouse qui a les valeurs sous formes : budget_id_budget ... ?

par Ryle » 28 mars 2008, 16:10

Le echo te permet justement d'afficher à l'écran la requête qui a été générée et qui est donc exécutée. Puisqu'aucune des conditions n'apparait (ni de WHERE, ni de AND), c'est qu'il n'est entré dans aucun des if(), donc qu'aucun des tests n'est vrai, donc que $_GET['etat'], $_GET['budget'], ... ne sont pas définis...

Est ce que tu passes bien des valeurs dans l'url ? vérifies donc le contenu de $_GET avec un print_r()

par cw75116 » 28 mars 2008, 15:29

Par conte est ce normal que dans mon body j'ai :
SELECT * FROM mulhouse ORDER BY alphabet

Il m'a fait l'echo de ma dernière ligne $query_rsmulhouse ...

Voilà la valeur de la requête qui doit être affichée à l'écran :
<?php 
    echo '<div class="restaurant">' . $donnees['type'] . '</div>';  
	echo '<div class="fiche">'; 
	
    echo '<div class="photo"><a href="' . $donnees['url'] . '"> <img src="restaurants/images/' . $donnees['photo'] . '.jpg" WIDTH=270 HEIGHT=90/></a></div>' ; // PHOTO LIEN	
	
	echo '<div class="typecuisine"><b>' . $donnees['titre'] . '</b></div>';
	echo '<div class="adresse"><i>' . $donnees['adresse'] . '</i></div>';
	echo '<div class="descriptionrestaurant">' ;
	echo substr(''.$donnees['description'].'', 0, 240);
	echo '...<br/></div>';
	
	
	echo '</div>';  



?>
Tu veux en MP l'adresse du site où je publie pour tester ?

par Ryle » 28 mars 2008, 15:20

Tu pouvais le mettre avant le mysql_query(), mais il est très bien là :) Par contre l'intérêt, c'est de nous montrer la valeur de la requête qui doit être affiché à l'écran :)

Pis tant qu'on y est, ajoute également un, print_r($_GET) juste après pour que l'on puisse voir les données reçues en get par le script :)

par cw75116 » 28 mars 2008, 14:59

Dans le script les variables existent bien, elles sont bien affichées avant la requête.
Je met le code complet pour te montrer.
Maintenant j'avais construit ça par Dreamweaver cs3, et je sais que niveau codage ce n'est pas le top, peut être que le problème vient de ma construction ...

Voici le code
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? "'" . doubleval($theValue) . "'" : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

mysql_select_db($database_secure, $secure);
$query_rsetat = "SELECT * FROM etat";
$rsetat = mysql_query($query_rsetat, $secure) or die(mysql_error());
$row_rsetat = mysql_fetch_assoc($rsetat);
$totalRows_rsetat = mysql_num_rows($rsetat);

mysql_select_db($database_secure, $secure);
$query_rstype = "SELECT * FROM type";
$rstype = mysql_query($query_rstype, $secure) or die(mysql_error());
$row_rstype = mysql_fetch_assoc($rstype);
$totalRows_rstype = mysql_num_rows($rstype);

mysql_select_db($database_secure, $secure);
$query_rsbudget = "SELECT * FROM budget";
$rsbudget = mysql_query($query_rsbudget, $secure) or die(mysql_error());
$row_rsbudget = mysql_fetch_assoc($rsbudget);
$totalRows_rsbudget = mysql_num_rows($rsbudget);

mysql_select_db($database_secure, $secure);
$query_rssecteur = "SELECT * FROM secteur";
$rssecteur = mysql_query($query_rssecteur, $secure) or die(mysql_error());
$row_rssecteur = mysql_fetch_assoc($rssecteur);
$totalRows_rssecteur = mysql_num_rows($rssecteur);

$coletat_rsmulhouse = "0";
if (isset($_GET['etat'])) {
  $coletat_rsmulhouse = $_GET['etat'];
}
$colbudget_rsmulhouse = "0";
if (isset($_GET['budget'])) {
  $colbudget_rsmulhouse = $_GET['budget'];
}
$colsecteur_rsmulhouse = "0";
if (isset($_GET['secteur'])) {
  $colsecteur_rsmulhouse = $_GET['secteur'];
}
$coltype_rsmulhouse = "0";
if (isset($_GET['type'])) {
  $coltype_rsmulhouse = $_GET['type'];
}

mysql_select_db($database_secure, $secure);

$isWhere=false;
$query_rsmulhouse = "SELECT * FROM mulhouse" ;  
   
if (isset($_GET['etat'])) { // si un état est specifié  

  if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE ";// Alors complete requete avec WHERE  
    $isWhere=true ; // flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
  }  
  else { // Sinon (si le where a déjà été utilisé) 
    $query_rsmulhouse.= " AND ";// complete requete avec AND 
  } 

  $query_rsmulhouse.= " etat_id_etat = ".GetSQLValueString($coletat_rsmulhouse, "text") ; // complete requete avec la condition  

} 

if (isset($_GET['budget'])) { // si un état est specifié  

  if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE ";// Alors complete requete avec WHERE  
    $isWhere=true ;// flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
  }  
  else { // Sinon (si le where a déjà été utilisé) 
    $query_rsmulhouse.= " AND ";// complete requete avec AND 
  } 

  $query_rsmulhouse.= " budget_id_budget = ".GetSQLValueString($colbudget_rsmulhouse, "text") ; // complete requete avec la condition  

} 

if (isset($_GET['secteur'])) { // si un état est specifié  

  if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE ";// Alors complete requete avec WHERE  
    $isWhere=true ;// flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
  }  
  else { // Sinon (si le where a déjà été utilisé) 
    $query_rsmulhouse.= " AND ";// complete requete avec AND 
  } 

  $query_rsmulhouse.= " secteur_id_secteur = ".GetSQLValueString($colsecteur_rsmulhouse, "text") ; // complete requete avec la condition  

} 

if (isset($_GET['type'])) { // si un état est specifié  

  if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE ";// Alors complete requete avec WHERE  
    $isWhere=true; // flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
  }  
  else { // Sinon (si le where a déjà été utilisé) 
    $query_rsmulhouse.= " AND ";// complete requete avec AND 
  } 

  $query_rsmulhouse.= " type_id_type = ".GetSQLValueString($coltype_rsmulhouse, "text") ; // complete requete avec la condition  
} 
$query_rsmulhouse.= " ORDER BY alphabet "; 
$rsmulhouse = mysql_query($query_rsmulhouse, $secure) or die(mysql_error());
$row_rsmulhouse = mysql_fetch_assoc($rsmulhouse);
$totalRows_rsmulhouse = mysql_num_rows($rsmulhouse);
echo $query_rsmulhouse; 

?>
Concernant l'echo, je ne sais pas si je l'ai bien intégrée ?

S'il le faut je vais reprendre la construction manuelle des 4 listes déroulantes sans utiliser les possibilités de DW ..

par Ryle » 28 mars 2008, 13:00

Seul la table principale nous interesse ici. C'est elle que nous interrogeons :)
Affiche la requête SQL que tu as généré avant de l'exécuter.
Ca veut dire quoi ? (desolé je suis vraiment débutant ...)
Tout simplement faire un :
echo $query_rsmulhouse;
une fois que ta requête est construite...

A mon avis, la requête est bien construite, mais les valeurs de tes chaines sont vides et c'est pour cela qu'il ne trouve aucun résultat. En l'affichant, tu verras tout de suite si c'est bien cela :)

La question est alors de savoir pourqoi est-ce qu'elles sont vides ? Il faut donc regarder ce qu'on met dedans. Prenons la première : GetSQLValueString($coletat_rsmulhouse, "text")
Tu demandes a php de formater la variable $coletat_rsmulhouse pour pouvoir l'utiliser comme une chaine de type "text" dans une requête SQL. Ne remettons pas en doute le travail de GetSQLValueString() dans un premier temps, et interrogeons nous sur la valeur de $coletat_rsmulhouse.

Cette variable existe-t-elle dans ce script ?
Il me semblait avoir vu passer un
$coletat_rsmulhouse = "0"; 
if (isset($_GET['etat'])) { 
  $coletat_rsmulhouse = $_GET['etat']; 
} 
dans ton code, qui aurait pu la définir, mais était-ce bien dans la même page ? si ce n'est pas le cas, c'est sans doute ce qui te manque. Si ce code est bien présent, peut être est il appelé après la construction de la requête alors que tu en aurais besoin avant ? :)

par cw75116 » 28 mars 2008, 12:52

En effet ca n'a pas de jambe ;)

Le problème est que cela ne s'affiche pas quand l'on sélectionne que l'un ou l'autre. Je viens de remarquer aussi que quand je choisis tous les 4 critères comme ils sont dans la BDD cela ne s'affiche plus non plus ...

J'ai donc 5 BDD : 4 pour les listes déroulantes, et 1 qui contient toutes les données.

La table secteur (les 4 sont de structure et contenu identique)

`id_secteur` int(5) NOT NULL default '0',
`secteur` varchar(250) NOT NULL default ''
TYPE=MyISAM;

Contenu de la table `secteur`

INSERT INTO `secteur` VALUES (0, 'Zone géographique ...');
INSERT INTO `secteur` VALUES (1, 'Centre Ville');
INSERT INTO `secteur` VALUES (2, 'Sud');
INSERT INTO `secteur` VALUES (3, 'Nord');
INSERT INTO `secteur` VALUES (4, 'Est');
INSERT INTO `secteur` VALUES (5, 'Ouest');
INSERT INTO `secteur` VALUES (6, 'Alentours');
INSERT INTO `secteur` VALUES (7, 'Alentours 2');


La table principale

structure
`id` int(4) NOT NULL auto_increment,
`budget_id_budget` int(5) NOT NULL default '0',
`etat_id_etat` int(5) NOT NULL default '0',
`secteur_id_secteur` int(5) NOT NULL default '0',
`type_id_type` int(5) NOT NULL default '0',
......
Contenu

INSERT INTO`mulhouse` VALUES (10, 1, 1, 1, 1, .....)
INSERT INTO`mulhouse` VALUES (11, 2, 5, 3, 4, .....)
INSERT INTO`mulhouse` VALUES (12, 3, 1, 4, 5, .....)
INSERT INTO`mulhouse` VALUES (13, 4, 4, 2, 1, .....)


A chaque fois je fais des essais sur le serveur quand je modifie le code.
Affiche la requête SQL que tu as généré avant de l'exécuter.
Ca veut dire quoi ? (desolé je suis vraiment débutant ...)


En tout cas un très grand merci pour ton aide

par Ryle » 28 mars 2008, 12:29

Alors c'était bien essayé, mais "Ca ne marche pas" c'est pas du jargon technique, contrairement à "boulette". Déjà, ça n'a pas de jambes, donc au mieux ça peut ne pas fonctionner, mais dans ce cas il y a :
- un résultat obtenu
- un résultat attendu
- un éventuel message d'erreur

Et là c'est technique ;)

Affiche la requête SQL que tu as généré avant de l'exécuter. Vérifies qu'elle est bien construites et que les valeurs sont bien renseignées (pis montre là nous tant qu'on y est). Essaye également de la jouer dans MySQL pour voir si elle retourne les résultats attendus :)

par cw75116 » 28 mars 2008, 11:52

La fermeture de la php ?> ?
Parce que chez moi c'est fermé ca à la fin j'ai :
<?php  ....
$query_rsmulhouse.= " ORDER BY alphabet ";

  
$rsmulhouse = mysql_query($query_rsmulhouse, $secure) or die(mysql_error());
$row_rsmulhouse = mysql_fetch_assoc($rsmulhouse);
$totalRows_rsmulhouse = mysql_num_rows($rsmulhouse);

?>
Non non pardon, je suis bête !!!! Biensur c'est les ";"
Niveau boulette j'en ai faite une grosse avec ce post !


[edit]


J'ai donc ajouté les ";" je n'ai plus d'erreurs, mais cela ne marche pas quand l'on choisit que l'un ou l'autre ...

Je mets le code complet, j'ai peut être mis trop? de ";" mais si je ne les mettait pas partout j'avais des erreurs avec les {}

mysql_select_db($database_secure, $secure);

$isWhere=false;
$query_rsmulhouse = "SELECT * FROM mulhouse" ;  
   
if (isset($_GET['etat'])) { // si un état est specifié  

  if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE ";// Alors complete requete avec WHERE  
    $isWhere=true ; // flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
  }  
  else { // Sinon (si le where a déjà été utilisé) 
    $query_rsmulhouse.= " AND ";// complete requete avec AND 
  } 

  $query_rsmulhouse.= " etat_id_etat = ".GetSQLValueString($coletat_rsmulhouse, "text") ; // complete requete avec la condition  

} 

if (isset($_GET['budget'])) { // si un état est specifié  

  if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE ";// Alors complete requete avec WHERE  
    $isWhere=true ;// flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
  }  
  else { // Sinon (si le where a déjà été utilisé) 
    $query_rsmulhouse.= " AND ";// complete requete avec AND 
  } 

  $query_rsmulhouse.= " budget_id_budget = ".GetSQLValueString($colbudget_rsmulhouse, "text") ; // complete requete avec la condition  

} 

if (isset($_GET['secteur'])) { // si un état est specifié  

  if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE ";// Alors complete requete avec WHERE  
    $isWhere=true ;// flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
  }  
  else { // Sinon (si le where a déjà été utilisé) 
    $query_rsmulhouse.= " AND ";// complete requete avec AND 
  } 

  $query_rsmulhouse.= " secteur_id_secteur = ".GetSQLValueString($colsecteur_rsmulhouse, "text") ; // complete requete avec la condition  

} 

if (isset($_GET['type'])) { // si un état est specifié  

  if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE ";// Alors complete requete avec WHERE  
    $isWhere=true; // flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
  }  
  else { // Sinon (si le where a déjà été utilisé) 
    $query_rsmulhouse.= " AND ";// complete requete avec AND 
  } 

  $query_rsmulhouse.= " type_id_type = ".GetSQLValueString($coltype_rsmulhouse, "text") ; // complete requete avec la condition  

} 

$query_rsmulhouse.= " ORDER BY alphabet ";

  
$rsmulhouse = mysql_query($query_rsmulhouse, $secure) or die(mysql_error());
$row_rsmulhouse = mysql_fetch_assoc($rsmulhouse);
$totalRows_rsmulhouse = mysql_num_rows($rsmulhouse);

par Ryle » 28 mars 2008, 11:44

Hum... tu viens effectivement de découvrir ce que l'on appel communément dans le jargon technique de php (mais également d'autres langage, c'est ça qu'est beau dans l'informatique, c'est universel) une..... boulette ! ;)

En effet, qu'est ce qu'on met à la fin des lignes de codes en php pour séparer les instructions et que j'ai lamentablement oublié sur ces deux lignes, provoquant inévitablement une erreur de syntaxe pour ce pauvre php ? ;)

par cw75116 » 28 mars 2008, 11:40

merci merci merciiiii
:priere: Tu me sauves ..

Par contre j'ai un petit problème
if ($isWhere==false) { // Si flag est faux  
    $query_rsmulhouse.= " WHERE "// Alors complete requete avec WHERE  
    $isWhere=true // flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where) 
J'ai le message d'erreur : Parse error: syntax error, unexpected T_VARIABLE in .... qui correspond à
$isWhere=true
J'ai donc essayé :
$isWhere.=true
et
$isWhere==true
mais le message d'erreur est toujours présent.

Je me suis dit "et pourquoi pas définir la variable
$isWhere=true;
Mais forcément c'est faux ....

Faudrait il que je change les "false" et "true" en 0 et >0 ?

par Ryle » 28 mars 2008, 11:22

Une instruction de type if(), ou même une boucle while(), for(), etc. porte uniquement sur l'instruction qui la suit immédiatement. Quand il n'y en a qu'une, pas de problème, mais lorsque c'est un bloc d'instructions qui est concerné, tu utilises les accolades :
if (isset($_GET['etat'])) // pour une seule instruction, les accolades ne sont pas nécessaire
  $coletat_rsmulhouse = $_GET['etat']; 

while ($row_rssecteur = mysql_fetch_assoc($rssecteur)) { // en revanche elles le sont pour un bloc d'instructions
  instruction1;
  instruction2;
  ...
}
M'enfin rien ne t'empêche d'en mettre à chaque fois, certains trouvent cela plus lisible, personnellement l'indentation me suffit :)

Par ailleurs, la commande elseif correspond à un SINON/SI et attends donc une seconde condition à tester.
if ($a) // SI $a est vrai
  ...
elseif ($b) // SINON ($a n'est pas vrai MAIS) SI $b est vrai
  ...
else // SINON (tous les cas précédent se sont avérés faux)
  ...
Dans ton cas, un simple else suffit puisque l'on veut juste tester si $isWhere est vrai ou pas :)

Enfin, l'opérateur de comparaison est "==". Si tu fais un "if ($isWhere=false;)" alors tu affectes la valeur false à ta variable avant de la tester, et donc le résultat sera toujours false :)

Ah et pis encore un détail, pour compléter une chaine en concaténant plusieurs élément à la suite, il te faut utiliser l'opérateur ".=", une fois encore si tu n'utilise que le "=" tu affectes la nouvelle valeur et écrase la précédente au lieu de la compléter :)
$isWhere=false; 
$query_rsmulhouse = "SELECT * FROM mulhouse" ; 
  
if (isset($_GET['etat'])) { // si un état est specifié 

  if ($isWhere==false) { // Si flag est faux 
    $query_rsmulhouse.= " WHERE "// Alors complete requete avec WHERE 
    $isWhere=true // flag en true (pour indiquer aux autres conditions qu'on a déjà utilisé le where)
  } 
  else { // Sinon (si le where a déjà été utilisé)
    $query_rsmulhouse.= " AND "// complete requete avec AND
  }

  $query_rsmulhouse.= " etat_id_etat = ".GetSQLValueString($coletat_rsmulhouse, "text") ; // complete requete avec la condition 

}

.... // tu recommances avec le secteur, le budget, etc.

$query_rsmulhouse.= " ORDER BY ... "; // ajoute la condition de tri à la fin 

par cw75116 » 28 mars 2008, 10:34

Merci pour ces détails :)

Alors j'ai essayé pour la première liste, mais j'ai de gros problème de structure, avec les {} et les () et au niveau des ;

Voilà le code :

mysql_select_db($database_bdd, $bdd);

$isWhere=false;
$query_rsmulhouse = "SELECT * FROM mulhouse" ;
 
 if (isset($_GET['etat'])) // si un secteur est specifié
 	$query_rsmulhouse = // Alors
 		{	if ($isWhere=false;) // Si flag est faux
 			 $query_rsmulhouse = // Alors
			 "WHERE etat_id_etat = "; // complete requete avec WHERE
			 $isWhere=true // flag en true
 			}
  	elseif {
	 $query_rsmulhouse = // Alors
			  " WHERE etat_id_etat = ".GetSQLValueString($coletat_rsmulhouse, "text") ; // complete requete avec WHERE
	}

par Ryle » 28 mars 2008, 09:41

T'es pas loin non, mais il ne faut pas "ignorer" la variable si elle est fausse. En effet, le fait qu'elle soit faut t'informe que le WHERE n'a pas encore été utilisé et qu'il te faut donc le mettre si tu ajoutes une condition. Sinon c'est un AND qu'il te faut :

Code : Tout sélectionner

SI un secteur a été spécifié ALORS SI ton flag est à faux ALORS complete la requête en ajoutant un WHERE et modifie le flag pour le mettre à vrai SINON complete la requête en ajoutant un AND puis complete la requête en ajoutant le filtre sur le secteur SI un budget a été spécifié ALORS SI ton flag est à faux ALORS complete la requête en ajoutant un WHERE et modifie le flag pour le mettre à vrai SINON complete la requête en ajoutant un AND puis complete la requête en ajoutant un filtre sur le budget ...

par cw75116 » 27 mars 2008, 19:44

Merci pour cette rapidité :)

Alors si je comprends bien (c'est pas gagné!)

1/ Je définie la variable $isWhere=false. Je la met bien au dessus de mon mysql_select_db($database_secure, $secure); ?

2/ Dans chaque if j'intègre cette variable en disant si ma variable est "false" on ignore et passe de suite à la 2, et si ma variable is "true" on la prend en compte et on lui definit Where(ou AND) ... et on passe à la suivante.

Désolé si je pose des questions un peu "bête" mais je suis assez novice ...
Je suis encore loin du résultat ?

Merci d'avance, je m'y replonge