Page 1 sur 2
Souci affichage requete SQL via des variables
Posté : 20 sept. 2014, 11:43
par Carpediem
Bonjour,
Je ne comprends pas d'ou vient mon souci lors d'une requete SQL via des variables. Tout mon script se déroule sans encombre mais rien ne s'affiche, comme si mes variables étaient vides.
Merci d'avance pour votre aide
Code : Tout sélectionner
<form action="recherche-client-prestathair.php" method="post" enctype="multipart/form-data">
<p>
<fieldset>
<legend>Rechercher</legend>
<label for="type_recherche">Type de recherche par :</label>
<select name="type_recherche" id="type_recherche" required="required">
<option value="identifiant_client">Identifiant</option>
<option value="email">E-mail</option>
<option value="nom">Nom</option>
<option value="prenom">Prénom</option>
<option value="cp">Code Postal</option>
<option value="telephone">Téléphone</option>
</select>
<input type="text" name="recherche" required="required" maxlength="40" />
</fieldset>
<p><input type="submit" value="Lancer la recherche" name="envoyer"></p>
</p>
</form>
Code : Tout sélectionner
<?php
if (isset($_POST["envoyer"])){
// On récupère les champs du formulaire, et on arrange leur mise en forme
// trim() enlève les espaces en début et fin de chaine
if (isset($_POST["type_recherche"])) { $type_recherche=trim(htmlspecialchars($_POST["type_recherche"])); }
if (isset($_POST["recherche"])) { $recherche=trim(htmlspecialchars($_POST["recherche"])); }
try
{
$bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
$bdd->query("SET NAMES UTF8");
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$reponse = $bdd->query('SELECT * FROM client WHERE "'.$type_recherche.'" = "'.$recherche.'"');
while ($donnees = $reponse->fetch())
{
?>
Identifiant : <?php echo $donnees['identifiant_client']; ?><br />
Civilité : <?php echo $donnees['civilite']; ?><br />
Nom : <?php echo $donnees['nom']; ?><br />
Prenom : <?php echo $donnees['prenom']; ?>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
}
else {
header('Location: gestion-client-prestathair.php');
}
?>
Re: Souci affichage requete SQL via des variables
Posté : 20 sept. 2014, 11:44
par Carpediem
Excusez moi pour le code, je me suis trompé de balise
<form action="recherche-client-prestathair.php" method="post" enctype="multipart/form-data">
<p>
<fieldset>
<legend>Rechercher</legend>
<label for="type_recherche">Type de recherche par :</label>
<select name="type_recherche" id="type_recherche" required="required">
<option value="identifiant_client">Identifiant</option>
<option value="email">E-mail</option>
<option value="nom">Nom</option>
<option value="prenom">Prénom</option>
<option value="cp">Code Postal</option>
<option value="telephone">Téléphone</option>
</select>
<input type="text" name="recherche" required="required" maxlength="40" />
</fieldset>
<p><input type="submit" value="Lancer la recherche" name="envoyer"></p>
</p>
</form>
<?php
if (isset($_POST["envoyer"])){
// On récupère les champs du formulaire, et on arrange leur mise en forme
// trim() enlève les espaces en début et fin de chaine
if (isset($_POST["type_recherche"])) { $type_recherche=trim(htmlspecialchars($_POST["type_recherche"])); }
if (isset($_POST["recherche"])) { $recherche=trim(htmlspecialchars($_POST["recherche"])); }
try
{
$bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
$bdd->query("SET NAMES UTF8");
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$reponse = $bdd->query('SELECT * FROM client WHERE "'.$type_recherche.'" = "'.$recherche.'"');
while ($donnees = $reponse->fetch())
{
?>
Identifiant : <?php echo $donnees['identifiant_client']; ?><br />
Civilité : <?php echo $donnees['civilite']; ?><br />
Nom : <?php echo $donnees['nom']; ?><br />
Prenom : <?php echo $donnees['prenom']; ?>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
}
else {
header('Location: gestion-client-prestathair.php');
}
?>
Re: Souci affichage requete SQL via des variables
Posté : 20 sept. 2014, 15:20
par Nestecha
$reponse = $bdd->query('SELECT * FROM client WHERE "'.$type_recherche.'" = "'.$recherche.'"');
T'as pas besoin de concaténer en fait.
$reponse = $bdd->query('SELECT * FROM client WHERE "$type_recherche" = "$recherche"');
Re: Souci affichage requete SQL via des variables
Posté : 20 sept. 2014, 19:11
par xTG
Bah si, les simples quotes ne permettent pas d'interpréter les variables.
Les as-tu affiché tes variables ? Fais un var_dump($_POST) pour avoir la vision de tout ce qui est envoyé par le formulaire.
Re: Souci affichage requete SQL via des variables
Posté : 20 sept. 2014, 23:26
par Carpediem
Bonsoir,
Voila ce que ca me donne :
array (size=3)
'type_recherche' => string 'identifiant_client' (length=18)
'recherche' => string '00001' (length=5)
'envoyer' => string 'Lancer la recherche' (length=19)
Rien d'anormal apparemment
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 11:22
par xTG
Bon donc les variables sont renseignées à priori, cela doit venir de ton traitement peu orthodoxe.
Tes protections utilisées ne servent pas à protéger contre les injections SQL, cela sert de protection à l'affichage uniquement.
if (isset($_POST["recherche"]))
{
$recherche=$bdd->quote($_POST["recherche"]);
}
else
{
// tu fais quoi dans le cas où la variable n'est pas renseignée ?
}
Et si toujours rien... Copies la requête dans une console Mysql (ou bien via phpmyadmin) pour l'exécuter et vérifier qu'elle ne retourne rien.
Si elle ne retourne rien le code n'est pas en défaut. Ce sont les enregistrements de la table qui ne correspondent pas à ta clause WHERE.
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 18:17
par Carpediem
Bonsoir,
J'ai essayé via phpmyadmin en mettant
et ça marche sans souci. Je ne comprends vraiment pas. Je sais que mon codage est pas terrible mais pour ma défense, c'est dans mon espace admin du site sécurisé par htaccess et htpasswd donc peu de chance d'avoir des injections sql. J'ai beau cherché, je ne trouve pas, c'est galère quand même
Merci pour votre aide en tout cas
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 18:19
par xTG
1 != 0001

Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 18:20
par Carpediem
Avez vous quelque chose à dire sur mon while ci dessous, j'ai l'impression que c'est lui qui plante
while ($donnees = $reponse->fetch())
{
?>
Identifiant : <?php echo $donnees['identifiant_client']; ?><br />
Civilité : <?php echo $donnees['civilite']; ?><br />
Nom : <?php echo $donnees['nom']; ?><br />
Prenom : <?php echo $donnees['prenom']; ?>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
}
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 18:28
par Carpediem
J'ai un peu changer mon traitement mais rien n'y fais, rien que ma parti html (identifiant, civilité etc..) ne s'affiche pas
<?php
if (isset($_POST["envoyer"])){
$etat = "erreur";
// On récupère les champs du formulaire, et on arrange leur mise en forme
// trim() enlève les espaces en début et fin de chaine
if (isset($_POST["type_recherche"])) { $type_recherche=trim(htmlspecialchars($_POST["type_recherche"])); }
if (isset($_POST["recherche"])) { $recherche=trim(htmlspecialchars($_POST["recherche"])); }
if (empty($_POST["type_recherche"])) {
// On met dans erreur le message qui sera affiché
$erreur="Le type de recherche est vide...";
}
// reception date
elseif (empty($_POST["recherche"])) {
// On met dans erreur le message qui sera affiché
$erreur="La case recherche est vide...";
}
else {
$etat="ok";
}
}
if ($etat=="ok"){
try
{
$bdd = new PDO('mysql:host=localhost;dbname=coiffure', 'root', '');
$bdd->query("SET NAMES UTF8");
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$reponse = $bdd->query('SELECT * FROM client WHERE "'.$type_recherche.'" = "'.$recherche.'"');
while ($donnees = $reponse->fetch())
{
?>
Identifiant : <?php echo $donnees['identifiant_client']; ?><br />
Civilité : <?php echo $donnees['civilite']; ?><br />
Nom : <?php echo $donnees['nom']; ?><br />
Prenom : <?php echo $donnees['prenom']; ?>
<?php
}
$reponse->closeCursor(); // Termine le traitement de la requête
}
elseif ($etat=="erreur"){
// On affiche le message correspondant à l'erreur
echo "<h4>$erreur";
}
else {
header('Location: gestion-client-prestathair.php');
}
?>
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 18:29
par Carpediem
pardon

. je m'y perds à force
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 18:50
par xTG
Ton code initial est correct, c'est ta requête qui ne l'est pas.
La requête exacte qui est exécutée c'est la suivante :
SELECT * FROM `client` WHERE identifiant_client='00001'
Ce qui change énormément si ton champs est un entier... Tu as quoi dans ta table ? 1 ou 00001 ?
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 19:12
par Carpediem
Dans ma table c'est bien 00001, je me suis trompé en refaisant la requête
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 19:39
par xTG
Dans ce cas réadaptes ton code avec mon conseil de protection des variables (même pas un conseil en fait, c'est la seule façon de faire).
Et affiches avec var_dump tes variables résultantes pour le cas où cela ne fonctionnerait pas.
Ta requête est correcte et on a vu que sous phpmyadmin elle te retourne des infos.
Donc le souci est bien dans le contenu des variables.
Ah et au passage...
Je sais que mon codage est pas terrible mais pour ma défense, c'est dans mon espace admin du site sécurisé par htaccess et htpasswd donc peu de chance d'avoir des injections sql.
C'est absolument pas une raison... Le jour où on trouve une faille dans le htaccess tu seras bien content d'avoir fait du code propre.
On dit souvent qu'un bon développeur c'est une personne qui code facilement sans se poser de question un code propre adaptatif à toute utilisation.
En gros c'est une personne qui code une requête SQL sans se poser la question de s'il va être possible d'y injecter ou non du code malveillant. Il la protège, point barre.
Si tu savais le nombre de jours perdus sur certains projets à cause de code mal pensés de ce genre.

Il y en a eu, et il y en aura...
Re: Souci affichage requete SQL via des variables
Posté : 21 sept. 2014, 20:24
par Carpediem
Bonsoir,
ca marche, pas de souci, je vais faire ça. Je rencontre un souci similaire sur mon formulaire de contact. Mais pour remettre dans le contexte, j'ai un site pour ma copine coiffeuse à domicile qui tourne depuis un peu moins d'un an sans aucun problème. Afin de continuer le développement de l'entreprise, nous avons décidé de refondre le site, d'y ajouter des fonctionnalités et de refaire le référencement afin d'être premier sur une bonne partie des requêtes dans les moteurs de recherche. Donc mon formulaire fonctionne très bien encore en ce moment sur mon site mais ne fonctionne plus en local (J'ai bien vérifié mes logs a la bdd a chaque fois), je comprends pas pourquoi la encore.
PS : Je suis tourneur/fraiseur de métier, passer d'un métier manuel à quelque chose d'intellectuel n'est pas toujours chose aisé surtout dans ce domaine. J'essaye donc de m'en sortir en fonction de mes capacités dans ce domaine. Merci