Chercher via des lettres (BD)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Chercher via des lettres (BD)

Re: Chercher via des lettres (BD)

par Jefekoi » 27 sept. 2017, 15:35

Il me semble qu'avec ce code tu ne trouvera que les mots de même longueur que le premier non ?

et si ton mot est vide tu récupérera tous les mots non ?
Non pour la première question, j'ai testé en parlant de testé regarde ce lien : http://www.verifier-mots.fr/moteur1.php ... Rechercher

Pour la deuxième question effectivement tu as raison mais c'est le genre de truc réparable :D

Re: Chercher via des lettres (BD)

par Spols » 27 sept. 2017, 08:14

Il me semble qu'avec ce code tu ne trouvera que les mots de même longueur que le premier non ?

et si ton mot est vide tu récupérera tous les mots non ?

Re: Chercher via des lettres (BD)

par Jefekoi » 26 sept. 2017, 17:40

Merci pour ton aide Spols

Mais je suis parti sur une autre idée, tu peux me dire ce que tu en penses, à savoir pour les tables je vais modifier en faire qu'une seul plutôt que les 26

http://www.verifier-mots.fr/moteur1.php

Code : Tout sélectionner

<?php echo '<a href="moteur1.php">Index</a><hr/>'; if(isset($_GET['mot'])){ $mot=mb_strtolower($_GET['monmot']); function str_to_noaccent($str) { $url = $str; $url = preg_replace('#Ç#', 'C', $url); $url = preg_replace('#ç#', 'c', $url); $url = preg_replace('#è|é|ê|ë#', 'e', $url); $url = preg_replace('#È|É|Ê|Ë#', 'E', $url); $url = preg_replace('#à|á|â|ã|ä|å#', 'a', $url); $url = preg_replace('#@|À|Á|Â|Ã|Ä|Å#', 'A', $url); $url = preg_replace('#ì|í|î|ï#', 'i', $url); $url = preg_replace('#Ì|Í|Î|Ï#', 'I', $url); $url = preg_replace('#ð|ò|ó|ô|õ|ö#', 'o', $url); $url = preg_replace('#Ò|Ó|Ô|Õ|Ö#', 'O', $url); $url = preg_replace('#ù|ú|û|ü#', 'u', $url); $url = preg_replace('#Ù|Ú|Û|Ü#', 'U', $url); $url = preg_replace('#ý|ÿ#', 'y', $url); $url = preg_replace('#Ý#', 'Y', $url); return ($url); } $premierelettre= str_to_noaccent($mot); $premierelettre = mb_substr($premierelettre,0,1);$NomBase=$premierelettre."_dico"; $BDD_hote = '****'; $BDD_bd = '****'; $BDD_utilisateur = '****'; $BDD_mot_passe = '****'; $chaine = str_to_noaccent( $mot ); $premiere_lettre = mb_substr($chaine,0,1); $array_lettres = str_split($chaine, 1); $where_mot = ( !empty($array_lettres) )? " WHERE scrabble_name LIKE '%" . implode( "%' AND scrabble_name LIKE '%", $array_lettres) . "%' " : ""; echo 'Vous avez recherché : <strong>' . $mot . '</strong><hr/>'; try{ $bdd = new PDO('mysql:host='.$BDD_hote.';dbname='.$BDD_bd, $BDD_utilisateur, $BDD_mot_passe); $bdd->exec("SET CHARACTER SET utf8"); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); } catch(PDOException $e){ echo 'Erreur : '.$e->getMessage(); echo 'N° : '.$e->getCode(); } $requete = "SELECT * from ".$NomBase." $where_mot"; $resultat = $bdd->query($requete) or die(print_r($bdd->errorInfo())); while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) { echo $donnees['scrabble_name'].", "; } }else{ echo'<form action="moteur1.php" method="GET" name="code"> <div class="col-1"><input class="moncho" name="monmot" style="overflow:visible" autofocus autocomplete="off" type="text" maxlength="18" title="Entrez un mot" placeholder="Entrez votre mot "/><br/><br/></div><div class="col-3"></div> <div class="col-2"><input class="bouton" name="mot" type="submit" value="Rechercher"/></div> </form>'; } ?>

Re: Chercher via des lettres (BD)

par Spols » 26 sept. 2017, 09:01

re,

J'ai pensé à un autre moyen hier soir dans les embouteillage :D

Aprés avoir créer la première liste d'anagrammes, tu peux utiliser des fonctions natives de php donc plus rapide pour:
retirer la dernière lettre de chaque mot et ensuite supprimer les doublons.
donc une combinaison de array_walk et substr avec ensuite un coup de array_unique devrait t'éviter une fonction récursive.

il faudra juste mettre une boucle partant du nombre de lettre jusqu'à ton nombre de lettre minimum pour un mot.

EDIT

En cherchant un peu sur internet je suis tombé sur ceci qui rend le tout beaucoup plus facile
https://stackoverflow.com/questions/106 ... thm-in-php
l'idée est de factoriser ton mot:
en attribuant un nombre premier à chaque lettre (classer dans l'ordre d'apparence statistique pour réduire le résultats finale), tu peux obtenir un nombre correspondant à ton mot et dont tous les anagrammes sont des diviseurs de ce nombre.

donc dans ta base de donnée tu dois factoriser tous tes mots. (les classer par taille plutot que par première lettre serait une bonne idée)
et ensuite une simple requète t'apportera tous les anagrammes en direct.
comme la requète peut être gourmande, limité au tables contenant le bon nombres de lettres réduira la charge.
comme critére de sélection, il faut que le modulo 1 de la division de la factorisation de ton mot par la factorisation du mot de la bdd soit égal à 0.
OU
que l'arrondi vers le haut et vers le bas du résultat de la division soit égaux
(il faut voir quelle condition requière le moins de ressource)

Re: Chercher via des lettres (BD)

par Jefekoi » 25 sept. 2017, 12:08

Merci pour ton aide et tes conseils

Je vais essayer de faire un truc au mieux par rapport à tes explications :)

Re: Chercher via des lettres (BD)

par Spols » 25 sept. 2017, 10:44

Je pense à une fonction récursive qui crée tous les anagrammes du mot de départ et puis cherche tous les anagrammes du même mots amputé d'une lettre. chaque sous recherche d'anagramme cherchera aussi les anagrammes amputé d'une lettre jusqu'à un nombre minimum de lettres.
Tous les anagrammes sont mis dans un seul tableau.
Ensuite un array_unique sur ce tableau et on le classe par ordre alphabétique.
un parcours du tableau crée une requète par lettre de début pour savoir quel anagrammes correspondent à des mots de ta base. une UNION sur chaque requète et tu obtiendra ta liste.

exemple:
lettres : noir
1er niveau de fonction fait la liste des 24 anagrammes puis demandent la liste des anagrammes de oir, nor, nir, oir soit 6 * 4 anagrammes en plus dans la liste
chaque 2eme niveau de fonction va demander la liste des angrammes de oi, or, ir ; no, nr, or ; ni, nr, ir ; oi, or, ir, soit 2 * 12 nouveaux anagrammes
en tout ta liste ferait donc 24 + 24 + 24 anagrammes dont plusieurs double. on rend la liste unique et on crée les requète.

voila comment moi je ferai cela.

Re: Chercher via des lettres (BD)

par Jefekoi » 25 sept. 2017, 08:54

Merci,

Voici exactement ce que je voudrais : http://v2.anagrammeur.com/

Oui pour les tables j'aurais pu faire autrement mais c'est qu'il y a 393671 mots c'est énorme :)

Re: Chercher via des lettres (BD)

par Spols » 25 sept. 2017, 08:47

Ok je vois bien le problème. Est-ce que Orange est un mots à trouver ? car si un o est disponible sur le plateau, c'est une proposition intéressante. Si c'est le cas c'est plus compliqué et je vois moins bien comment solutionner le problème


Dans tous les cas, ca doit être une base de données bien grande mais l'avoir divisé en table pour chaque lettre n’est peut être pas le meilleur moyen.
Si sur une seule table, c'est trop gros, je ferais plutot un regroupement par nombre de lettres avec une deuxième colonne avec les lettres dans l'ordre alphabétique.
Ensuite à partir des lettres de ta recherche, tu devra créer tous les masques de recherche et les passer dans ta requète. en utilisant la colonne par ordre alphabétique, tu réduira fortement le nombre de masque et les anagrammes serait regroupé.

Re: Chercher via des lettres (BD)

par Jefekoi » 25 sept. 2017, 03:47

Bonjour,

Merci pour ta réponse Spols

Pour répondre à ta question j'ai créé tous les mots possible, c'est pour cela que j'ai fais une table par "lettres" a,b,c,d .. etc.
Ce que je cherche à avoir comme résultat c'est à partir de quelques lettres exemple : m r a n r e g , il va tout me donner en resultat : manger, nager, game, rage etc
...
Mais comme tu peux voir sur le lien, avec les lettres "mranreg" il ne me donne rien comme résultat :(
http://www.verifier-mots.fr/moteur.php
Merci pour ton aide.

Eric

Re: Chercher via des lettres (BD)

par Spols » 22 sept. 2017, 08:23

Personnellement, je créerais tous les "mots" possibles (tous les anagrammes) regroupé par la première lettre.

Donc une requète par nombre de lettres et éventuellement regroupé par UNION pour n'en faire qu'une. chaque requète cherchant à trouver les mots qui existe parmis toutes les possibilités

Cherches tu les mots d'une lettres de plus ou aussi les mots plus long ?

Chercher via des lettres (BD)

par Jefekoi » 22 sept. 2017, 07:47

Bonjour,

Je ne cherches pas à avoir la solution de ma recherche mais un indice sur les les noms des fonctions (syntaxe) à utiliser

Je suis en train de me faire un petit jeu de scrabble, en fait c'est un dictionnaire, ma femme et moi on adore jouer à ce jeu et bien sur lorsqu'un mot est "douteux" on regarde sur mon script.

Donc j’essaie de l'améliorer mon programme car il arrive des moments ou il nous reste 4 ou 5 lettres et on a plus de mal à trouver un mot.

Faire une recherche de mots avec des lettres restantes , voici un exemple avec les lettres "jater" il me trouve cette liste : http://www.verifier-mots.fr/moteur.php

Seulement il donne le résultat par rapport à l'ordre des lettres que j'ai donné, je voudrais qu'il me donne la liste de tous les mots avec comme lettre : "j.a.t.e.r" peu importe l'ordre .. et là je cale.

Voici mon script (en brouillon):

Petite info (j'ai 26 tables) A.B.C .etc...
<?php

$mot="jater";

$longueur = strlen($mot);
for($index = 0; $index < $longueur; $index++)
{
$monmot .= "%".$mot[$index]."%";
}
$premierelettre=$mot[0];$NomBase=$premierelettre."_dico";


// connexion bdd
$BDD_hote = '*****';
$BDD_bd = '*****';
$BDD_utilisateur = '*****';
$BDD_mot_passe = '*****';



$chainesearch = addslashes($monmot);

echo '<br /><hr/>Vous avez recherché : <strong>' . $mot . '</strong><br />';

try{
$bdd = new PDO('mysql:host='.$BDD_hote.';dbname='.$BDD_bd, $BDD_utilisateur, $BDD_mot_passe);
$bdd->exec("SET CHARACTER SET utf8");
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
}
catch(PDOException $e){
echo 'Erreur : '.$e->getMessage();
echo 'N° : '.$e->getCode();
}

$requete = "SELECT * from ".$NomBase." WHERE scrabble_name LIKE '%". $chainesearch ."%'";

// Exécution de la requête SQL
$resultat = $bdd->query($requete) or die(print_r($bdd->errorInfo()));
//echo 'Les résultats de recherche sont : <br />';
while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) {
echo $donnees['scrabble_name'] .', ';
}


?>

Donc si vous pouvez me donner une piste.

Merci à vous

PS: Je vais être absent jusqu’à lundi