Vous n'êtes pas identifié(e).
Bonjour à tous,
Je cherche à faire un formulaire de recherche dans une base de donnée dans lequel j'aurai une liste déroulante avec plusieurs choix de pays. Soit je choisis un pays, soit je choisis de faire ma recherche sur tous les pays.
J'arrive à faire afficher un résultat avec un seul pays ou les résultats avec tous les pays.
Par contre mon code ne gère pas les deux à la fois. Je semble avoir un problème de syntaxe par contre je n'arrive pas à voir lequel.
L'exemple suivant (de code) est celui ou l'affichage de tous les pays est fonctionnel par contre celui du choix d'un seul pays ne marche pas.
Il faudrait que j'arrive à afficher dans la commande de recherche dans la base :
$reponse = $bdd->query('SELECT * FROM VINS WHERE Pays ="France" AND Cepage =\'' . $_POST['cep'] . '\'')
Mais je n'y arrive pas. Que faire ?????
Code erreur obtenu :
=\\\"France\\\"Array ( [0] => 42000 [1] => 1064 [2] => 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 '\\\"France\\\" AND Cepage ='Grenache'' at line 1 ) 1
Merci d'avance de vos réponses.
Voilà mon code coté formulaire :
Formulaire de recherche d'un vin :
<p>
<select name="country" />
<option value='IS NOT NULL'>Tous les pays</option>
<option value='="France"'>France</option>
<option value='="USA"'>USA</option>
<option value='="Italie"'>Italie</option>
<option value='="Espagne"'>Espagne</option>
</select>
<select name="cep" />
<option value="Grenache">Grenache</option>
<option value="Cabernet sauvignon">Cabernet sauvignon</option>
<option value="Syrah">Syrah</option>
</select>
<input type="submit" value="Valider" />
</p>
</form>
voilà mon code coté recherche et affichage des résultats :
echo $_POST['country'];
// On récupère tout le contenu de la table Vins
$reponse = $bdd->query('SELECT * FROM VINS WHERE Pays ' . $_POST['country'] . ' AND Cepage =\'' . $_POST['cep'] . '\'') or die(print_r($bdd->errorInfo()));
// On affiche chaque entrée une à une
while ($donnees = $reponse->fetch())
{
?>
<table
style="width: 1000px; text-align: left; margin-left: auto; margin-right: auto;"
border="1" cellpadding="2" cellspacing="0">
<tbody>
<tr>
<td style="text-align: center; width: 60px;" colspan="6"
rowspan="1">Nom du vin</td>
</tr>
<tr>
<td style="text-align: center; width: 60px;" colspan="6"
rowspan="1"><?php echo $donnees['Nom_du_vin']; ?></td>
</tr>
<tr>
<td style="text-align: center; width: 205px;">Pays</td>
<td style="text-align: center; width: 154px;">Région</td>
<td style="text-align: center; width: 208px;">Appellation</td>
<td style="text-align: center; width: 136px;">Cépage</td>
<td colspan="1" rowspan="1"
style="text-align: center; width: 196px;">Producteur</td>
<td style="width: 60px;">Millésime</td>
</tr>
<tr>
<td style="text-align: center; width: 205px;"><?php echo $donnees['Pays']; ?></td>
<td style="text-align: center; width: 154px;"><?php echo $donnees['Région']; ?></td>
<td style="text-align: center; width: 208px;"><?php echo $donnees['Appellation']; ?></td>
<td style="text-align: center; width: 136px;"><?php echo $donnees['Cepage']; ?></td>
<td colspan="1" rowspan="1"
style="text-align: center; width: 196px;"><?php echo $donnees['Producteur']; ?></td>
<td style="text-align: center; width: 60px;"><?php echo $donnees['Année']; ?></td>
</tr>
<tr align="center">
<td colspan="6" rowspan="1" style="width: 60px;">Commentaire</td>
</tr>
<tr align="center">
<td colspan="6" rowspan="1" style="width: 60px;"><?php echo $donnees['commentaire']; ?></td>
</tr>
</tbody>
</table>
<p>
<br>
<?php
}
// Termine le traitement de la requête
$reponse->closeCursor();
?>
Hors ligne
SAluton,
Essaye comme cela
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Cela ne semble pas marcher......
En fait le problème est que si je veux sélectionner tous les pays je dois écrire :
where pays is not null......
et si je ne veux sélectionner qu'un seul pays je dois écrire :
where pays ="France".....
Dans un cas il y a un signe égal et des guillemets et dans l'autre il n'y a rien. Donc j'ai l'impression que je suis bloqué.
Faut-il chercher dans une autre direction ou peut-on conserver ce type d'approche ?
Merci d'avance.
Hors ligne
Tu pourrai faire un truc de ce genre :
Idée de la soirée, à voir si cela te convient et s'il n'y a pas mieux.
PS: je pars du principe que la variable country est vide lorsqu'on souhaite tous les pays.
Dernière modification par xTG (10-07-2010 21:57:48)
Hors ligne
Bonjour,
Concernant ton problème de base de données c'est tout à fait normal. Il faut savoir qu'autoriser une valeur NULL par défaut dans un champ à des conséquences dans la construction de tes requêtes. Par exemple avec un simple CONCAT si tu fait par exemple:
, il suffit que firstnames ou que lastname sur un enregistrement soit null (information non connue, ...) pour que la valeur de Lib soit nulle pour cet enregistrement. Si on veut que l'information disponible soit affichée quelque soit la situation, suffit par exemple de mettre comme valeur par défaut pour lastname et firstnames "?" pour avoir en résultat de requête "DUPONT, ?" ou "?, Jacques".
De plus dans ton cas de mettre "WHERE pays IS NOT NULL" ne te renvoie pas tous les pays dans le cas où il n'y aurait au moins qu'un seul pays de valeur nulle dans ta table. Et puis c'est mieux de mettre "WHERE NOT ISNULL(pays)". Une solution pour te renvoyer tous les pays dans ton cas y compris ceux ayant pour valeur une valeur nulle serait par ex "WHERE LENGTH(pays)>=1" (Pour infos, un champ null à pour length 5).
Voila.
EDIT.
Pour résoudre ton problème de requête selon ton pays plusieurs possibilités s'offrent à toi. La première est de construire dynamiquement ta requête en PHP selon les paramètres reçus de ton formulaire. La seconde est similaire à la solution de maljuna c'est à dire de passer par une requête paramétrée (bien qu'il n'utilise pas de requête paramétrée au sens SQL du terme). De plus, les deux méthodes s'optimisent différemment avec PDO si on veut faire les choses bien.
Dernière modification par Jc (10-07-2010 23:02:09)
POO PHP+Ajax en MVC avec PDO et Bases de données épaisses : What else?
Hors ligne
De plus dans ton cas de mettre "WHERE pays IS NOT NULL" ne te renvoie pas tous les pays dans le cas où il n'y aurait au moins qu'un seul pays de valeur nulle dans ta table. Et puis c'est mieux de mettre "WHERE NOT ISNULL(pays)".
Non, la syntaxe SQL standard est IS NOT NULL, ISNULL() est une fonction reconnue par MySQL, mais pas par d'autres SGBD.
Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy
Hors ligne
Merci beaucoup pour toutes vos réponses, mais j'avoue ne pas maîtriser correctement le langage de programmation et ses subtilités. Je vais donc plancher pour améliorer tout ça et avancer.
Encore merci.
Hors ligne
Resalut,
après quelques temps de réflexion et de travail..... j'ai réussi à faire ce que je voulais grâce à la réponse de xTG.
Encore merci beaucoup.....
A++
Hors ligne