Les plus longues phrases avec sql/php !
RésoluElodie_79 Messages postés 75 Statut Membre -
je ne sais pas comment procéder, trouver la plus longue chaîne (phrase) dans la base de de données ,au départ j'ai un ficher qui contient des phrase séparés (des lignes il y a un retour à la ligne) je doit faire un script qui vérifie pour chaque ligne la plus longue chaîne et des garder les plus petites si elle sont dans ma base de données par exemple mon fichier contient ces lignes :
'le pays des merveilles est le rêve de tous'
'la maladie de ces enfants peut être prendre en charge'
...
...
par exemple 'le pays des merveilles' est dans ma base donc je l'affiche
'rêve' est dans ma base de donnée
'la maladie' est dans la base
'enfant' est dans la base
'prendre en charge' est dans ma base
donc je ne sais pas comment faire cette requête au début j'ai penser de récupérer le fichier dans un tableau mais et chaque variable de mon tableau est un mot 'mais il y a des phrase composée soit en 2, en 3, en 4 mot.. je doive récupérer telle qu'elle sont et si je sépare chaque mot donc je perd bcp de donnée même chose si je mets dans chaque variable 2 ou 3 mots je pers les autres donc je ne sais pas franchement comment procéder pour résoudre mon problème
merci d'avance pour votre aide :(
2 réponses
Le problème porte sur l'identification, dans un fichier de phrases séparées par des retours à la ligne, de la plus longue chaîne existant dans une base de données. Des propositions visent à récupérer chaque ligne et comparer ses sous-chaînes avec les entrées de la table, en privilégiant les plus longues et en évitant de tronquer les phrases. Des échanges évoquent l'utilisation de LIKE et ORDER BY LENGTH pour faire remonter les correspondances les plus longues, en ajustant le placement des jokers et le traitement ligne par ligne. En cas de persistance, une piste consiste à récupérer des résultats via requêtes et à empiler les entrées dans un tableau, afin de ne pas perdre ni mots simples ni phrases.
-
salut
tu peux inverser ton like dans ta requête. C'est dire, au lieu de faire.... AND CHAINE_BASE like '%le texte a lire%'
tu peux plutot faire :.... AND 'le texte a lire' like concat('%',CHAINE_BASE,'%')
ensuite rajouter unORDER BY LENGTH(CHAINE_BASE)DESC
pour remonter les résultats les plus longs en premier est tout à faire possible-
-
merci pour ta réponse mais ça marche pas il verifié toute la ligne est ce qu'elle est dans ma base ,moi je ne récupère pas une seule variable; dans l'exepmle que j'ai donné il va vérifier et il va trouver que 'pays' est dans ma base de données et 'pays de merveille' aussi et il va retourner 'pays de merveille' vue que c'est la plus grande chaine mais toujours dans la meme ligne il va retourné aussi'rève' car il est de ma base de données et vu qu'il n'est pas ds une grande chaine qui est dans ma base juste ce mot seule donc il va le retourner aussi
j'espère que j'ai clarifié mon problème :( -
oui je l'avais bien compris, mais dans un sens c'est normal que ca ressorte toutes les possibilitées, vue qu'elles sont vrai, mais toi si tu ne veux prendre que le premier résultat, et donc le plus grand, tu peux. (mais si un jours tu souhaite afficher tout ce qui concorde, ca sera déjà en place).
et non ma requête ne vérifie pas la ligne complète, d'où l'importance des %. Je m'éxplique :
tu as en base : 'pays'. Ce que ma requête fait c'est vérifier si 'pays' est contenu dans la phrase de départ. et te permettra donc de récupérer toutes les chaines de caractère présentes dans ta base et dans une partie de ta phrase. -
j'ai déja modifié comme tu me l'as dit soit en mettant en entrée un tableau de chaque mot qoit un tableau de chaque ligne et le résultat c comme je n'est pas inversé et dans les deux cas je perd des données je ne sais pas comment faire pour ne pas perdre ni les mots simple ni les mots composé (bien sur si on a le choix on garde la ou il y a la plus longue chaine)
-
que veux tu faire exactement? comment est fait ton code? quelles variables utilises-tu? quel est le but de ta méthode?
Ce que je t'ai donné, c'est un moyen de récupérer à partir d'une phrase unique les expressions présentes dans ta phrases et dans ta base de donnée. Pour le reste je ne vois pas quel est l'objectif.
-
-
je ne sais pas est ce que en faisant des classes ou des fonctions :( :(
-
-
Bonjour; la partie la plus importante je l'ai déjà montré:
et voila ce j'ai déjà fait:
foreach($tab as $key=>$value){// $value est une ligne de mon fichier
$requete = 'SELECT mots FROM tablet WHERE \''.mysql_real_escape_string($value). '\' LIKE concat(mots) AND page_namespace=0 ORDER BY LENGTH(mots)DESC';
$result = mysql_query($requete, $link) or die (mysql_error());
if($row=mysql_fetch_row($result)){
$tabb[]=$value;
}}
print_r($tabb);
c'est ça mon code si je mets que chaque variable de $tab est une ligne de mon fichier , donc il vérifie pour l'ensemble de ligne est pas les mots
et si je déclare chaque variable de mon tableau est un mot de ces phrases donc il ignore les mots composés
Merci -
tu dois ajouter ton $row à ta table et non $value qui est ta valeur de base .. dans ton cas c'est le row[0] qui correspond aux mots de ta bdd, et il faut que tu ajoute un élément à ta table, par exemple :
$tabb[i]=$row[0]
avec i étant un compteur pour ajouter un élément à ta table. donc en gros (je vérifie pas ton code) :$i = 0 foreach($tab as $key=>$value){// $value est une ligne de mon fichier $requete = 'SELECT mots FROM tablet WHERE \''.mysql_real_escape_string($value). '\' LIKE concat(mots) AND page_namespace=0 ORDER BY LENGTH(mots)DESC'; $result = mysql_query($requete, $link) or die (mysql_error()); if($row=mysql_fetch_row($result)){ $tabb[$i]=$value; $i++; }} print_r($tabb); -
-
bah 2 choses, la première c'est que tu assignais $value dans tous les cas, donc ta requête n'avait pas d'impact. La seconde c'est que je n'ai aucunes infos.
déjà essaye d'afficher les requêtes qui sont jouée pour les contrôler, si tu peux les tester directement sur ta base de données, fais le et vois les résultats. Le code que tu écris à une forme qui donne l'impression que tu as déjà contrôlé pas mal de points, ecris plutot quelque chose du genreforeach($tab as $key=>$value)// $value est une ligne de mon fichier { echo "<div>" . $value . "<br />"; echo "-----------------------------------------------"; echo "REQUETE : " . "<br />"; $requete = 'SELECT mots FROM tablet WHERE \''.mysql_real_escape_string($value). '\' LIKE concat(mots) AND page_namespace=0 ORDER BY LENGTH(mots)DESC'; echo $requete; $result = mysql_query($requete, $link) or die (mysql_error()); //$link sort d'où? où se fait la connexion à ta bdd ? $row=mysql_fetch_row($result); //le if ne sert à rien si tu fais une assignation vu que la fonction retourne un tableau. echo "<br />RESULTATS : <br />" print_r($row) ;//regarde déjà les résultats de ta requete echo "</div>"; }
comme ca tu pourra déjà controler quelle est la valeur de la ligne lue, quelle est sa requête construite et quels sont les résultats obtenus, de manière à assez propre pour être lisible (ce qui suffit pour débugger).
Regarde déjà ce que ca affiche
-