[RESOLU] Requete préparée

Eléphanteau du PHP | 31 Messages

29 juil. 2013, 11:39

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

Eléphant du PHP | 96 Messages

29 juil. 2013, 12:03

Quand vous dites ca ne fonctionne pas, pouvez vous préciser: il y a une erreur, rien ne s'affiche ?
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 31 Messages

29 juil. 2013, 12:27

rien ne s'affiche...

Eléphant du PHP | 96 Messages

29 juil. 2013, 12:36

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)
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 31 Messages

30 juil. 2013, 09:02

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...

Eléphant du PHP | 96 Messages

30 juil. 2013, 09:38

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)'];
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 31 Messages

30 juil. 2013, 09:54

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 !!

Eléphanteau du PHP | 31 Messages

30 juil. 2013, 11:10

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...

Eléphant du PHP | 96 Messages

30 juil. 2013, 11:30

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 ;)
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 31 Messages

30 juil. 2013, 11:53

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...

Eléphant du PHP | 96 Messages

30 juil. 2013, 12:13

$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;
}
 
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 31 Messages

30 juil. 2013, 15:10

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...

Eléphanteau du PHP | 31 Messages

30 juil. 2013, 15:38

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...

Eléphant du PHP | 96 Messages

30 juil. 2013, 15:44

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 :)
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

Eléphanteau du PHP | 31 Messages

30 juil. 2013, 16:09

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...