Forum Clubic

Problème de formulaire et de requête de sélection - [PHP/MySQL]

Bonjour,

Je suis nouvelle sur le site !
Je fais appel à vous car j’ai envisagé toutes les solutions et que là je n’avance plus du tt!
Je souhaiterais savoir où se situe mon problème, ou encore s’il y a quelque chose à modifier!
En fait mon formulaire est une recherche avancée, il récupère bien les données choisies mais j’ai l’impression que la requête de cumulation des choix ne se fait et surtout ne s’affiche pas !


function AdvancedSearchAds()
{
global $prefix,$db,$module_name,$bgcolor1,$bgcolor2,$perpage,$adsbgcolor1,$adsbgcolor2, $admin;
	include ("header.php");
	menu($mainads=1);
	echo "<BR>";
	OpenTable();

echo "<tr align=\"center\"><td colspan=\"2\"><font class=\"title\">Recherche Avancée</font><br><BR><BR><br></td></tr>";


	echo "<tr align=\"center\">
  	<td>
  	<form name=\"formulaire\" align=\"center\" action=\"modules.php?name=$module_name&op=AdvancedSearchAds\" method=\"post\" enctype=\"multipart/form-data\">";
	

	echo "<table>";
	echo "<tr><td width=\"130\" align=\"center\"><font color=\"0080c0\">CATEGORIES</font></td>"
  	."<td width=\"120\"  colspan=\"6\"><select name=\"catgforprocess\">";
  $result = $db->sql_query("select id_catg,catg from ".$prefix."_ads_category order by catg");
  while (list($xid_catg,$xcatg) = $db->sql_fetchrow($result)){
  	$result2 = $db->sql_query("select id_subcatg,subcatg from ".$prefix."_ads_subcatg where id_catg='$xid_catg' order by subcatg");
  while (list($xid_subcatg,$xsubcatg) = $db->sql_fetchrow($result2)) {
	echo "<option value=\"$xid_catg"."_"."$xid_subcatg\">$xcatg-$xsubcatg</option>\n";
  	}
  	$db->sql_freeresult($result2);
  }
  $db->sql_freeresult($result);
  echo "</select>"
  	."</td></tr>";
  

	echo "<TR align=\"center\" width=\"100%\">";
	echo "<TD width=\"120\" align=\"center\">";
	echo "<font color=\"0080c0\"<b>DEPARTEMENTS</b></font></td>";


  echo "<td width=\"40\">";
  echo "<select name=\"id_localisation1\">";
  $result3 = $db->sql_query("select * from ".$prefix."_ads_localisation order by id_localisation");
  while (list($id_localisation,$localisation) = $db->sql_fetchrow($result)) {
  	echo "<option value=\"$id_localisation\">$id_localisation</option>\n";
  }
  $db->sql_freeresult($result);
  echo "</select></td>";

  echo "<td width=\"40\">";
  echo "<select name=\"id_localisation2\">";
  $result4 = $db->sql_query("select * from ".$prefix."_ads_localisation order by id_localisation");
  while (list($id_localisation,$localisation) = $db->sql_fetchrow($result)) {
  	echo "<option value=\"$id_localisation\">$id_localisation</option>\n";
  }
  $db->sql_freeresult($result);
  echo "</select></td>";

  echo "<td width=\"40\">";
  echo "<select name=\"id_localisation3\">";
  $result5 = $db->sql_query("select * from ".$prefix."_ads_localisation order by id_localisation");
  while (list($id_localisation,$localisation) = $db->sql_fetchrow($result)) {
  	echo "<option value=\"$id_localisation\">$id_localisation</option>\n";
  }
  $db->sql_freeresult($result);
  echo "</select></td>
	</tr>";
	

	echo "<TR align=\"center\">";
	
  
	echo "<TD width=\"120\" align=\"center\">";
	echo "<font color=\"0080c0\">DATE DE PARUTION</font></td>";
	echo "<td>entre</td><td width=\"60\"><input type=\"text\" size=\"10\" name=\"dateposted1\" value=\"$dateposted\"></td>";
	echo "<td>et</td><td width=\"60\"><input type=\"text\" size=\"10\" name=\"dateposted2\" value=\"$dateposted\"></td>";
	echo "<td> ex : 2006-01-27</td></tr>";


  echo "<tr align=\"center\"><td width=\"120\" align=\"center\"></td>";
  	echo "<td width=\"60\"><input type=\"hidden\" name=\"op\" value=\"AdvancedSearchAds\"></td>";
  	echo "<td width=\"60\"><input type=\"submit\" value=\"Recherche\"></td>";
  	
  
  echo "</tr></table></form></td></tr>";
  CloseTable();

$ catgforprocess =$_POST[' catgforprocess '];
$ id_localisation =$_POST[' id_localisation1', ' id_localisation2', ' id_localisation3'];
$ dateposted =$_POST[' dateposted1', dateposted2'];

echo $ catgforprocess;
echo $ id_localisation;
echo $ dateposted;
	
	OpenTable();
$catg_arr = explode("_",$catgforprocess);
	$id_catg = $catg_arr[0];
	$id_subcatg = $catg_arr[1];

$requete = "SELECT id_ads, id_catg, id_subcatg, id_localisation, title, cdesc, prize, submitter, email, website, dateposted ";
$requete .= " FROM ".$prefix."_ads_ads WHERE ";
$requete .= " catgforprocess = “.$POST[‘catgforprocess’].” ";
$requete .= "  AND (id_localisation = “.$POST[‘id_localisation1’].”  OR  id_localisation = “.$POST[‘id_localisation2’].”  OR id_localisation = “.$POST[‘id_localisation3’].” ) ";
$requete .= " AND (dateposted BETWEEN  “.$POST[‘dateposted1’].”  AND “.$POST[‘dateposted2’].”  ) /*OR (dateposted => “.$POST[‘dateposted1’].”  AND dateposted <= “.$POST[‘dateposted2’].”  )";*/
$requete .= " ORDER BY id_ads DESC ";

	
	$resulttotalads = $db->sql_query($requete);
	$totalads = $db->sql_numrows($resulttotalads);
	if ($totalads == 0) {
  echo "<center><b>"._NOMATCHQUERY." <I></i></b></center>";
	} else {
  echo ""._THEREARE." <b>$totalads</b> "._FOUNDFOR." <b></b><BR><BR>";
	$totalpages = ceil($totalads/$perpage);
	if (!$page) {
  $page = 1;
	}
	$start = ($page - 1) * $perpage;
	$requete .= " limit $start,$perpage";
	if ($totalpages >= 2) {
  echo "<center>";
  $back = $page - 1;
  if ($back >= 1 ) {
  	echo "<a href=\"modules.php?name=$module_name&op=AdvancedSearchAds&page=$back2\" class=\"content\"><< "._BACK."</a> ";
  }
  for ($i = 1;$i <= $totalpages;$i++) {
  	if ($page == $i) {
    echo "<b>$page</b>  ";
  	} else {
    echo "<a href=\"modules.php?name=$module_name&op=AdvancedSearchAds&page=$i\" class=\"content\">$i</a>  ";
  	}
  }
  $next = $page + 1;
  if ($next <= $totalpages) {
  	echo "<a href=\"modules.php?name=$module_name&op=AdvancedSearchAds&page=$next\" class=\"content\">"._NEXT." >></a>";
  }
  echo "</center>";
	}


	$resultads = $db->sql_query($requete);
	$j=0;
	while (list($id_ads,$id_catg,$id_subcatg,$id_localisation,$title,$cdesc,$prize,$submitter,$email,$website,$dateposted) =$db->sql_fetchrow($resultads)) {
  $j++;
  if ($j % 2 == 0) {
  	$backcolor = "$adsbgcolor1";
  } else {
  	$backcolor = "$adsbgcolor2";
  }
  echo ""._WEBSITE." : <b>".$website."</b></a>"
  	." le ".FormatDate($dateposted);
  echo "<table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"2\" bgcolor=\"#333333\">"
  	."<tr bgcolor=\"$bgcolor2\"><td><font ><b>".ucfirst($title)."</b></font></td></tr>"
  	."<tr bgcolor=\"$backcolor\"><td>"
  	."<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"1\"><tr><td>".stripslashes($cdesc)."</td></tr>"
  	."<tr><td><b>"._PRICE." :</b> $prize</td></tr>"
  echo "<tr><td><div align=\"center\">[ <a href=\"modules.php?name=Private_Messages&send=1&uname=$submitter\">"
  	.""._SENDPM." ".ucfirst($submitter)."</a> | <a href=\"modules.php?name=$module_name&op=ViewDetailAds&id_ads=$id_ads\">"._ADSDETAIL."</a> ";
  echo "]</div>"
  	."</td></tr></table>";
  echo "<tr bgcolor=\"$bgcolor2\"><td align=\"center\">";
  echo AdsAdminBlock($no);
  echo "</td></tr></table>";
  	echo "<BR>";
  	echo "<BR>";

	}
	$db->sql_freeresult($resultads);
	if ($totalpages >= 2) {
  echo "<center>";
  $back = $page - 1;
  if ($back >= 1 ) {
  	echo "<a href=\"modules.php?name=$module_name&op=AdvancedSearchAds&page=$back2\"><< "._BACK."</a> ";
  }
  for ($i = 1;$i <= $totalpages;$i++) {
  	if ($page == $i) {
    echo "<b>$page</b>  ";
  	} else {
    echo "<a href=\"modules.php?name=$module_name&op=AdvancedSearchAds&page=$i\">$i</a>  ";
  	}
  }
  $next = $page + 1;
  if ($next <= $totalpages) {
  	echo "<a href=\"modules.php?name=$module_name&op=AdvancedSearchAds&page=$next\">"._NEXT." >></a>";
  }
  echo "</center>";
	}

	}
	
	CloseTable();
	include ("footer.php");
}	

Merci d’avance à tous ceux qui pourront m’aider :slight_smile: !!!!

Commence par nettoyer ton code : http://www.php.net/manual/fr/language.basic-syntax.php

(paragraphe sur l’échappement avancé)

Ca t’évitera un tas d’echo et ça sera plus lisible.

Au passage, tu fais deux fois la même requête.

Une fois que tu as obtenu ton résultat mysql (voir mysql_query et consort), tu peux parcourir les données, obtenir le nombre de résultats, etc, directement avec mysql_fetch_assoc, mysql_num_rows.

Bref, pour le reste comme j’ai pas trop compris le problème :slight_smile:

de plus, préferer
echo ‘<a href=“tonlien”>ton_libelle</a>’;
à
echo “<a href=\“tonlien\”>ton_libelle</a>”;
un simple quote est plus rapide, qu’un double :
si php trouve un ", on cherchera les eventuelles variables dans toute ta chaine, alors que si tu fait echo ‘ma variable’.$est_a_lexterieure.’ de la chaine’; php n’aura pas a parser toute la chaine pour rien !

un mysql_num_rows doit s’effectuer si ta requete peut retourner aucun enregistrement
un mysql_fetch_* doit s’effectuer alors apres un mysql_num_rows
si ta requete retourne forcément un résultat(select count(*) from …), mysql_num_rows ne s’impose pas :slight_smile:

A quel niveau ai je fait la même requête ?
En fait mon problème , est que ma requête ne fonctionne pas et je n’arrive pas à l’afficher!

Je donne pas tout le code, mais l’idée y est (vers la fin)

$resulttotalads = $db->sql_query($requete);

$resultads = $db->sql_query($requete);

Ensuite, les free_results ne servent pratiquement à rien, et c’est certainement ça ton problème : free_result est censé (je suppose, on dirait l’interface de bdd de phpbb) libéré les ressources associées à une requête SQL.

En simplifiant : suppose que quand tu fais une requête SQL tu ouvre une fenêtre Windows. Faire un free_result reviendrait à fermer la fenêtre.
Si tu ferme plusieurs fois la même fenêtre, soit rien ne se passe, soit ça plante.

C’est ce que tu fais j’ai l’impression

(comme je l’ai dis l’entremélement de code html & php n’aide pas)

j’ai refait le code pour l’exécution de ma requête , et ça donne ça , mais j’ai toujours pas de résultat :

$resultads = $db->sql_query($requete);
	$totalads = $db->sql_numrows($resultads);

	if ($totalads == 0) {
  echo "<BR><center><b>"._NOADSAVAIL."</b><BR><BR><a href=\"java script:history.go(-1);\">Retour</a></center>";
	} else {
	$j = 0;
	while (list($id_ads,$title,$cdesc,$prize,$submitter,$email,$website,$dateposted) = $db->sql_fetchrow($resultads))
	$j++;
  }               

echo "".$id_ads."";
echo "".$title."";
echo "".$cdesc."";
echo "".$prize."";
echo "".$submitter."";
echo "".$email."";
echo "".$website."";
echo "".$dateposted."";
echo "";

Voilà un echo sur ma requête, j’obtiens ceci :

je me suis rendue compte qu’il ne reconnait pas “catgforprocess” car ce n’est pas un champ mais une variable qui fait la concaténation entre “id_catg” et “id_subcatg”, c’est pour celà que j’ai “3_3”.

comment puis je contourner ce problème pour qu’il puisse faire correctement la requete?

SELECT id_ads, id_catg, id_subcatg, id_localisation, title, cdesc, prize, submitter, email, website, dateposted FROM nuke_ads_ads WHERE (id_catg ||  '_' || id_subcatg) = '3_3' AND (id_localisation = '91' OR id_localisation = '92' OR id_localisation = '71') AND (dateposted BETWEEN '2006-01-02' AND '2006-03-28') ORDER BY id_ads DESC 

?

Tu pense que ma requête devrait s’écrire comme cela ?
mais comment va t elle récupérer le choix dans mon formulaire ?

$requete = "SELECT id_ads, CONCAT(id_catg,'_',id_subcatg) AS catgforprocess, id_localisation, title, cdesc, prize, submitter, email, website, dateposted ";
$requete .= " FROM ".$prefix."_ads_ads WHERE ";
$requete .= " (id_catg ||  '_' || id_subcatg) = ('".$_POST['id_catg']."' ||  '_' || '".$_POST['id_subcatg']."')";

/*$requete .= " catgforprocess = '".$_POST['catgforprocess']."'";*/
$requete .= " AND (id_localisation = '".$_POST['id_localisation1']."' OR  id_localisation = '".$_POST['id_localisation2']."' OR id_localisation = '".$_POST['id_localisation3']."')";
if (empty($dateposted1) OR empty($dateposted2))
{ return false;
} else {
$requete .= " AND (dateposted BETWEEN '".$_POST['dateposted1']."' AND '".$_POST['dateposted2']."')";
}
$requete .= " ORDER BY id_ads DESC ";

la liste déroulante concernée de mon formulaire est la suivante :

echo "<tr><td width=\"130\" align=\"center\"><font color=\"0080c0\">CATEGORIES</font></td>"
  	."<td width=\"120\"  colspan=\"6\"><select name=\"catgforprocess\">";
  $result = $db->sql_query("select id_catg,catg from ".$prefix."_ads_category order by catg");
  while (list($xid_catg,$xcatg) = $db->sql_fetchrow($result)){
  	$result2 = $db->sql_query("select id_subcatg,subcatg from ".$prefix."_ads_subcatg where id_catg='$xid_catg' order by subcatg");
  while (list($xid_subcatg,$xsubcatg) = $db->sql_fetchrow($result2)) {
	echo "<option value=\"$xid_catg"."_"."$xid_subcatg\">$xcatg-$xsubcatg</option>\n";
  	}
  	$db->sql_freeresult($result2);
  }
  $db->sql_freeresult($result);
  echo "</select>"
  	."</td></tr>";

je crois que j’ai trouvé une piste mais ça ne me renvoie aucune information
j’ai l’impression qu’il n’arrive pas à comprendre la concaténation !


$requete = "SELECT id_ads, id_catg, id_subcatg, id_localisation, title, cdesc, prize, submitter, email, website, dateposted ";

$requete .= " FROM ".$prefix."_ads_ads WHERE ";
$requete .= " ((id_catg +'_'+ id_subcatg) = '".$_POST['catgforprocess']."')";
$requete .= " AND (id_localisation = '".$_POST['id_localisation1']."' OR  id_localisation = '".$_POST['id_localisation2']."' OR id_localisation = '".$_POST['id_localisation3']."')";
if (empty($dateposted1) OR empty($dateposted2))
{ return false;
} else {
$requete .= " AND (dateposted BETWEEN '".$_POST['dateposted1']."' AND '".$_POST['dateposted2']."')";
}
$requete .= " ORDER BY id_ads DESC ";

j’obtiens ça comme echo de ma requete

je pense surtout que la concatenation en sql ne se fait pas avec des ‘+’ mais avec des || ou encore des &

http://dev.mysql.com/doc/maxdb/en/71/81736…261/content.htm

On sait jamais avec mySQL benj :o

Sinon tu as la fonction CONCAT qui fait pareil que ||

oui c’est celle là que j’ai testé

$requete = "SELECT CONCAT(id_catg,'_',id_subcatg) AS catgforprocess, id_ads, id_localisation, title, cdesc, prize, submitter, email, website, dateposted FROM ".$prefix."_ads_ads WHERE catgforprocess = '".$_POST['catgforprocess']."' AND (id_localisation = '".$_POST['id_localisation1']."' OR  id_localisation = '".$_POST['id_localisation2']."' OR id_localisation = '".$_POST['id_localisation3']."') AND (dateposted BETWEEN '".$_POST['dateposted1']."' AND '".$_POST['dateposted2']."') ORDER BY id_ads DESC ";

quand je fais l’echo sur ma requete ça me donne ça :

je l’ai testé dans PHPmyadmin, il me dit qu’il ne trouve rien
alors j’ai enlever "catgforprocess = ‘3_3’ AND " pour voir
miracle il me sélectionne tout ce qui correspond à ma requete !!!!! :clap: