Logo du forum
 

Forum TT-Hardware

| Inscription | | Recherche | | FAQ | | Accueil | | Liste des membres |
| Calendrier |
 
Vous n'êtes pas identifié! [Connexion] ou [Inscription] Forum » Programmation » [PHP] » Resultat d'un requete vide
Login Mot de passe

1 visiteurs sur ce topic (0 membre(s), 1 invité(s) )

Auteur
Sujet : Resultat d'un requete vide
Keanu



 






Message du 03-12-2007 @ 9:41


Salut,

je suis entrain de préparer une fonction en php qui permet de taper dans un champ un critere de recherche et lorsque l'on appuie sur le bouton, faire une recherche sur une BD.

Mais le resultat qui me revient est toujours vide...

je rentre bien dans le if, mes variable $motcle et $sql sont remplient mais ma variable $resultat reste vide et donc, je ne rentre pas dans la boucle... Lors de l'execution, pas d'erreur, juste rien qui s'affiche.

Vous avec une idée où je me suis planté ?

Merci


voici le code :

Code :


<?php

if (isset($_GET['motcle']))
{

$motcle = $_GET['motcle'];

$sql = "SELECT * FROM 'clients' WHERE INSTR(nom,$motcle) OR INSTR(prenom,$motcle)";

$resultat = mysql_query ($sql);


while ($clients = @mysql_fetch_array ($resultat))
{
   echo "<tr>";
   echo "<td>" . $clients['Id'] . "<td>";
   echo "<td>" . $clients['nom'] . "<td>";
   echo "<td>" . $clients['prenom'] . "<td>";
   echo "<tr>";
}
   
}


   
?>


- Haut de page -
Soulmanto



 






Message du 03-12-2007 @ 10:02

Normal, vu que tu utilises la fonction INSTR dans ta requête, tu dois plutôt construire ta requête de la façon suivante:

Code :


WHERE INSTR(champ, mot_cle) > 0



ça devrait fonctionner
- Haut de page -
Keanu



 






Message du 03-12-2007 @ 10:16

ça n'a pas l'air d'être ça...

je fais la recherche sur des caractères, je sais pas si ça change qlq chose...

Merci

- Haut de page -
Soulmanto



 






Message du 03-12-2007 @ 10:31

par contre, fais gaffe à ton code, y'a une jolie faille SQL injection puisque tu utilises le $_GET["motcle"] tel quel dans ta requête... utilises mysql_real_escape_string pour éviter tout problème!
Le fait de rechercher des caractères ne doit rien changer au résultat de ta requête. As-tu essayé d'afficher ta requête et de l'exécuter telle quelle dans MySQL pour vérifier si y'a pas d'erreur?
- Haut de page -
B2000



 






Message du 03-12-2007 @ 10:53

le probleme est plus dans la construction de ta requete
deja, encadre la chaine de caracteres par des apostophes et pas par des guillemets
insere les variables en fermant et ouvrant la chaine de caracteres
normalement pas besoin du test "> 0", la logique veut que tout ce qui est different de 0 est 1

moi je mettrais ca comme requete :
Code :


$sql = 'SELECT * FROM clients WHERE INSTR(nom,"'.$motcle.'") OR INSTR(prenom,"'.$motcle.'")';



maintenant, je proposerais aussi ca a la place :
Code :


$sql = 'SELECT * FROM clients WHERE nom LIKE "%'.$motcle.'%" OR prenom LIKE "%'.$motcle.'%"';



et il est imperatif, comme l'indique Soulmanto, d'utiliser 'mysql_real_escape_string' pour proteger ta requete sur tout ce qui vient du POST ou du GET

[message édité le 03-12-2007 @ 10:56 Par B2000]
- Haut de page -
Keanu



 






Message du 03-12-2007 @ 10:55

c'est grave comme faille ? C'est un faille de sécurité ?
l'appli sera pour utiliser dans un intranet et non sur internet.

Je vais essayer la requete dans mysql

merci

- Haut de page -
Soulmanto



 






Message du 03-12-2007 @ 11:04

oui, c'est une faille de sécurité, et si elle est exploitée comme il faut, ça peut faire très mal...
- Haut de page -
B2000



 






Message du 03-12-2007 @ 11:04

ca peut etre grave en effet... ici ca n'aurait pas beaucoup d'incidence mais par exemple, si tu utilisais cette requete pour identifier un utilisateur (login/password) on pourrait passer au travers cette authentification en un rien de temps

le risque est que l'on puisse injecter dans la requete des caracteres comme l'apostrophe ou la guillemets ou encore un bout de requete qui detournerait alors ta propre requete, exemple en injectant ceci :
Code :

1) OR 1 OR (


ta requete deviendrait a ton insue :
Code :


$sql = "SELECT * FROM 'clients' WHERE INSTR(nom,1) OR 1 OR ($motcle) OR INSTR(prenom,$motcle)";


et retournerait la liste totale de tes clients

[edit]
en relisant je viens de me rendre compte qu'en plus, sans borner les variables par des apostrophes ou des guillemets, y a encore plus de risque (comme le montre l'injection ci dessus)
[/edit]

[message édité le 03-12-2007 @ 11:07 Par B2000]
- Haut de page -
Keanu



 






Message du 03-12-2007 @ 11:08

merci pour toutes ces infos !!!
- Haut de page -
Keanu



 






Message du 03-12-2007 @ 11:30

j'ai utilisé la syntaxe avec like %

mais j'ai fais une erreur de bleu... je me suis trompé dans le nom de ma variable dans la table, au lieu de nom, c'etait NomC...

encore merci


- Haut de page -
Soulmanto



 






Message du 03-12-2007 @ 11:42

Si t'as pas eu de message d'erreur pour ça, c'est que t'as pas bien configuré ton environnement de développement! il faut afficher tous les messages d'erreur et warnings quand tu développes, ça aide à voir plus facilement d'où viennent les merdes! ;)

- Haut de page -
Keanu



 






Message du 03-12-2007 @ 11:56

pour le développement, j'utilise easyphp configuré par defaut

je m'en suis redu compte lorsque j'ai executé ma requete dans mysql comme tu me l'as conseillé plus haut... et là, j'ai eu un message d'erreur.

Merci
- Haut de page -
B2000



 






Message du 03-12-2007 @ 12:19

pour les erreurs, modifie ton php.ini (normalement dans c:\windows) en modifiant l'option "error_reporting" comme ceci :
Code :


error_reporting = E_ALL



puis relance le service httpd/apache
- Haut de page -
Chani



 






Message du 03-12-2007 @ 20:01

Deux trois conseils comme ça :

- Utilise Wamp Server en dernière version (PHP5 et Mysql 5 ;))
- Utilise les requête préparées afin d'être protégé complétement pas les injections (uniquement avec php5)
- utilise les PDO de connexion et dialogue avec les bdd
- gére tes erreurs, afin de pouvoir les rediriger vers un journal de log une fois l'appli déployée

;)
- Haut de page -

Plan du forum | Contacter l'administrateur

Powered by SoulBB 3.0.1
© Soulmanto, 2003-2006

Valid XHTML 1.0 Transitional

Page générée en 0.084 secondes