Page 1 sur 3

Requete préparée

Posté : 29 juil. 2013, 11:39
par Khidam

Code : Tout sélectionner

Bonjour à tous Je débute en php PDO mysql, je galère sur une préparation de requête et assemblage et j'aurais vraiment besoin de votre aide. Voilà : J'ai un formulaire dans lequel je demande plusieurs choses aux utilisateurs : 1. Quelle requête ils veulent consulter : boutons radio avec par exemple comme choix "microbiologie" ou "flore", etc 2. Quels critères ils veulent appliquer sur cette requête : liste déroulante avec différentes variables de pH, ou différentes variables de type de sol. Mais ils ne sont pas obligés de sélectionner un ou des critères ! Dans ma page cible : <?php try { $bdd = new PDO('mysql:host=localhost;dbname=Bio2', 'root', 'root'); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } //on teste d'abord pour savoir si une case a bien été cochée if (isset($_POST["choix"]) && $_POST["choix"] != "") { //Si c'est la microbio qui est voulue if ($_POST["choix"] == "microbio") { $reponse = $bdd->query("SELECT MICROBIO.* FROM MICROBIO INNER JOIN SITE ON MICROBIO.CODE_REPET = SITE.CODE_REPET"); } elseif ($_POST["choix"] == "flore") { $reponse = $bdd->query("SELECT FLORE.* FROM FLORE INNER JOIN SITE ON FLORE.CODE_REPET = SITE.CODE_REPET"); } elseif //etc } } //on teste ensuite pour savoir si un critère a été sélectionné, auquel cas on insère le critère dans la requête if (isset($_POST["sol"]) && $_POST["sol"] != "") { $reponse = $reponse WHERE LAND_USE=$_POST["sol"]; } if (isset($_POST["ph"]) && $_POST["ph"] != "") { $reponse =$reponse WHERE PH=$_POST["ph"]; } if //etc // On affiche chaque entrée une à une while ($donnees = $reponse->fetch()) { ?> <?php } $reponse->closeCursor(); // Termine le traitement de la requête ?> Mais bien sûr, ça ne fonctionne pas :non: Pouvez vous me dire ce qui ne va pas plizzzz :priere: Merci d'avance

Re: Requete préparée

Posté : 29 juil. 2013, 12:03
par imikado
Quand vous dites ca ne fonctionne pas, pouvez vous préciser: il y a une erreur, rien ne s'affiche ?

Re: Requete préparée

Posté : 29 juil. 2013, 12:27
par Khidam
rien ne s'affiche...

Re: Requete préparée

Posté : 29 juil. 2013, 12:36
par imikado
en regardant un peu mieux, il y a un soucis de construction de la requete
vous commencez par
 $reponse = $bdd->query("SELECT FLORE.* FROM FLORE INNER JOIN SITE ON FLORE.CODE_REPET = SITE.CODE_REPET");
puis vous concaténez
$reponse = $reponse WHERE LAND_USE=$_POST["sol"];
Il faut dans un premier temps initier une variable contenant la requete sql
$requete="SELECT FLORE.* FROM FLORE INNER JOIN SITE ON FLORE.CODE_REPET = SITE.CODE_REPET";
Ensuite en fonction des cas, concatener
//if ...
$requete.=' WHERE LAND_USE=\''.$_POST["sol"].'\' ';
Et à la fin executer la requête
 $reponse = $bdd->query($requete);
Pour information, je pense que vous avez quelques erreurs php actuellement (d'ou la page blanche)

Re: Requete préparée

Posté : 30 juil. 2013, 09:02
par Khidam
Merci beaucoup pour ta réponse imikado, j'ai essayé ce que tu proposes mais ça ne fonctionne toujours pas : page blanche...
Pourtant j'ai essayé de bien vérifier d'éventuelles erreurs de php, mais je ne vois pas...

Je me permet de mettre l'intégralité du code, en restreignant à 1 seule requête et un seul critère :
try
{
    // On se connecte à MySQL
    $bdd = new PDO('mysql:host=localhost;dbname=Bio2', 'root', 'root');
}
catch(Exception $e)
{
    // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
}
 
// Si tout va bien, on peut continuer

//on teste d'abord pour savoir si une case a bien été cochée
if (isset($_POST["choix"]) && $_POST["choix"] != "") {
                //Si c'est la flore qui est voulue
                if ($_POST["choix"] == "flore1") {
                               $requete = "SELECT MIN(INDICE_REL), MAX(INDICE_REL), AVG(INDICE_REL), SITE.LAND_USE FROM SITE INNER JOIN FLORE_AG ON FLORE_AG.CODE_MODALITE = SITE.CODE_MODALITE";
                }
                }
                
//on teste ensuite pour savoir si un critère a été sélectionné
if (isset($_POST["sol"]) && $_POST["sol"] != "") {
                              $requete = $requete' WHERE LAND_USE=\''.$_POST["sol"].'\' ';
                }

//A la fin des tests, la variable est forcément renseignée > on va chercher les résultats
$reponse = $bdd->query($requete);

// On affiche chaque entrée une à une
while ($donnees = $reponse->fetch())
{
 echo $donnees['MIN(INDICE_REL)'].;
}
 
$reponse->closeCursor(); // Termine le traitement de la requête

J'ai mis :
echo $donnees['MIN(INDICE_REL)'].;
pour voir si quelque chose m'est retourné, mais non...

Re: Requete préparée

Posté : 30 juil. 2013, 09:38
par imikado
Erreur de syntaxe ligne 26 de votre code
$requete = $requete' WHERE LAND_USE=\''.$_POST["sol"].'\' ';
A remplacer par
$requete = $requete.' WHERE LAND_USE=\''.$_POST["sol"].'\' ';
Et ligne 35
echo $donnees['MIN(INDICE_REL)'].;
A remplacer par
echo $donnees['MIN(INDICE_REL)'];

Re: Requete préparée

Posté : 30 juil. 2013, 09:54
par Khidam
WAOW !!!
Génial, ça fonctionne !! Merci beaucoup Imikado !!! (et pardonnez moi de vous avoir tutoyer... je m'emporte parfois... :oops: )
Du coup, je vais avoir une autre question, mais je vais créer un autre message, et je mets celui-ci en résolu. Merci encore !!

Re: Requete préparée

Posté : 30 juil. 2013, 11:10
par Khidam
En fait ce n'était pas si simple

Si je rajoute un critère, ça ne fonctionne plus...

Par rapport à mon code précédent :
1. Dans ma requête, je rajoute le pH
if ($_POST["choix"] == "flore1") {
                               $requete = "SELECT MIN(INDICE_REL), MAX(INDICE_REL), AVG(INDICE_REL), SITE.LAND_USE, SITE.PH_EAU FROM SITE INNER JOIN FLORE_AG ON FLORE_AG.CODE_MODALITE = SITE.CODE_MODALITE";
                }
2. Dans mes critères, je le rajoute également
if (isset($_POST["sol"]) && $_POST["sol"] != "") {
                              $requete = $requete.' WHERE LAND_USE=\''.$_POST["sol"].'\' ';
                }
if (isset($_POST["ph"]) && $_POST["ph"] != "") {
                            	$requete = $requete.' WHERE PH_EAU=\''.$_POST["ph"].'\' ';
                }
Et maintenant, j'ai de nouveau une page blanche...

Re: Requete préparée

Posté : 30 juil. 2013, 11:30
par imikado
Vous ne pouvez pas concaténer deux where:
Si il y a deja un where, il faudra ajouter le critere via "AND"
$where=0;
if (isset($_POST["sol"]) && $_POST["sol"] != "") {
	$where=1;
	$requete = $requete.' WHERE LAND_USE=\''.$_POST["sol"].'\' ';
}
if (isset($_POST["ph"]) && $_POST["ph"] != "") {
	if($where==1){ $requete = $requete . ' AND '; }else{ $requete=$requete.' WHERE '; }

	$requete = $requete.' PH_EAU=\''.$_POST["ph"].'\' ';
}
note: quand vous avez une page blanche, c'est que vous avez une erreur, veuillez coller le code de l'erreur dans vos logs (ça aide à vous aider ;)

Re: Requete préparée

Posté : 30 juil. 2013, 11:53
par Khidam
Vous êtes vraiment extra imikado !!
Je n'ai pas encore essayé mais j'ai déjà 2 petites questions :
1. en fait les utilisateurs ne sont pas obligés de sélectionner le critère "sol", s'ils veulent considérer l'ensemble des résultats (équivaut à "tous")
du coup, est-ce qu'il ne va pas y avoir une erreur vu que le if($where==1) n'existera pas...
2. si je veux rajouter d'autres critères (mais de la même manière, ils ne seront pas obligés d'avoir sélectionner les critères précédents)
est-ce que je fais :
if (isset($_POST["ph"]) && $_POST["ph"] != "") {
        if($where==1){ 
        $where=2;
        $requete = $requete . ' AND '; }else{ $requete=$requete.' WHERE '; }

        $requete = $requete.' PH_EAU=\''.$_POST["ph"].'\' ';
}
if (isset($_POST["texture"]) && $_POST["texture"] != "") {
        if($where==2){ 
        $where=3;
        $requete = $requete . ' AND '; }else{ $requete=$requete.' WHERE '; }

        $requete = $requete.' TEXTURE=\''.$_POST["texture"].'\' ';
}
Mais ma question n°1 reste la même dans ce cas, j'ai peur...

Re: Requete préparée

Posté : 30 juil. 2013, 12:13
par imikado
$where est à zéro par defaut et permet de choisir entre une concatenation d'un "where" ou d'un "AND"

Si vous voulez ajouter d'autre critère, faite la meme initialisation à 1 ;)
 $where=0;
if (isset($_POST["ph"]) && $_POST["ph"] != "") {
        if($where==1){ 
        $requete = $requete . ' AND '; }else{ $requete=$requete.' WHERE '; }

        $requete = $requete.' PH_EAU=\''.$_POST["ph"].'\' ';
 $where=1;
}
if (isset($_POST["texture"]) && $_POST["texture"] != "") {
        if($where==1){ 
        $requete = $requete . ' AND '; }else{ $requete=$requete.' WHERE '; }

        $requete = $requete.' TEXTURE=\''.$_POST["texture"].'\' ';
 $where=1;
}
 

Re: Requete préparée

Posté : 30 juil. 2013, 15:10
par Khidam
Votre réponse de 11:30 =>
$where=0;
if (isset($_POST["sol"]) && $_POST["sol"] != "") {
	$where=1;
	$requete = $requete.' WHERE LAND_USE=\''.$_POST["sol"].'\' ';
}
if (isset($_POST["ph"]) && $_POST["ph"] != "") {
	if($where==1){ $requete = $requete . ' AND '; }else{ $requete=$requete.' WHERE '; }

	$requete = $requete.' PH_EAU=\''.$_POST["ph"].'\' ';
}
ne fonctionne que si je choisi un critère pour le sol et un critère pour le pH. Si je ne choisi que "sol" ou que "pH", ça ne fonctionne pas...
je suis désolée, j'ai l'impression d'être complètement idiote...

Re: Requete préparée

Posté : 30 juil. 2013, 15:38
par Khidam
D'ailleurs, si je ne choisi aucun critère, ça ne fonctionne pas non plus..
Je n'ai pas une page blanche, mais aucune valeur dans MIN, MAX et MOY..

et je ne sais pas comment afficher les codes d'erreurs... pfff la plaie...

Re: Requete préparée

Posté : 30 juil. 2013, 15:44
par imikado
Quel type de serveur apache utilisez-vous ? easyphp/wamp, apache sur linux ?

Il faut que vous affichiez les erreurs à l'ecran en dev, c'est plus facile à lire et à debuger :)

Re: Requete préparée

Posté : 30 juil. 2013, 16:09
par Khidam
je bosse avec MAMP

et quand j'affiche la console d'erreur de safari, voilà le résultat (mais je ne pense pas que ce soit ce que vous voulez...) :
Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8888/Bio2/style.css

c'est juste que je n'ai pas encore de fichier css...