PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 09-07-2010 14:02:42

iron dwarf
Membre
Inscription : 09-07-2010
Messages : 9

problème de choix dans une liste déroulante

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 :


<form method="post" action="index.php?page=recherche">

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 :


<?php
try
{
  // On se connecte à la base de donnée
$bdd = new PDO('mysql:host=bases.sql;dbname=X', 'Y', 'Z');
}
catch (Exception $e)
{
  // En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : ' . $e->getMessage());
}

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

#2 09-07-2010 14:38:38

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : problème de choix dans une liste déroulante

SAluton,
Essaye comme cela

$reponse = $bdd->query(sprintf('SELECT lesnomsdecolonnesmaispasétoile FROM VINS WHERE Pays="%s"  AND Cepage ="%s", $_POST['country'],$_POST['cep'])) or die(print_r($bdd->errorInfo());

La guerre des étoiles


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

#3 10-07-2010 18:37:37

iron dwarf
Membre
Inscription : 09-07-2010
Messages : 9

Re : problème de choix dans une liste déroulante

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

#4 10-07-2010 21:55:50

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : problème de choix dans une liste déroulante

Tu pourrai faire un truc de ce genre :

if( !empty($_POST['country']) )
  $pays_req = "Pays='" . $_POST['country'] . "' AND ";
else
  $pays_req = "";
$reponse = $bdd->query(sprintf('SELECT lesnomsdecolonnesmaispasétoile FROM VINS WHERE %s  Cepage ="%s"', $pays_req,$_POST['cep'])) or die(print_r($bdd->errorInfo());

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

#5 10-07-2010 22:54:58

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : problème de choix dans une liste déroulante

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:

SELECT CONCAT(lastname,', ',firstnames) as Lib FROM ...

, 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

#6 10-07-2010 23:09:45

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : problème de choix dans une liste déroulante

Jc a écrit :

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

#7 12-07-2010 20:32:05

iron dwarf
Membre
Inscription : 09-07-2010
Messages : 9

Re : problème de choix dans une liste déroulante

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

#8 23-07-2010 08:44:41

iron dwarf
Membre
Inscription : 09-07-2010
Messages : 9

Re : problème de choix dans une liste déroulante

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

Pied de page des forums