Requete php BDD

Requete php BDD - PHP - Programmation

Marsh Posté le 12-03-2009 à 23:47:07    

Bonsoir, je viens vous voir avec une énigme qui j'espère trouvera une solution avec vous.
Voilà j'essaye de rajouter une code sur un script déjà écrit.
j'aimerai rajouter à la recherche existante une recherche par prix mini et prix maxi.
Voila un bout de code:

Code :
  1. if ($text_search <> "" ) {
  2.  $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') AND a.published = 1";
  3. }
  4. else
  5.  //MODIFICATION
  6. if (isset($_GET['Prixmini']) && isset($_GET['Prixmaxi'])) {
  7.  $search .= " AND a.ad_price > " . $_GET['Prixmini'] . " AND a.ad_price < " . $_GET['Prixmaxi'] ." AND a.published = 1";
  8. }
  9. else
  10. {
  11.  $search .= " AND a.published = 1";
  12. }
  13.  //FIN MODIFICATION


La recherche seulement par prix ça fonctionne
La recherche par prix plus les autres critères ça fonctionne
MAIS
Si je fais la recherche avec les autres critères sans les prix mini et maxi ça ne fonctionne plus.
 
Merci pour toutes les pistes  

Reply

Marsh Posté le 12-03-2009 à 23:47:07   

Reply

Marsh Posté le 13-03-2009 à 14:06:37    

marquito a écrit :

Bonsoir, je viens vous voir avec une énigme qui j'espère trouvera une solution avec vous.
Voilà j'essaye de rajouter une code sur un script déjà écrit.
j'aimerai rajouter à la recherche existante une recherche par prix mini et prix maxi.
Voila un bout de code:
 
La recherche seulement par prix ça fonctionne
La recherche par prix plus les autres critères ça fonctionne
MAIS
Si je fais la recherche avec les autres critères sans les prix mini et maxi ça ne fonctionne plus.
 
Merci pour toutes les pistes  


Traduction ?
Ca plante (message d'erreur ?), le résultat n'est pas conforme aux attentes, autre ?
 
Un départ :
après ton code, fais un echo $search; et étudie les reuqêtes générées - voire passe les sous phpMyAdmin (ou autre).

Reply

Marsh Posté le 13-03-2009 à 14:08:30    

affiche la requête SQL générée au complet qui a le pb. Je suis sûr que c'est une erreur de syntaxe SQL dû à une erreur de construction de la requête par ton programme.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 13-03-2009 à 23:52:48    

Non ça ne plante pas !! Le résultat n'est pas conforme aux attentes.
En faisant un echo $search;
J'ai ;
adcat.catid IN (10) AND a.ad_price > '' AND a.ad_price < '' AND a.published = 1  

Reply

Marsh Posté le 13-03-2009 à 23:58:47    

Je précise que j'ai modifié mon code du départ par :

Code :
  1. if ($text_search <> "" ) {
  2. $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') ";
  3. }
  4. if (isset($_GET['Prixmini']) && isset($_GET['Prixmaxi'])) {
  5. $search .= " AND a.ad_price > '" . $_GET['Prixmini'] . "'  AND a.ad_price < '" . $_GET['Prixmaxi'] ."' ";
  6. }
  7. $search .= " AND a.published = 1";

Reply

Marsh Posté le 14-03-2009 à 13:33:54    

ben a.ad_price < '', c'est pas une bonne condition.  Faut la retirer du where (l'autre aussi du reste) et quan don a une condition sur un champ avec un > et un <, faut utiliser BETWEEN.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-03-2009 à 09:36:22    

Merci pour ta réponse rufo, tu sais comment je pourrais adapter BERWEEN à ma condition ??

Reply

Marsh Posté le 15-03-2009 à 11:45:28    

$search .= " AND a .ad_price between ." $_GET['Prixmini']." and ".$_GET['Prixmaxi']


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 15-03-2009 à 14:13:27    

Cool c'est sympa mais j'ai ce message
Parse error: syntax error, unexpected T_VARIABLE
 
C'est certainement moi qui me trompe j'ai ecris
if ($text_search <> "" ) {
$search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') ";
}
 
//MODIFICATION
if (isset($_GET['Prixmini']) && isset($_GET['Prixmaxi'])) {  
$search .= " AND a .ad_price between ." $_GET['Prixmini']." and ".$_GET['Prixmaxi']
}
 
 $search .= " AND a.published = 1";

Reply

Marsh Posté le 15-03-2009 à 14:54:00    

t'as oublié un point virgule après $_GET['Prixmaxi']

Reply

Marsh Posté le 15-03-2009 à 14:54:00   

Reply

Marsh Posté le 15-03-2009 à 20:23:04    

oui luc@s j'ai essayé aussi avec le point virgule mais c'est le même message d'erreur !!

Reply

Marsh Posté le 16-03-2009 à 14:29:13    

$search .= " AND a.ad_price between ".$_GET['Prixmini']." and ".$_GET['Prixmaxi'];


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 16-03-2009 à 18:00:33    

ah désolé :(
mais la prochaine fois envoi le message d'erreur exact, çà fait gagner pas mal de temps.

Reply

Marsh Posté le 17-03-2009 à 08:12:38    

Comme ça j'ai plus de message d'errreur
$search .= " AND (a.ad_price BETWEEN '" . $_GET['Prixmini']. "' AND '" . $_GET['Prixmaxi'] . "')";
Par contre le truc qui reste dingue c'est que si je ne rempli pas les champs mini et maxi il me donne pas le résultat !

Reply

Marsh Posté le 17-03-2009 à 09:35:08    

mais c'est normal gros malin! Tu vas ta retrouver avec la condition dans le WHERE : " AND (a.ad_price between '' and '')".
Y'a forcément aucun enregistrement qui correspondra à cette condition.
Dans un moteur de recherche, si un champ n'est pas rempli, on ne prend carrément pas en compte sa valeur. Dans ton cas :

Code :
  1. if (!empty($_GET['Prixmini'])) && (!empty($_GET['Prixmaxi']))
  2. {
  3.     $search .= " AND a.ad_price between ".$_GET['Prixmini']." and ".$_GET['Prixmaxi'];
  4. }


Et là, ça va marcher.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-03-2009 à 11:07:38    

Je ne comprends pas actuellement je suis comme ça :

Code :
  1. if ($text_search <> "" ) {
  2. $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') ";
  3. }
  4. //MODIFICATION
  5. if (isset($_GET['Prixmini']) && isset($_GET['Prixmaxi'])) {
  6. $search .= " AND (a.ad_price BETWEEN '" . $_GET['Prixmini']. "' AND '" . $_GET['Prixmaxi'] . "')";
  7. }
  8. $search .= " AND a.published = 1";


Je résume si je fais une recherche sur simplement la première requête

Code :
  1. if ($text_search <> "" ) {
  2. $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') ";
  3. }


sans remplir les champs prix mini maxi j'ai aucun résultat
par contre si je les rempli c'est bon !
Si j'enlève  

Code :
  1. //MODIFICATION
  2. if (isset($_GET['Prixmini']) && isset($_GET['Prixmaxi'])) {
  3. $search .= " AND (a.ad_price BETWEEN '" . $_GET['Prixmini']. "' AND '" . $_GET['Prixmaxi'] . "')";


En faisant la recherche ça fonctionne normalement
Moi j'aimerai que ça me donne le résultat si je fait une recherche sur la première requête même si je n'ai pas rempli les champs prix mini et maxi  :sol:

Reply

Marsh Posté le 17-03-2009 à 11:55:44    

puré, lis ce que j'ai mis! J'ai pas fait un test avec isset() mais !empty(). isset va forcément être bon puisque le formulaire posté contient les champs testés. Sauf que leur valeur est vide et que ça te fait une condition à la con!


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-03-2009 à 12:45:47    

Oh la vache tu es peut être colérique mais kes que tu es doué  :ouch:  
Je vais tester tout ça je te tiens informé
Merci mille fois je suis trop content  :bounce:

Reply

Marsh Posté le 17-03-2009 à 12:57:19    

pas colérique mais énervé car ça fait plusieurs fois que je te dis qu'il ne faut prendre en compte tes 2 champs relatifs au prix que s'ils ne sont pas vide.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-03-2009 à 13:50:53    

Je comprends je n'avais pas fais gaffe au !empty  
Dans tous les cas je te remercie encore tu m'as vraiment enlevé une grosse épine du pied
A bientôt peut être  :sol:


Message édité par marquito le 17-03-2009 à 14:03:20
Reply

Marsh Posté le 17-03-2009 à 14:00:53    

oui, bien sûr mais après, faut faire attention à ce que la requête SQL ainsi générée soit syntaxiquement (pas d'erreur de syntaxe) et sémantiquement (la requête doit avoir du sens, être logique) correcte. Faut donc faire attention au contenu de la clause SELECT, FROM et WHERE.
 
Et bon sang de bon soir, tu trouves   encore le moyen de te trouer dans ton code alors que t'as qu'à faire un copier-coller  :fou:  

Code :
  1. if (!empty($_GET['Prixmini'])) && (!empty($_GET['Prixmaxi'])) {
  2.    $search .= " AND a.ad_price between ".$_GET['Prixmini']." and ".$_GET['Prixmaxi'];
  3. }
  4. if (!empty($_GET['Cubemini'])) && (!empty($_GET['Cubemaxi'])) {
  5.     $search .= " AND a.ad_cylindre between ".$_GET['Cubemini']." and ".$_GET['Cubemaxi'];
  6. }


Y'a que des !empty(), pas de isset(). T'es lourd à vouloir en mettre à tout prix!


Message édité par rufo le 17-03-2009 à 14:01:26

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-03-2009 à 14:18:28    

OK j'ai fais la modif et j'ai crié avant d'avoir mal maintenant tout fonctionne comme je veux  :bounce:  
Par contre ce code ça marche pas !  :non:  

Code :
  1. if (!empty($_GET['Prixmini'])) && (!empty($_GET['Prixmaxi'])) {
  2. $search .= " AND a.ad_price between ".$_GET['Prixmini']." and ".$_GET['Prixmaxi'];
  3. }
  4. if (!empty($_GET['Cubemini'])) && (!empty($_GET['Cubemaxi'])) {
  5. $search .= " AND a.ad_cylindre between ".$_GET['Cubemini']." and ".$_GET['Cubemaxi'];
  6. }


Celui là si  :sol:  

Code :
  1. if ($text_search <> "" ) {
  2. $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') ";
  3. }
  4. //MODIFICATION
  5. if (!empty($_GET['Prixmini']) && !empty($_GET['Prixmaxi'])) {
  6. $search .= " AND (a.ad_price BETWEEN '" . $_GET['Prixmini']. "' AND '" . $_GET['Prixmaxi'] . "')";
  7. }
  8. //MODIFICATION
  9. if (!empty($_GET['Cubemini']) && !empty($_GET['Cubemaxi'])) {
  10. $search .= " AND (a.ad_cylindre  BETWEEN '" . $_GET['Cubemini']. "' AND '" . $_GET['Cubemaxi'] . "')";
  11. }


Reply

Marsh Posté le 17-03-2009 à 15:19:25    

ok j'ai oublié un jeu de ( ), t'aurais pu corriger toi-même :/

Code :
  1. if ((!empty($_GET['Prixmini'])) && (!empty($_GET['Prixmaxi']))) {
  2.     $search .= " AND a.ad_price between ".$_GET['Prixmini']." and ".$_GET['Prixmaxi'];
  3. }
  4.  
  5. if ((!empty($_GET['Cubemini'])) && (!empty($_GET['Cubemaxi']))) {
  6.     $search .= " AND a.ad_cylindre between ".$_GET['Cubemini']." and ".$_GET['Cubemaxi'];
  7. }


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-03-2009 à 15:20:25    

Vu les trucs sur lesquels tu bloques, j'ai l'impression que t'as pas dû passer beaucoup temps à la lire la doc relative au PHP et sa syntaxe :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-03-2009 à 17:07:14    

On ne peux pas être bon partout  :pt1cable: et c'est vrai que j'ai bcp de lacune en PHP  
D'ailleurs en ce moment je cherche un truc  :ouch:  pour toi c'est certainement de la rigolade
J'aimerai faire apparaitre ces champs en fonction du choix de l'internaute
C'est un site de moto.....si il cherche une bécane je lui donne le choix de chercher par cylindrée par contre si il cherche de l'équipement avec mon truc bien sûr le champs cylindrée reste affiché  :D  
Tu vois dans quelle galère je suis avec mes lacunes :lol:

Reply

Marsh Posté le 17-03-2009 à 17:18:48    

archi traité sur ce forum : principe des listes déroulantes liées entre elles. La sélection d'une valeur dans l'une conditionne le contenu de l'autre. Faut passer par du javascript.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 17-03-2009 à 21:27:27    

Il y a peut être un moyen de le faire sans javascript...non?
Parce que sur le script que j'ai (sans js a moins que je me trompe) il me sort les champs en fonction des catégories choisis !

Reply

Marsh Posté le 18-03-2009 à 09:01:38    

marquito a écrit :

Il y a peut être un moyen de le faire sans javascript...non?


Non.
 
En tout cas, pas sans recharger la page.
 
Pour rappel :

Citation :

PHP => Traitement côté serveur.
JavaScript => Traitement côté client.


- En php : il "suffit" de tester ce qui est demandé (à voir suivant tes pages), et d'activer/désactiver la liste de choix avant de renvoyer la page.
Inconvénient : génère du trafic pour pas grand chose.
 
- En JS : Une fonction OnChange sur le premier choix, qui va activer/désactiver la liste.
Inconvénient : il faut penser à faire les vérifications côté serveur, et il faut penser à ceux qui n'utilisent pas le JS

Reply

Marsh Posté le 18-03-2009 à 14:30:56    

Ok vu j'ai abandonné cette idée je l'ai contourné par facilité !
Rufo va dire que je suis nul et c'est vrai le Php c'est pas ma tasse de thé
Juste une dernière question
Pour contourner mon truc j'aimerai savoir comment faire une recherche juste sur un mot avec mon principe:
# if (!empty($_GET['Cubemini']) && !empty($_GET['Cubemaxi'])) {
# $search .= " AND (a.ad_cylindre  BETWEEN '" . $_GET['Cubemini']. "' AND '" . $_GET['Cubemaxi'] . "')";
# }

Reply

Marsh Posté le 18-03-2009 à 15:17:46    

ben tu l'avais bien fait en début :

Code :
  1. if (!empty($text_search)) {
  2.     $search .= " AND (a.ad_headline LIKE '%$text_search%' OR a.ad_text LIKE '%$text_search%') ";
  3. }


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 18-03-2009 à 15:35:44    

ça me sort tout !

Reply

Marsh Posté le 18-03-2009 à 17:18:55    

Tu n'as pas la solution pour moi  :jap:

Reply

Marsh Posté le 18-03-2009 à 19:01:09    

ben après, faut adapter. T'as pas dit sur quel champ tu voulais rechercher l'info.
 
Enlèves moi un doute : la variable $text_search, tu l'alimentes bien avec une variable de ton formulaire de recherche via $_POST ou $_GET?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 18-03-2009 à 20:39:29    

Sur le champ:  ad_text
<input name="Motcle" type="text" size="20" maxlength="20" class="inputbox"/>
je pensais faire un truc du genre:

Code :
  1. if (!empty($_GET['Motcle'])) {
  2. $search .= " AND (a.ad_text ' " . $_GET['Motcle']. "')";
  3. }


Mais c'est certainement du grand n'importe quoi :ange:
 

Citation :

tu l'alimentes bien avec une variable de ton formulaire de recherche via $_POST ou $_GET


$_POST je crois  :??:

Message cité 1 fois
Message édité par marquito le 18-03-2009 à 20:55:03
Reply

Marsh Posté le 19-03-2009 à 11:03:54    

non c'est <form action="index.php" method="get">

Reply

Marsh Posté le 19-03-2009 à 11:22:13    

Code :
  1. $params = array();
  2. if (!empty($_GET['text_search'])) {
  3. $text_search = mysql_escape_string($_GET['text_search']);
  4. array_push($params, "CONCAT_WS(\"~\", COALESCE(`a.ad_headline`, ''), COALESCE(`a.ad_text`, '')) LIKE '%$text_search%'" );
  5. }
  6. if (!empty($_GET['Prixmini'])) {
  7. array_push($params, "`a.ad_price` > " . $_GET['Prixmini']);
  8. }
  9. if (!empty($_GET['Prixmaxi'])) {
  10. array_push($params, "`a.ad_price` < " . $_GET['Prixmaxi']);
  11. }
  12. if (!empty($_GET['Cubemini'])) {
  13. array_push($params, "`a.ad_cylindre` > " . $_GET['Cubemini']);
  14. }
  15. if (!empty($_GET['Cubemaxi'])) {
  16. array_push($params, "`a.ad_cylindre` < " . $_GET['Cubemaxi']);
  17. }.
  18. array_push($params, "`a.published` = 1" );
  19. $search .= implode(' AND ', $params);


Message édité par stealth35 le 19-03-2009 à 11:38:39
Reply

Marsh Posté le 19-03-2009 à 11:43:41    

marquito a écrit :

Sur le champ:  ad_text
<input name="Motcle" type="text" size="20" maxlength="20" class="inputbox"/>
je pensais faire un truc du genre:


$_POST je crois  :??:  
C'est clair :/ Tu ne prends même aps le temps de regarder si ta requête SQL est syntaxiquement correcte  :pfff:  

Code :
  1. if (!empty($_GET['Motcle'])) {
  2.     $search .= " AND a.ad_text LIKE '%".$_GET['Motcle']."%'";
  3. }


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 19-03-2009 à 12:18:54    

Merci merci.....Tu es vraiment génial rufo tu as encore gagné  :wahoo:  
Moi je ne suis pas fais pour le PHP trop compliqué pour moi ça me désole  :cry:  
Dis moi on m'a dis que

Citation :


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"


Citation :

Passer directement des $_POST ou $_GET dans des requêtes sans tester leur contenu au préalable est un réel danger.


C'est pas mon cas rassure moi

Reply

Marsh Posté le 19-03-2009 à 12:58:38    

Si. On appelle ça le SQL injection. Pour contourner ça, tu peux déjà utiliser mysql_real_escape_string()  http://fr3.php.net/manual/en/funct [...] string.php
Sinon, faut utiliser les requêtes préparées, avec la lib PDO, par exemple.


Message édité par rufo le 19-03-2009 à 12:58:56

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 19-03-2009 à 13:21:48    

Il n'a pas moyen de vérifier si mon code comporte un risque ?
On m'a parlé de ça pour faire un test

Code :
  1. $Prixmini = (is_int($_GET['Prixmini'])) ? $_GET['Prixmini'] : 0;
  2. $Prixmini = (is_int($_GET['Prixmaxi'])) ? $_GET['Prixmaxi'] : 0;
  3. if (!empty($Prixmini) && !empty($Prixmini)) {
  4.   $search .= " AND (a.ad_price BETWEEN '" . $Prixmini . "' AND '" . $Prixmini . "')";
  5. }


Citation :


Si ils doivent être de type string, penses à ajouter des addslashes() pour éviter de faire planter ta requête.


Qu'est-que t'en penses ? et qu'est-que tu me conseil

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed