SVP pour une requete SQL recherche plusieurs mots dans un même champ.
Hello,
rien ne t'empêche de changer l'expression régulière pour ne pas remplacer les caractères accentués ou ne remplacer que les caractères qui te dérangent.
the386mmx
31/05/2007, 21h16
Bonsoir,
je suis rentré tard, je n'ai pas encore testé ; mais j'ai besoin des caractères accentués, donc je ne pense pas que cette solution me convienne.
Cordialement.
Homer Jay
31/05/2007, 12h47
Envoyé par
Abogil
Comment sont gérés les caractères accentués ?
Ils sont refusés. C'est pour ça aussi que ce code est peut-être un peu trop restrictif, suivant l'application exacte qu'on veut en faire: il faut peut-être l'adapter.
Envoyé par
Homer Jay
Précisément, j'écrirais:
Code PHP:
$str = preg_replace('/[^A-Za-z0-9]/', ' ', $str);
Comment sont gérés les caractères accentués ?
the386mmx
31/05/2007, 06h28
Bonjour,
Merci je ne connaissais pas cette commande, le code est plus légé ! Je ferai les modifs ce soir.
Bonne journée !
Homer Jay
30/05/2007, 22h49
Envoyé par
crole
Hello,
commme le dis Homer Jay essayes plutôt les fonctions du style preg
comme :
Code PHP:
$mavartransformee=preg_replace('`[^A-Za-z0-9]`', '', $mavaravanttransformation
si je ne me trompe
Exactement le genre de chose que j'avais en tête. Précisément, j'écrirais:
Code PHP:
$str = preg_replace('/[^A-Za-z0-9]/', ' ', $str);
(Qui remplace par des espaces plutôt que par rien.)
Hello,
commme le dis Homer Jay essayes plutôt les fonctions du style preg
comme :
Code PHP:
$mavartransformee=preg_replace('`[^A-Za-z0-9]`', '', $mavaravanttransformation
si je ne me trompe
the386mmx
30/05/2007, 19h40
Bonsoir,
J'ai peu d'expérience en PHP, et je suis loin d'en maîtriser toutes les fonctions. J'ai récupéré ce code sur un forum, il me semblait interressant. Visiblement le ; est oublié par son auteur, je n'y avais pas preté attention.
Effectivement, s'il existe une fonction permettant de ne conserver que les caractères alphabétiques et numériques, je suis preneur.
Cordialement.
Homer Jay
30/05/2007, 03h36
Envoyé par
Abogil
Pourquoi ne pas remplacer chacun de ces caractères directement par un espace ?
Parce qu'on veut peut-être reconnaître la chaîne "oui:" dans "oui: non". Mais je suis d'accord avec toi que c'est plus radical de supprimer tous les caractères non alphabétiques.
Homer Jay
30/05/2007, 03h35
Envoyé par
the386mmx
Code PHP:
$string=$mots;
$string = strtr($string, ":", "/");
$string = strtr($string, "/", "?");
$string = strtr($string, "?", "$");
$string = strtr($string, "$", "<");
$string = strtr($string, "<", ">");
$string = strtr($string, ">", ".");
$string = strtr($string, ".", "\\");
$string = strtr($string, "\\", "-");// a cet endroit on double le signe\ sinon erreur !
$string = strtr($string, "-", " ");//3 espace vide , on commence a diminuer le nombre de caracteres parasites
$string = strtr($string, " ", " "); // 2 !
$string = strtr($string, " ", " "); // 1
$string = strtr($string, " ", " "); // 1
$mots=$string;
...
Je suis ouvert à toutes suggestions sur ce sujet.
Mais le caractère ";", tu le laisses tel quel? C'est pas un problème? À ta place, j'utiliserais une des fonctions preg pour faire disparaitre tous les caractères qui ne sont pas dans A-Za-z (si ça convient à ton problème).
Pourquoi ne pas remplacer chacun de ces caractères directement par un espace ?
the386mmx
29/05/2007, 20h05
Bonsoir Abogil,
J'ai repris ce code suggéré sur un forum :
en fait on substitue les caractères potentiellement dangeureux et inutiles dans nos requetes, les uns après les autres, puis par 3 espacements, ensuite on réduit les espacements pour n'en garder qu'un seul.
Tous les : deviennent des \ ; tous les \ deviennent des ? ; tous les ? deviennent des ...
Cordialement.
BonjourThe386mmx, je ne comprends pas très bien ton mode de nettoyage.
Tu remplaces tous ces symboles par des espaces ?
the386mmx
28/05/2007, 21h01
Bonsoir,
l'erreur venait de moi... aucun rapport avec ton code très fonctionnel !
concernant les injections sql, j'ai trairé en aval :
Code PHP:
function NormalisationHTTP($tableau)
{
//Si on est en échappement automatique, on rectifie...
foreach ($tableau as $cle => $valeur)
{
if (!is_array($valeur)) // On agit
$tableau[$cle] = stripSlashes($valeur);
else // On appelle récursivement
$tableau[$cle] = NormalisationHTTP($valeur);
}
return $tableau;
}
// POST/GET/REQUEST/COOKIE si on est en échappement auto, on rectifie
if (get_magic_quotes_gpc())
{
$_POST=NormalisationHTTP($_POST);
$_GET=NormalisationHTTP($_GET);
$_REQUEST=NormalisationHTTP($_REQUEST);
$_COOKIE=NormalisationHTTP($_COOKIE);
}
Puis nettoyage des chaines saisies avec code de ce type :
Code PHP:
$string=$mots;
$string = strtr($string, ":", "/");
$string = strtr($string, "/", "?");
$string = strtr($string, "?", "$");
$string = strtr($string, "$", "<");
$string = strtr($string, "<", ">");
$string = strtr($string, ">", ".");
$string = strtr($string, ".", "\\");
$string = strtr($string, "\\", "-");// a cet endroit on double le signe\ sinon erreur !
$string = strtr($string, "-", " ");//3 espace vide , on commence a diminuer le nombre de caracteres parasites
$string = strtr($string, " ", " "); // 2 !
$string = strtr($string, " ", " "); // 1
$string = strtr($string, " ", " "); // 1
$mots=$string;
if(htmlspecialchars($mots) != $mots) {
...
Je suis ouvert à toutes suggestions sur ce sujet.
Attention, vous avez pas froid aux yeux avec vos requêtes !
N'y a t il pas un risque d'injection SQL dans les codes que je vois ci dessus ?
A+
Julien
Envoyé par
the386mmx
Je te remercie chaleureusement, ça fonctionne très bien !
Quelle était l'erreur ?
the386mmx
22/05/2007, 21h35
Bonsoir,
Je te remercie chaleureusement, ça fonctionne très bien !
Bonne nuit, encore merci !!
J'avais laissé un espace après $data.
Essaie ceci :
Code PHP:
// la variable $mot est envoyée par le formulaire de recherche.
// je fractionne la recherche en mots $motrecherche(1) $motrecherche(2) ...
$motrecherche=explode(" ",$mots);
$WHERE = "WHERE";
$count = 0;
reset ($motrecherche);
while(list($key, $data) = each($motrecherche))
{
$count = $count + 1;
if ($count == 1) $WHERE .= " description LIKE '%" . $data . "%' ";
else $WHERE .= " AND description LIKE '%" . $data . "%' ";
}
$resultat = mysql_query ("SELECT DISTINCT titre, description, lieu, date, ref, fond, nombrepages FROM refs_tbl $WHERE ORDER BY date"
, $connexion);
Ton histoire est curieuse.
Je viens d'essayer sur mon site
www.missions-courtes.com où j'ai fait ce type de requête et cela fonctionne correctement.
the386mmx
22/05/2007, 21h15
Re-bonsoir, et merci pour ta réponse.
Même remarque que pour le précédent code.
Cela fonctionne bien avec une chaine exacte, mais pas s'il y a un ou plusieurs mots, dans la description, entre ceux recherchés.
Cordialement.
Envoyé par
the386mmx
Exemple je recherche "bordereau de traite" => on trouve "bordereau de traite" dans ma table.
Par contre si je recherche "bordereau traite" => je n'ai rien...
Essaie ceci :
Code PHP:
// la variable $mot est envoyée par le formulaire de recherche.
// je fractionne la recherche en mots $motrecherche(1) $motrecherche(2) ...
$motrecherche=explode(" ",$mots);
$WHERE = "WHERE";
$count = 0;
reset ($motrecherche);
while(list($key, $data) = each($motrecherche))
{
$count = $count + 1;
if ($count == 1) $WHERE .= " description LIKE '%$data %' ";
else $WHERE .= " AND description LIKE '%$data %' ";
}
$resultat = mysql_query ("SELECT DISTINCT titre, description, lieu, date, ref, fond, nombrepages FROM refs_tbl $WHERE ORDER BY date"
, $connexion);
the386mmx
22/05/2007, 20h47
Bonsoir Abogil,
Je te remercie pour ta suggestion que je me suis empressé d'essayer.
Elle fonctionne bien si les mots se suivent parfaitement dans la description.
Exemple je recherche "bordereau de traite" => on trouve "bordereau de traite" dans ma table.
Par contre si je recherche "bordereau traite" => je n'ai rien...
Je suis ouvert à toute suggestion, n'étant que programmeur amateur.
Cordialement.
Je mettrais :
Code PHP:
//la variable $mot est envoyée par le formulaire de recherche.
$motrecherche=explode(" ",$mots); // je fractionne la recherche en mots $motrecherche(1) $motrecherche(2) ...
$resultat = mysql_query ("SELECT DISTINCT titre, description, lieu, date, ref, fond, nombrepages FROM refs_tbl WHERE description LIKE '%$motrecherche[0]%' AND description LIKE '%$motrecherche[1]%' AND description LIKE '%$motrecherche[2]%' ORDER BY date"
, $connexion);
the386mmx
22/05/2007, 20h08
Bonjour,
Auriez-vous l'aimabilité de m'aider pour écrire une requête SQL ?
J'ai une table regroupant des documents, avec les champs titre, description, date (etc..)
J'essaie de programmer un moteur permettant de saisir plusieurs mots et les rechercher dans le champ description.
Mon problème : il ne me faut pas une recherche "exacte", c'est à dire :
si je cherche "CHEMIN DE FER" je dois pouvoir trouver aussi bien le document "CHEMIN DE FER d'Orléans" que "c'est un CHEMIN avec un lot DE FER" (j'espère que je suis clair :-/)
A l'heure actuelle j'utilise ce code non fonctionnel, qui utilise les 3 premiers mots saisis (les autres ne sont pas considérés).
Code PHP:
//la variable $mot est envoyée par le formulaire de recherche.
$motrecherche=explode(" ",$mots); // je fractionne la recherche en mots $motrecherche(1) $motrecherche(2) ...
$resultat = mysql_query ("SELECT DISTINCT titre, description, lieu, date, ref, fond, nombrepages FROM refs_tbl WHERE description LIKE '%$motrecherche[0]%$motrecherche[1]%$motrecherche[2]%' ORDER BY date"
, $connexion);
Merci pour votre aide.