mot clé

Invité
Invité n'ayant pas de compte PHPfrance

19 mars 2009, 00:50

Bonsoir, je cherche a faire une recherche sur un mot clé
je suis comme ça pour faire une recherche général et ça fonctionne

Code : Tout sélectionner

if ($text_search <> "") { $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') "; }
ensuite je fait une recherche sur un prix et la aussi ça fonctionne

Code : Tout sélectionner

//MODIFICATION if (!empty($_GET['Prixmini']) && !empty($_GET['Prixmaxi'])) { $search .= " AND (a.ad_price BETWEEN '" . $_GET['Prixmini']. "' AND '" . $_GET['Prixmaxi'] . "')"; }
Maintenant je fait une recherche sur un mot clé mais avec la méthode qui suit ça ne trouve pas

Code : Tout sélectionner

if (!empty($_GET['Motcle'])) { $search .= " AND (a.ad_text '". $_GET['Motcle']. "')"; }
J'ai essayé de remplacer GET par POST ça me liste tout donc pas bon
Avez vous une idée pour qu'il trouve mon mot clé ?

ViPHP
ViPHP | 3607 Messages

19 mars 2009, 09:28

Et le LIKE, il ets ou le LIKE?

Invité
Invité n'ayant pas de compte PHPfrance

19 mars 2009, 10:16

Le like que je le mette ou pas c'est pareil :(

ViPHP
ViPHP | 4039 Messages

19 mars 2009, 10:46

Tu sais que si jamais un mal intentionné tombe sur ton site, tu vas te faire pirater dans tout les sens ? Ta DB s'en souviendra, s'il en restera quelque chose.

Mettre du contenu dans une requête SQL directement depuis les variables $_POST ou $_GET, c'est un peu comme partir de chez soi mais en laissant tout grand ouvert, avec une pancarte écrit dessus "ENTREZ, JE SUIS PARTI"
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Invité
Invité n'ayant pas de compte PHPfrance

19 mars 2009, 11:14

houlla tu me fait peur tu veux dire que même le code que j'ai montrer plus qui fonctionne est une porte ouverte ? mais alors comment peut t'on faire une recherche sans ce faire pirater ?

Invité
Invité n'ayant pas de compte PHPfrance

19 mars 2009, 11:14

houlla tu me fait peur tu veux dire que même le code que j'ai montré plus haut et qui fonctionne est une porte ouverte ? mais alors comment peut t'on faire une recherche sans ce faire pirater ?

Eléphanteau du PHP | 15 Messages

19 mars 2009, 11:21

Il voulait dire que passer directement tes $_POST ou $_GET dans tes requêtes sans tester leur contenu au préalable est un réel danger.

Invité
Invité n'ayant pas de compte PHPfrance

19 mars 2009, 11:38

Mais les codes qui pour moi fonctionnent

Code : Tout sélectionner

if ($text_search <> "") { $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') "; }
et

Code : Tout sélectionner

if (!empty($_GET['Prixmini']) && !empty($_GET['Prixmaxi'])) { $search .= " AND (a.ad_price BETWEEN '" . $_GET['Prixmini']. "' AND '" . $_GET['Prixmaxi'] . "')"; }
C'est DANGER ? il faut que je trouve autre chose pour les sécuriser ?

Eléphanteau du PHP | 15 Messages

19 mars 2009, 12:22

Mais les codes qui pour moi fonctionnent

Code : Tout sélectionner

if ($text_search <> "") { $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') "; }
et

Code : Tout sélectionner

if (!empty($_GET['Prixmini']) && !empty($_GET['Prixmaxi'])) { $search .= " AND (a.ad_price BETWEEN '" . $_GET['Prixmini']. "' AND '" . $_GET['Prixmaxi'] . "')"; }
C'est DANGER ? il faut que je trouve autre chose pour les sécuriser ?
Par exemple, si ton $_GET['Prixmini'] et $_GET['Prixmaxi'] doivent être des integer, alors tu peux déjà tester si s'en ait vraiment.

Code : Tout sélectionner

$Prixmini = (is_int($_GET['Prixmini'])) ? $_GET['Prixmini'] : 0; $Prixmini = (is_int($_GET['Prixmaxi'])) ? $_GET['Prixmaxi'] : 0; if (!empty($Prixmini) && !empty($Prixmini)) { $search .= " AND (a.ad_price BETWEEN '" . $Prixmini . "' AND '" . $Prixmini . "')"; }
Si ils doivent être de type string, penses à ajouter des addslashes() pour éviter de faire planter ta requête.

Invité
Invité n'ayant pas de compte PHPfrance

19 mars 2009, 18:29

Merci pour vos réponses et l'éclairage il y a tellement de truc à savoir :shock:
Juste un truc avant je précise que j'adapte un script fait par Adsmanager sur une base joomla.

Pour la sécurité en faisant des recherches j'ai lu sur un forum:
mysql_real_escape_string est non présent dans AdsManager ou JDirectory
ils utilisent mysql_query

le mysql_query() envoie une question unique (des questions multiples ne sont pas soutenues)

C'est suffisant comme protection ?
Parce que ça me fais un peu flipper
:?

Invité
Invité n'ayant pas de compte PHPfrance

21 mars 2009, 11:13

Comment ce fait il que je n'ai pas de réponses sur ce sujet? Je fais fausse route c'est un code bidon ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 mars 2009, 14:07

Alors tout d'abord on va se calmer avec la paranoïa : les chinois du FBI ne te surveillent pas et n'essayent pas désespérement de pirater ton site pour saboter ta base de données.... :x

Ton code ne semble en effet pas sécurisé (bien qu'on ait pas la moindre idée des traitements qui ont pu être effectués au préalable). Il est donc probable qu'il te faille revoir le traitement des données que tu récupères, mais c'est à peu près tout ce que tu aurais besoin de faire...

Maintenant pour en revenir au sujet, il te faudrait afficher la requête avant de l'exécuter, ou simplement la valeur de $search et dans un premier temps t'assurer que la syntaxe est correcte et que le mot clé apparait bien.

En l'occurence, il semble simplement te manquer l'opérateur entre le nom du champ et la valeur que tu veux tester :
$search .= " AND (a.ad_text __ '". $_GET['Motcle']. "')";
Tu dois donc avoir une erreur MySQL, qu'il aurait suffit de tester dans phpMyAdmin ou de faire apparaitre le message d'erreur lors de l'exécution (mysql_error()), pour qu'il t'indique une erreur de syntaxe à cet endroit ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

21 mars 2009, 15:33

Merci de me rassurer :)
J'ai lu ça concernant le script que j'adapte
Question: il y a mysql_real_escape_string dans le script
Réponse: non le mysql_query() envoie une question unique (des questions multiples ne sont pas soutenues)
C'est peut être suffisant :roll:

En faite j'ai la réponse qui m'a été donné et ça fonctionne !

Code : Tout sélectionner

if (!empty($_GET['Motcle'])) { $search .= " AND a.ad_text LIKE '%".$_GET['Motcle']."%'"; }
Par contre j'ai toujours le soucis sur

Code : Tout sélectionner

if (!empty($_GET['Prixmini']) && !empty($_GET['Prixmaxi'])) { $search .= " AND (a.ad_price BETWEEN '" . $_GET['Prixmini']. "' AND '" . $_GET['Prixmaxi'] . "')"; }
Si je rentre dans Mini le chiffre 0 et dans Maxi 1000 il me liste tout même les supérieur à 1000
le problème est sur le zéro sinon ça fonctionne parfaitement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

22 mars 2009, 20:57

Ton champ ad_price est bien de type numérique dans ta base de données ?

Si les valeurs de $_GET['Prixmini'] et $_GET['Prixmaxi'] sont des nombres, elles ne devraient pas être entre apostrophes dans ta requête.

Ah non tiens... c'est pas ça... je viens de trouver.... regarde la documentation de la fonction empty() que tu utilises dans ton if() et la façon dont elle traite les valeurs égales à 0... ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

22 mars 2009, 21:09

Merci pour ta réponse Ryle en faite c'est pas des empty mais des isset qu'il faut mettre