Génération d'une requete SQL en fonction des donnnées d'un formulaire

Répondre
SuperTalon
le 25/03/2009 à 16:54
SuperTalon
bonjour, j'ai deux liste dans un formulaire pour pouvoir afficher :
- tous les statuts pour toutes les régions
- tous les statuts pour une région
- un statut pour toutes les régions
- un statut pour une région

Je me sers des if elseif else mais ça ne veux rien savoir, il n'y a que 1 statut pour 1 région qui s'affiche... Je ne vois pas ou il y a une erreur :
----------------------------

<?php
if($_POST['societe_statut'] == '1' && $_POST['societe_secteur'] == '1')
{
$demande = mysql_query('SELECT * FROM societe LEFT JOIN contact ON societe.societe_nom = contact.contact_societe ORDER BY societe_nom ASC');//ça c'est censé afficher tout
}
else if($_POST['societe_statut'] == '1' && $_POST['societe_secteur'] != '1')
{
$demande = mysql_query('SELECT * FROM societe LEFT JOIN contact ON societe.societe_nom = contact.contact_societe WHERE societe_statut = "'.$_POST['societe_statut'].'" ORDER BY societe_nom ASC');//ça c'est censé afficher 1 statut dans toutes les régions

}

else if($_POST['societe_secteur'] == '1' && $_POST['societe_statut'] != '1')
{
$demande = mysql_query('SELECT * FROM societe LEFT JOIN contact ON societe.societe_nom = contact.contact_societe WHERE societe_secteur = "'.$_POST['societe_secteur'].'" ORDER BY societe_nom ASC');//ça c'est censé afficher tous les statuts d'une région

}
else
{
$demande = mysql_query('SELECT * FROM societe LEFT JOIN contact ON societe.societe_nom = contact.contact_societe WHERE societe_statut = "'.$_POST['societe_statut'].'" AND societe_secteur = "'.$_POST['societe_secteur'].'" ORDER BY societe_nom ASC');//ça c'est censé afficher un statut d'une région

}
?>

---------------

Question subsidiaire ; sachant que je fais apparaitre tout les champs dans le résultat, y a t il quand même un intérêt pour les nommés plutôt que de déclarer * ?

Merci d'avance
SuperTalon
le 25/03/2009 à 17:56
SuperTalon
Si ça peut aider voici le formulaire :
--------------------
<form action="index.php" method="post">
<fieldset>

<p>
<label for="secteur">Statut </label><select name="societe_statut" id="societe_secteur">
<option value="">-</option>
<option value"1">1</option>
<option value="Inconnu">Inconnu</option>
<option value="Suspect">Suspect</option>
<option value="Prospect">Prospect</option>
<option value="Client ponctuel">Client ponctuel</option>
<option value="Client">Client</option>
<option value="Client important">Client important</option>
<option value="Fournisseur">Fournisseur</option>
</select>
</p>
<p>
<label for="secteur">Secteur : </label><select name="societe_secteur" id="societe_secteur">
<option value="">-</option>
<option value="1">1</option>
<option value="Ile-de-France">Ile-de-France</option>
<option value="Normandie">Normandie</option>
<option value="Nord">Nord</option>
<option value="Centre">Centre</option>
<option value="Bretagne">Bretagne</option>
<option value="Sud">Sud</option>
</select>
</p>
<p>
<label>&nbsp;</label><input type="submit" value="Enregistrer" />
</p>
</fieldset>
</form>

---------------------
LA GLOBULE
le 25/03/2009 à 18:36
LA GLOBULE
Je t'en prie, utilize le BB-Code pour balancer du code, c'est illisible sinon.

Et "où est l'erreur ?" comme titre de sujet n'est pas approprié à ton problème.
LA GLOBULE
le 25/03/2009 à 20:21
LA GLOBULE
Quelques idées de debug :
- juste avant de lancer tes requêtes SQL, essayes de faire un print_r($_POST) pour voir quelles valeurs tu récupères
- place des echo différents dans chaque if pour voir dans lequel ton script va aller
- ne fais pas confiance dans le tableau $_POST : dans ton else, tu balances direct la variable sans escaper son contenu (dans les elseif, tu ne le fais pas non plus, mais c'est moins génant, car tu sais que tu as la valeur '1') : utilise la fonction mysql_escape_string
- testes si mysql a renvoyé une erreur à PHP en testant si mysql_query a retourné false (et si il retourne false, tu peux lire l'erreur SQL grace à la fonction mysql_error)
SuperTalon
le 25/03/2009 à 20:48
SuperTalon
Merci pour les pistes, j'ai rien pité mais gogol est mon ami je vais chercher.

Pour le BBcode je regarderais ça à la prochaine, j'ai voulu modifier tout à l'heure mais pas de fonction de reedition donc...
jeca
le 26/03/2009 à 14:09
jeca
Bonjour,

Tout d'abord, il y a une erreur sur cette ligne :
<option value"1">1</option>
Il maque le signe "=".

Ensuite, ton formulaire est mal réalisé, car si tu le soumets sans faire de sélection, le programme va considérer que tu veux un statut pour une région, qu'il ne pourra trouver, évidemment. Donc :
<html>
<head>
<title>Page de soumission du formulaire</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
</script>
</head>

<body>
<form action="index.php" method="post">
<fieldset>
<p>
<label for="secteur">Statut </label>
<select name="societe_statut" id="societe_secteur">
<option value="1">-- Tous --</option>
<option value="Inconnu">Inconnu</option>
<option value="Suspect">Suspect</option>
<option value="Prospect">Prospect</option>
<option value="Client ponctuel">Client ponctuel</option>
<option value="Client">Client</option>
<option value="Client important">Client important</option>
<option value="Fournisseur">Fournisseur</option>
</select>
</p>
<p>
<label for="secteur">Secteur : </label>
<select name="societe_secteur" id="societe_secteur">
<option value="1">-- Tous --</option>
<option value="Ile-de-France">Ile-de-France</option>
<option value="Normandie">Normandie</option>
<option value="Nord">Nord</option>
<option value="Centre">Centre</option>
<option value="Bretagne">Bretagne</option>
<option value="Sud">Sud</option>
</select>
</p>
<p>
<label>&nbsp;</label><input type="submit" value="Enregistrer" />
</p>
</fieldset>
</form>
</body>
</html>


En outre, les conditions dans "index.php" ne correspondent pas au résultat attendu. De plus, dans une requête, les chaines de caractères s'encadre avec des apostrophes, et non pas avec des guillemets.
Essaie ce code :
<?php
if($_POST['societe_statut'] == '1' && $_POST['societe_secteur'] == '1')
{
$numero = 'condition N° 1 : tous les statuts pour tous les secteurs';
$where = '';
}
else if($_POST['societe_statut'] != '1' && $_POST['societe_secteur'] == '1')
{
$numero = 'condition N° 2 : un statut pour tous les secteurs';
$where = ' WHERE societe_statut = \'' . $_POST['societe_statut'] . '\'';
}
else if($_POST['societe_statut'] == '1' && $_POST['societe_secteur'] != '1')
{
$numero = 'condition N° 3 : tous les statuts pour un secteur';
$where = ' WHERE societe_secteur = \'' . $_POST['societe_secteur'] . '\'';
}
else
{
$numero = 'condition N° 4 : un statut pour un secteur';
$where = ' WHERE societe_statut = \'' . $_POST['societe_statut'] . '\'
AND societe_secteur = \'' . $_POST['societe_secteur'] . '\'';
}

$sql = 'SELECT *
FROM societe
LEFT JOIN contact ON societe.societe_nom = contact.contact_societe'
. $where . '
ORDER BY societe_nom ASC';
// $demande = mysql_query($sql);

echo $numero . '<br><br>' . $sql;
?>

La variable "$numero" n'est là que pour vérification.

Enfin, je subodore (c'est beau ça) que la structure de BDD n'est pas la meilleure, car tu ne devrais pas travailler avec des libellés, mais avec des clés.
cordialement
SuperTalon
le 27/03/2009 à 16:41
SuperTalon
Yahoo voilà de quoi m'occuper ce week end, merci d'avoir pris du temps pour le noob que je suis.

Entre temps l'affaire s'est résolu presque toute seule, j'ai ajouté un echo de mes post pour voir ce que j'envoyais et un <?php mysql_close; ?> en fin de piste, du coup tout marche. Lol autant vous dire que je manipule sans comprendre tout en comprenant, j'ai les boyeau de la tête un peu à l'envers.

Mais bon je vais étudier votre code car les bidules que je fais depuis ne fonctionnent pas vraiment et je pense que les erreurs viennent de là.

Merci encore
SuperTalon
le 28/03/2009 à 13:41
SuperTalon
J'ai relu le script c'est... élégant ?

Une question : qu'entends tu par clef à la place des libellés ? tu parles du formulaire ?
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours