Formulaire de recherche avec champs vides en PHP

Formulaire de recherche avec champs vides en PHP - PHP - Programmation

Marsh Posté le 29-03-2013 à 00:47:40    

Bonjour à tous !  :jap:  
 
Je reviens vers vous pour un problème sur lequel je me suis bien cassée la tête ^^
 
Voilà. Nous disposons d'une BDD de parcours. Via un formulaire, on peut filtrer ces parcours. Choisir la note, le pseudo du créateur, le temps, etc... Seulement on peut aussi décider de ne rien sélectionner comme pseudo de créateur par exemple.
J'ai pensé à une façon de faire qui marche, mais un curieux problème survient.
 
 
Voici d'abord la portion html correspondant au formulaire.
 

Citation :


<form name="parcours_temps" method="get" action="parcours_recherche.php" >
 
   
<label for="duree"> Durée</label><select name="temps" id="temps">
<option>Moins de 30 min</option>
<option>30 min - 1h</option>
<option>1h - 1h30</option>
<option>1h30 - 2h</option>
<option>Plus de 2h</option>
<option>Peu importe</option>
</select>
<br><br>
 
<label for="note">Note </label> <input type="number" name="note" id="note">
<br>
<label for="difficulte">Difficulte </label> <select name="difficulte" id="difficulte">
<option>0</option>
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select>
<br>
<label for="createur">Createur </label> <input type="text" name="login_createur" id="login_createur">
<br>
<br>
<label for="score">Score </label> <input type="number" name="score" id="score">
 
<input type="submit" name="recherche" value="Envoyer"><br><br>


 
 
 
Rien d'incroyable. Voici maintenant parcours_recherche.php
 
 

Citation :


 
<table border cellpadding = 10 cellspacing = 3>
 
<tr><td>Nom</td><td>Note</td><td>Difficulte</td><td>Temps (en min)</td><td>Description</td></tr>
 
<?php
include ("bdd.php" );
$choix_note = NULL ;
$choix_temps = NULL ;
$choix_difficulte = NULL ;  
$choix_login = NULL ;
$temps_min = 0;
$temps_max = 100000;
 
if($_GET['note'] != NULL )
 $choix_note = $_GET['note'] ;
 
if($_GET['note'] != NULL )
 $choix_login = $_GET['login_createur'] ;
 
if($_GET['difficulte'] != NULL && $_GET['difficulte'] != 0)
 $choix_difficulte = $_GET['difficulte'] ;
 
if($_GET['temps'] != NULL ) {
 $choix = $_GET['temps'] ;
 if ($choix == 'Moins de 30 min')
  {
  $temps_max = 30;
  }
 if ($choix == '30 min - 1h')
  {
  $temps_min = 30 ;
  $temps_max = 60;
  }
 if ($choix == '1h - 1h30')
  {
  $temps_min = 60 ;
  $temps_max = 90;
  }
 if ($choix == '1h30 - 2h')
  {
  $temps_min = 90 ;
  $temps_max = 120;
  }
 if ($choix == 'Plus de 2h')
  {
  $temps_min = 120 ;
  }
   
  echo $temps_min,'  -  ',$temps_max ;
 }
 
// if($_GET['lieu'] != NULL )
 // $choix_lieu = $_GET['lieu'];
 
echo $choix_note ;
 
$query = "SELECT IDparcours, nom, description, note, temps, difficulte, login FROM parcours, joueurs
WHERE joueurs.IDjoueur = parcours.IDcreateur AND temps <= $temps_max AND temps >= $temps_min  
AND difficulte = $choix_difficulte  
AND note >= $choix_note "
;
 
$result=mysql_query($query)  or die(mysql_error()) ;
 
 while ($row = mysql_fetch_row($result)) {
    $IDparcours = $row[0] ;
    $nom = $row[1] ;
    $description = $row[2] ;
    $note = $row[3] ;
    $temps = $row[4] ;
    $difficulte = $row[5] ;
    $login = $row[6];
         echo '<tr><td>',$nom,'</td><td>',$note,'</td><td>',$difficulte,'</td><td>',$temps,'</td><td>',$description,'</td></tr>';
       
     
} // boucle de lecture des réponses
 
 
?>


 
</table>
 
 
 
 
Ce code fonctionne sans la partie en rouge. Dès que je la rajoute, il me sort :

Citation :


You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4


 
 
Quelque chose doit m'échapper. Pouvez-vous m'éclairer ?
 
 
Merci à vous !!

Reply

Marsh Posté le 29-03-2013 à 00:47:40   

Reply

Marsh Posté le 29-03-2013 à 00:48:49    

Je précise : je n'ai ce message d'erreur que quand aucune note n'est saisie dans le formulaire. Sinon ça marche.

Reply

Marsh Posté le 29-03-2013 à 12:55:08    

Pour moi ça signifie que ton $_GET['note'] contient bien quelque chose par défaut.
D'ailleurs pourquoi un form en get plutôt qu'en post ?
 
On peut voir l'url lorsque tu as le message d'erreur mysql ?
 
Sinon, ce serait quand même plus judicieux de mieux contrôler tes données, empty, ctype_digit, et aussi utiliser des elseif  :o

Reply

Marsh Posté le 29-03-2013 à 15:56:39    

La construction de ta requête sql, c'est du n'importe quoi :/
Si tu mets pas une valeur dans le formulaire, t'aura NULL dans la requête sql, ce que Mysql va pas aimer puisque null en php, c'est aps pareil que la chaîne "NULL" écrite dans la requête sql.
 
En gros, si tas ça :
$MaVar = null;
$sql = "SELECT * FROM MaTable WHERE MonChamp = $MaVar";
 
quand tu vas exécuter ta requête, mysql va faire ceci :  
SELECT * FROM MaTable WHERE MonChamp =
 
Ca va pas trop lui plaire :/
 
Pour construire ta requête faut faire ceci d'abord :
$sql = "SELECT ... FROM .... WHERE joueurs.IDjoueur = parcours.IDcreateur";
$Where = "";
 
Puis pour chaque paramètre :
if ((isset($_GET['monchamp'])) && (!empty($_GET['monchamp']))) {
    $Where .= " AND monchamp = ".$_GET['monchamp'];
}
 
Evidemment, dans le $Where, tu mets le traitement approprié à contenu de $_GET['monchamp'] suivant que c'est un nombre, une chaîne de caractère...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-03-2013 à 20:04:55    

Ah bien vu l'idée de .=
 
je sentais bien que ce que je faisais était du bricolage, mais ça passait pour certaines requêtes..
Enfin là ça va être plus propre. Je teste ça, merci à vous !

Reply

Marsh Posté le 29-03-2013 à 23:48:44    

C'est pour l'exemple ou bien tes <option> ne retournent pas de value ?


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 30-03-2013 à 01:57:45    

il faut croire que par défaut ça prend la valeur qui est comprise entre les balises <option>.

 

En tout cas maintenant ça marche super. Merci !


Message édité par chocolatine_ le 30-03-2013 à 01:58:11
Reply

Marsh Posté le 31-03-2013 à 19:11:48    

dans chaque option, ajoutes un attribut "value", ça sera mieux :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed