Problème fonction.

Résolu
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012 - 25 août 2009 à 15:59
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012 - 26 août 2009 à 18:19
Salut,
j'essai d'adapter un script qui me permet de rechercher dans ma base de données en fonction des mots clés tapés dans un moteur de recherche.
LE problème est que je voudrais ajouter une condition à ma requete sql et que je n'y arrive pas.

Voici la fonction :
function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
 {
 // option de recherche
 $option = $_POST['option'];
 // texte de recherche
 $search = $_POST['search'];

 // si c'est le premier appel de la fonction
 if(!isset($fonction_requete))
 {
 static $fonction_requete = 1;

 // si "Rechercher tous les mots" ou "Rechercher un de ces mots"
 if($option 'all' || $option 'one')
 {
 // liste des mots
 $mots = explode(' ', $search);

 // spararateur
 if($option == 'all')
 $sep = ' AND ';
 else
 $sep = ' OR ';
 } // if($option 'all' || $option 'one')
 // "Rechercher l'expression exacte"
 else
 {
 $mots = $search;
 $sep = '';
 }
 } // if(!isset($fonction_requete))

 if(!is_array($champs))
 $champs = array($champs);

 if($option 'all' || $option 'one')
 {
 // pour savoir si on en est  la premire itration ou non
 $i = 0;

 // pour tous les mots
 foreach($mots as $mot)
 {
 if(!$i)
 {
 $search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
 $i = 1;
 }
 else
 $search .= $sep . '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
 } // foreach($mots as $mot)
 } // if($option 'all' || $option 'one')
 else if($option == 'sentence')
 $search = '~#^!|!^#~ LIKE \'%' . $mots . '%\'';

 $i = 0;

 // dbut de requte
 if(empty($count))
 $req_search = 'SELECT ' . $select . ' FROM ' . $table . ' WHERE ' ;
 else
 $req_search = 'SELECT count(' . $count . ') FROM ' . $table . ' WHERE ' ;

 // ajout des champs
 foreach($champs as $champ)
 {
 if(!$i)
 {
 $req_search .= '( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
 $i = 1;
 }
 else
 $req_search .= 'OR ( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
 }

 if(empty($count))
 {
 $req_search .= "ORDER BY $order $sens LIMIT $limit_start, $limit_nb";

 return $req_search;

 } }


Je ne comprends pas comment adapter ma requete.
Je voudrais que ma requete affiche le même résultat mais seulement si le champ auteur = $login
En théorie, je devrais donc rajouter à la fin de ma requete :

WHERE auteur = '$login';

Cette syntaxe SQL fonctionne en direct sur ma base mais pas lorsque j'essai de l'adapter dans mon code.

J'ai essayé de l'adapter ici mais cela ne fonctionne pas :
 
$req_search 'SELECT ' . $select . ' FROM ' . $table . ' WHERE auteur '$login'' ;


Est ce que quelqu'un pourrait m'aider à y voir plus clair ?
Merci d'avance.

13 réponses

nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
26 août 2009 à 18:02
Select * from table where auteur = 'anthony' AND ( droit='admin' OR login='mylogin' ) 


Les règles d eprenthésages sont les mêmes qu'en math..
3
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
26 août 2009 à 11:51
S'il vous plait, là je coince vraiment sur ce problème.
Il s'agit vraiment d'un problème de syntaxe, je ne pense pas que le problème soit difficile à résoudre pourtant, je ne trouve pas comment écrire ma requête correctement.
Please, un peu d'aide...
0
StiriX Messages postés 67 Date d'inscription jeudi 26 décembre 2002 Statut Membre Dernière intervention 2 septembre 2009
26 août 2009 à 11:59
Salut !

Oula c'est pas super clair ton message là. Quel est le message d'erreur ?

Tu veux faire une condition dans ta requête ? Essaye de faire plus simple qu'on y voient plus clair
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
26 août 2009 à 13:51
Je veux bien faire plus clair mais je ne vois pas comment ?
J'ai posté la fonction de recherche dans la base de données.
Le message d'erreur est une erreur de syntaxe sql:

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '( date_entretien LIKE '%%' ) OR ( nom_societe LIKE '%%' ) OR ( statut LIKE '%%' ' at line 1"


Je n'arrive pas à mettre en place la condition dans ma requête étant donné qu'il ne s'agit pas exactement d'une requête sql classique.

Je pense que le code a adapter se trouve plus bas dans la fonction, je l'ai posté à part.
$req_search = 'SELECT ' . $select . ' FROM ' . $table . ' WHERE' ;


Mon problème est que je ne vois pas comment écrire la fin de la requête.
lorsque j'écris ceci :
$req_search 'SELECT ' . $select . ' FROM ' . $table . ' WHERE auteur '$login'' ;

j'ai le message d'erreur de syntaxe.
Merci de te pencher sur mon problème.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
26 août 2009 à 13:57
Bonjour,
$req_search "SELECT $select FROM $table WHERE auteur '$login' " ;

et tes autres clauses avec un AND avant tes autres clauses.
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
26 août 2009 à 14:19
Merci nautilus99 pour ta réponse mais je ne comprends pas ta phrase
et tes autres clauses avec un AND avant tes autres clauses.


Quelle partie du code dois je déplacer ?
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
26 août 2009 à 15:43
Tous tes autres champs dans ton foreach par exemple..

$req_search "SELECT $select FROM $table WHERE auteur '$login' AND " ;

et à la suite, tes autres clauses.

Dans ce cas, les autres clauses ne sont évaluées que et uniquement pour les enregistrements correspondant à ta première clause...

Pour optimiser une requête, on met toujours le discriminant principal en premier.
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
26 août 2009 à 16:20
Merci pour ces éléments de réponse mais cela ne fonctionne toujours pas comme je le voudrais. En fait, il n'y a plus de problème de syntaxe mais c'est comme si la condition (WHERE) n'était pas appliquée, il n'y a aucun changement sur les résultats affichés.

Voici mon code modifié, est ce que je l'ai modifié comme il fallait ?

 function requete($table, $champs, $select, $order, $sens, $limit_start, $limit_nb, $count = '')
 {
 $auteur = $_SESSION['login'];
 // option de recherche
 $option = $_POST['option'];
 // texte de recherche
 $search = $_POST['search'];

 // si c'est le premier appel de la fonction
 if(!isset($fonction_requete))
 {
 static $fonction_requete = 1;

 // si "Rechercher tous les mots" ou "Rechercher un de ces mots"
 if($option 'all' || $option 'one')
 {
 // liste des mots
 $mots = explode(' ', $search);

 // spararateur
 if($option == 'all')
 $sep = ' AND ';
 else
 $sep = ' OR ';
 } // if($option 'all' || $option 'one')
 // "Rechercher l'expression exacte"
 else
 {
 $mots = $search;
 $sep = '';
 }
 } // if(!isset($fonction_requete))

 if(!is_array($champs))
 $champs = array($champs);

 if($option 'all' || $option 'one')
 {
 // pour savoir si on en est  la premire itration ou non
 $i = 0;

 // pour tous les mots
 foreach($mots as $mot)
 {
 
 if(empty($count))
 $req_search "SELECT $select FROM $table WHERE auteur '$login' AND " ;
 else
 $req_search = 'SELECT count(' . $count . ') FROM ' . $table . ' WHERE ';
 
 if(!$i)
 {
 $search = '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
 $i = 1;
 }
 else
 $search .= $sep . '~#^!|!^#~ LIKE \'%' . $mot . '%\'';
 } // foreach($mots as $mot)
 } // if($option 'all' || $option 'one')
 else if($option == 'sentence')
 $search = '~#^!|!^#~ LIKE \'%' . $mots . '%\'';

 $i = 0;

 // dbut de requte
 
 // ajout des champs
 foreach($champs as $champ)
 {
 if(!$i)
 {
 $req_search .= '( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
 $i = 1;
 }
 else
 $req_search .= 'OR ( ' . str_replace('~#^!|!^#~', $champ, $search) .' ) ';
 }

 if(empty($count))
 {
 $req_search .= "ORDER BY $order $sens LIMIT $limit_start, $limit_nb";

 return $req_search;

 } }
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
26 août 2009 à 16:30
et en utilisant un echo ou autre pour afficher le code requête généré, ça te donne quoi ?

Manifestement, tu dois tester tes requêtes et le svérifier. Il doit s'agir d'une erreur soit dans une regexp soit que le code généré n'est pas celui qu etu attends.

Testes le résultat en live avec mysql query browser ou mysql workbench ou phpmyadmin pour affiner ta requête..
etensuite tu traduis ça avec tes regexp jusqu'à obtenir le résultat désiré..
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
26 août 2009 à 17:05
Merci de m'aider pour le débogage.
Lorsque je fais un echo de ma requete, j'ai ceci :

SELECT champ1,champ2,champ3 FROM matable WHERE auteur = 'anthony' AND ( date_entretien LIKE '%%' ) OR ( nom_societe LIKE '%%' ) OR ( statut LIKE '%%' ) OR ( adresse LIKE '%%' ) OR ( bp LIKE '%%' ) OR ( cp LIKE '%%' ) OR ( ville LIKE '%%' ) OR ( site LIKE '%%' ) OR ( nom_technicien LIKE '%%' ) OR ( interlocuteur LIKE '%%' ) OR ( civilite LIKE '%%' ) OR ( fonction LIKE '%%' ) OR ( telephone LIKE '%%' ) OR ( portable LIKE '%%' ) OR ( e_mail LIKE '%%' ) OR ( siret LIKE '%%' ) OR ( actionnariat LIKE '%%' ) OR ( filiale LIKE '%%' ) OR ( commentaire LIKE '%%' ) OR ( activite1 LIKE '%%' ) OR ( activite2 LIKE '%%' ) OR ( ca LIKE '%%' ) OR ( evolution_ca LIKE '%%' ) OR ( effectif LIKE '%%' ) OR ( das1 LIKE '%%' ) OR ( das2 LIKE '%%' ) OR ( das3 LIKE '%%' ) OR ( das4 LIKE '%%' ) OR ( das5 LIKE '%%' ) OR ( das6 LIKE '%%' ) OR ( das7 LIKE '%%' ) OR ( nom_das1_1 LIKE '%%' ) OR ( nom_das1_2 LIKE '%%' ) OR ( nom_das1_3 LIKE '%%' ) OR ( nom_das2_1 LIKE '%%' ) OR ( nom_das2_2 LIKE '%%' ) OR ( nom_das2_3 LIKE '%%' ) OR ( nom_das3_1 LIKE '%%' ) OR ( nom_das3_2 LIKE '%%' ) OR ( nom_das3_3 LIKE '%%' ) OR ( nom_das4_1 LIKE '%%' ) OR ( nom_das4_2 LIKE '%%' ) OR ( nom_das4_3 LIKE '%%' ) OR ( nom_das5_1 LIKE '%%' ) OR ( nom_das5_2 LIKE '%%' ) OR ( nom_das5_3 LIKE '%%' ) OR ( nom_das6_1 LIKE '%%' ) OR ( nom_das6_2 LIKE '%%' ) OR ( nom_das6_3 LIKE '%%' ) OR ( nom_das7_1 LIKE '%%' ) OR ( nom_das7_2 LIKE '%%' ) OR ( nom_das7_3 LIKE '%%' ) OR ( das1_com LIKE '%%' ) OR ( das2_com LIKE '%%' ) OR ( das3_com LIKE '%%' ) OR ( das4_com LIKE '%%' ) OR ( das5_com LIKE '%%' ) OR ( das6_com LIKE '%%' ) OR ( das7_com LIKE '%%' ) OR ( description LIKE '%%' ) OR ( materiel LIKE '%%' ) OR ( savoir_faire LIKE '%%' ) OR ( recherche LIKE '%%' ) OR ( effectif_bureau LIKE '%%' ) OR ( oui_brevet LIKE '%%' ) OR ( non_brevet LIKE '%%' ) OR ( nombre_brevet LIKE '%%' ) OR ( projet_brevet LIKE '%%' ) OR ( fond_propre LIKE '%%' ) OR ( oseo LIKE '%%' ) OR ( rdt LIKE '%%' ) OR ( ptr LIKE '%%' ) OR ( credit_impot LIKE '%%' ) OR ( fui LIKE '%%' ) OR ( anr LIKE '%%' ) OR ( ademe LIKE '%%' ) OR ( feder LIKE '%%' ) OR ( fedear LIKE '%%' ) OR ( fep LIKE '%%' ) OR ( banque LIKE '%%' ) OR ( business LIKE '%%' ) OR ( fond_prive LIKE '%%' ) OR ( fond_collectivite LIKE '%%' ) OR ( fondation LIKE '%%' ) OR ( non_cofinancement LIKE '%%' ) OR ( autre LIKE '%%' ) OR ( autre_financement LIKE '%%' ) OR ( montant LIKE '%%' ) OR ( aides_public LIKE '%%' ) OR ( aides_innovation LIKE '%%' ) OR ( propriete LIKE '%%' ) OR ( relation LIKE '%%' ) OR ( partenaire1 LIKE '%%' ) OR ( partenaire2 LIKE '%%' ) OR ( partenaire3 LIKE '%%' ) OR ( contrats LIKE '%%' ) OR ( certif LIKE '%%' ) OR ( cert1 LIKE '%%' ) OR ( cert2 LIKE '%%' ) OR ( cert3 LIKE '%%' ) OR ( cert4 LIKE '%%' ) OR ( certif_encours LIKE '%%' ) OR ( cert1_encours LIKE '%%' ) OR ( cert2_encours LIKE '%%' ) OR ( cert3_encours LIKE '%%' ) OR ( cert4_encours LIKE '%%' ) OR ( qualite LIKE '%%' ) OR ( certif_envisage LIKE '%%' ) OR ( date_echeance LIKE '%%' ) OR ( secteur LIKE '%%' ) OR ( rayon LIKE '%%' ) OR ( pays LIKE '%%' ) OR ( clients LIKE '%%' ) OR ( concurrent LIKE '%%' ) OR ( pays_concurrent LIKE '%%' ) OR ( entrant LIKE '%%' ) OR ( force1 LIKE '%%' ) OR ( force2 LIKE '%%' ) OR ( force3 LIKE '%%' ) OR ( faiblesse1 LIKE '%%' ) OR ( faiblesse2 LIKE '%%' ) OR ( faiblesse3 LIKE '%%' ) OR ( menace1 LIKE '%%' ) OR ( menace2 LIKE '%%' ) OR ( menace3 LIKE '%%' ) OR ( opportunite1 LIKE '%%' ) OR ( opportunite2 LIKE '%%' ) OR ( opportunite3 LIKE '%%' ) OR ( orientation LIKE '%%' ) OR ( besoin1 LIKE '%%' ) OR ( besoin2 LIKE '%%' ) OR ( besoin3 LIKE '%%' ) OR ( autre_besoin LIKE '%%' ) OR ( prioritaire LIKE '%%' ) OR ( potentiel LIKE '%%' ) OR ( annuellement LIKE '%%' ) OR ( faible LIKE '%%' ) OR ( collaboration LIKE '%%' ) OR ( freins LIKE '%%' ) OR ( coop_envisageable LIKE '%%' ) OR ( attentes LIKE '%%' ) OR ( oui_connaissance LIKE '%%' ) OR ( non_connaissance LIKE '%%' ) OR ( oui_rencontre LIKE '%%' ) OR ( non_rencontre LIKE '%%' ) OR ( droit LIKE '%%' ) OR ( auteur LIKE '%%' ) ORDER BY date_entretien DESC LIMIT 0, 500


Désolé pour le code brut...
Sinon, lorsque je teste cette requête sous phpmyadmin directement sur ma base, il affiche le même résultat que sur ma page web mais il n'y a aucune erreur dans la requête.
Ce qui signifie donc, comme tu le disais, que la requête que j'utilise n'est pas celle dont j'ai besoin.
Elle devrait afficher les enregistrements dont la valeur du champ auteur = $login et dont les enregistrements comporte l'un des mots clés saisi.
J'ai l'impression qu'il comprend comme s'il y avait un OR à la place du AND après mon WHERE ... ???
Je ne comprend pas ?
Comment puis je modifier cette requête ?
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
26 août 2009 à 17:09
SELECT champ1,champ2,champ3 FROM matable WHERE auteur = 'anthony' AND ( ( date_entretien LIKE '%%' )


Il manque un parenthèsage de ta collection de OR.

Et surtout des %% seuls et pas ta valeur désirée.

Donc tes regexp ne filtrent pas vraiment.
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
26 août 2009 à 17:45
J'ai un élément de réponse.
Dans le langage SQL, lorsque je fais la requête suivante :
Select * from table where auteur = 'anthony';
cette requete va m'afficher tous les résultats lorsque l'auteur et anthony.

Mais si je fais cette requête :
Select * from table where auteur = 'anthony' AND droit='admin' OR login='mylogin';
Cette requête me renverra un résultat si le login est 'mylogin' mais si le nom de l'auteur n'est pas anthony !!!
Elle ne tient pas compte de la première restriction.

En fait si car elle me renverra aussi toutes les fiches dont l'auteur est anthony mais aussi les autres résultats.

Moi, je voudrais qu'elle sélectionne toute les fiches de Anthony et qu'elle regarde dans ce premier résultat si le login 'mylogin' ou si le droit 'admin'.

Comment écrire la requête alors ??
Quelqu'un a une idée ??
0
anthony428 Messages postés 102 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 29 mai 2012
26 août 2009 à 18:19
Merci beaucoup nautilus99, c'était bien une histoire de parenthèse. En tout cas merci beaucoup, tu me sauve la vie.
Je ne voyais pas comment j'allais me sortir de ce mauvais pas.
J'ai écris mon dernier post sans voir le tien...

Sinon,
Donc tes regexp ne filtrent pas vraiment.


Je sais, je n'avais saisi aucun mot dans le moteur de recherche, c'est pour cela qu'ils ne sont pas actifs.
Encore une fois un grand merci. Bonne soirée à tous.
0
Rejoignez-nous