Formulaire de recherche avec champs vides en PHP - PHP - Programmation
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.
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
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...
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 !
Marsh Posté le 29-03-2013 à 23:48:44
C'est pour l'exemple ou bien tes <option> ne retournent pas de value ?
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 !
Marsh Posté le 31-03-2013 à 19:11:48
dans chaque option, ajoutes un attribut "value", ça sera mieux
Marsh Posté le 29-03-2013 à 00:47:40
Bonjour à tous !
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.
<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
<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 :
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 !!