Page 1 sur 2
mot clé
Posté : 19 mars 2009, 00:50
par Invité
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é ?
Posté : 19 mars 2009, 09:28
par jojolapine
Et le LIKE, il ets ou le LIKE?
Posté : 19 mars 2009, 10:16
par Invité
Le like que je le mette ou pas c'est pareil

Posté : 19 mars 2009, 10:46
par Berzemus
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"
Posté : 19 mars 2009, 11:14
par Invité
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 ?
Posté : 19 mars 2009, 11:14
par Invité
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 ?
Posté : 19 mars 2009, 11:21
par Poulpe
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.
Posté : 19 mars 2009, 11:38
par Invité
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 ?
Posté : 19 mars 2009, 12:22
par Poulpe
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.
Posté : 19 mars 2009, 18:29
par Invité
Merci pour vos réponses et l'éclairage il y a tellement de truc à savoir
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

Posté : 21 mars 2009, 11:13
par Invité
Comment ce fait il que je n'ai pas de réponses sur ce sujet? Je fais fausse route c'est un code bidon ?
Posté : 21 mars 2009, 14:07
par Ryle
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....
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

Posté : 21 mars 2009, 15:33
par Invité
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
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
Posté : 22 mars 2009, 20:57
par Ryle
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...

Posté : 22 mars 2009, 21:09
par Invité
Merci pour ta réponse Ryle en faite c'est pas des empty mais des isset qu'il faut mettre