IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Question difference entre deux chaines de caracteres


Sujet :

Langage PHP

  1. #1
    Candidat au Club Avatar de HydreFunky
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Question difference entre deux chaines de caracteres
    Bonjour,

    Voila, à partir d'un input search, les visiteurs entre plusieurs ingrédient de recette (abricot, banane, poire) afin de trouver une recette qui comprend leurs ingredients.
    Voici mon script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $var_1 = $_POST['ing'];
    $var_2 = $message->ingredient;
    similar_text($var_1, $var_2, $percent);
    echo 'Pourcentage : <b>'.$percent.'</b><br>';
     
    if ($percent >= 50)
     {
        echo 'Recette trouvé : '.$message->nom;
     }
    else
     {
        echo 'Aucune recette trouvé';
     }

    Donc si dans mon input search j'écris (abricot, banane, poire) ce dernier va me trouver ma recette(test) qui contient comme ingrédient (abricot, banane, poire).

    Le problème, c'est que si je rentre (abricot, banane, poire, boeuf, carotte, courgette, concombre) il ne me trouvera pas la recette(test) alors que pourtant j'ai toujours (abricot, banane, poire)


    Ensuite, si je rentre (abricot, banane, carotte) il me trouve la recette(test) alors que je n'est pas écrit (poire).

    Je sais que c'est le script qui ne convient pas :/

    Ma table recette contient (id, nom, image, resume, ingrédient) les ingrédients sont inscrit sous cette forme (abricot, banane, poire, ....)

    Quelqu'un pourrais me mettre sur une piste s'il vous plaît?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu peux :
    - lister precisement les ingrédients de chaque recette dans une table à part.
    ou
    - faire une recherche Fulltext dans le texte de la recette plutôt que de lister les ingrédients
    ou
    - faire une recherche de chaque ingrédient dans ta colonne ou dans le texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LIKE '%ingredient1%' AND LIKE '%ingredient2%'

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 897
    Points : 6 662
    Points
    6 662
    Par défaut
    Tu ne peux pas baser un script de recherche sur une fonction comme similar_text car d'une part cette fonction a une complexité énorme en O(n^3) ( ce qui veut dire que plus il y aura de données dans ta base et plus les chaînes seront longues, plus les recherches deviendront très vite super lentes ), et d'autre part l'interprétation du résultat qu'elle renvoie est très approximative.

    Ton meilleur atout est la base de données, c'est l'outil ultime pour la recherche rapide d'informations, mais encore faut il donner une structure adéquate à ta base de manière à faciliter la recherche. Par exemple, quelque chose comme ça:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Table recette
    --------------
    id
    nom
    image
    resume
     
    Table ingredient
    ------------
    id
    nom
     
    Table ingredient_recette
    ------------
    fk_id_ingredient
    fk_id_recette


    Ensuite quand un utilisateur transmet une demande, tu sépares la chaîne en un tableau d'ingrédients que tu utiliseras pour composer ta requête SQL (prends bien soin d'utiliser des requêtes préparées pour éviter les injections SQL).

  4. #4
    Candidat au Club Avatar de HydreFunky
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    j'ai travaillé sur le script pour intégré explode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //Algo Explode POST_INGREDIENT
    $nbr_ingredient_POST = str_word_count($_POST['ing']);
    $ingredient_poste_POST  = $_POST['ing'];
    $ingredient_explode_POST = explode(", ", $ingredient_poste_POST);
     
    //Algo Explode SQL_INGREDIENT
    	foreach($result as $result)
    		{
    $nbr_ingredient_SQL = str_word_count($result->ingredient);
    $ingredient_poste_SQL  = $result->ingredient;
    $ingredient_explode_SQL = explode(",", $ingredient_poste_SQL);
    		}
    //AFFICHAGE RECETTE
    	if ($ingredient_explode_POST[0] == $ingredient_explode_SQL[0])
    		{
    			echo ' <br>OK <br>';
    		}
    	else
    		{
    			echo ' <br>PAS OK <br>';
    		}
    	}
    le seul hic, c'est que je ne sais pas comment faire pour que ma condition compare $ingredient_explode_POST[1], $ingredient_explode_POST[2], $ingredient_explode_POST[3] ... avec le champs ingredient de ma table recette :/


    Pour répondre à sabotage, je ne peux utiliser LIKE, car si les visiteurs ne rentre pas dans le même ordre les ingrédients, cela ne fonctionne pas ...*

    CosmoKnacki => l'idée est bonne, mais le problème c'est que cela risque de faire très très lourd dans la base de donnée, car si j'ai 100 recettes avec 12 ingrédients ça fait déjà 1200 entrée dans la table Table ingredient_recette

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 897
    Points : 6 662
    Points
    6 662
    Par défaut
    Le nombre d'entrées dans la table ingredient_recette n'a aucune importance, quand bien même tu en aurais des millions ça ne ferait même pas frémir ta base, c'est rien du tout en terme de place (chaque entrée est composé de deux id numériques c'est que tchi). D'autre part tu oublies qu'en faisant ça tu évitera de stocker dans ta base X fois la chaîne de caractère d'un même l'ingrédient pour les Y recettes qui l'utilise, ce qui en terme de place sera au final bien plus léger que le modèle sur lequel tu es parti.

    le seul hic, c'est que je ne sais pas comment faire pour que ma condition compare $ingredient_explode_POST[1], $ingredient_explode_POST[2], $ingredient_explode_POST[3] ... avec le champs ingredient de ma table recette :/
    C'est tout l'intérêt du modèle que je t'ai proposé car avec celui-ci tu peux facilement trouver les recettes comportant un ingrédient à partir des ids de la table ingredient_recette.

  6. #6
    Candidat au Club Avatar de HydreFunky
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci pour ton aide, je vais bosser sur ce que tu m'as dit, je vous tiendrez au courant !

  7. #7
    Candidat au Club Avatar de HydreFunky
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bon je pense que je suis sur la bonne vois grâce a ton explication :ouf:
    Donc j'ai refait mes table SQL comme tu m'as conseillée.
    Mais j'ai un petit soucis, dans mon champs de recherche, l'envoie de tout les ingrédients ce fait en une seul variable.

    Par exemple :
    Le visiteur écrit : abricot, boeuf, carotte dans le champs de recherche, quand il fait recherche, les trois ingrédients sont stocké dans la variable "$ingredient_visiteur".

    Mais pour que je puisse rechercher l'ID des ingrédients 1 par 1 dans la table ingrédients, il faut que je puisse les séparés.

    Donc pour cela j'utilise un explode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ingredient_visiteur = $_POST['ing'];
    			//Recherche de l'ID dans la table ingredient_recette
    			include 'app/Mysql/link.php';
    			$nbr_ingredient_POST = str_word_count($ingredient_visiteur);
    			$ingredient_poste_POST  = $ingredient_visiteur;
    			$ingredient_explode_POST = explode(",", $ingredient_poste_POST);
    			$i = 0;
    			while ($i <= $nbr_ingredient_POST)
    			{
    				$req = $connexion->prepare('SELECT * FROM ingredient WHERE nom = ?');
    				$req->execute(array($ingredient_explode_POST[$i++]));
    				while ($donnees = $req->fetch())
    				{
    					echo 'ID ' . $donnees['id'] . '';
    				}
    			}
    Mais cela ne me donne que l'ID du premier ingrédient écrit, uniquement le premier.
    Donc comment je peu faire pour séparé mes ingrédients afin de trouvé leurs ID dans la tables ingrédient?

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pour répondre à sabotage, je ne peux utiliser LIKE, car si les visiteurs ne rentre pas dans le même ordre les ingrédients, cela ne fonctionne pas ...*
    Au passage quand même, dans mon exemple, l'ordre des ingrédients saisis n'a pas d'importance

  9. #9
    Candidat au Club Avatar de HydreFunky
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Au passage quand même, dans mon exemple, l'ordre des ingrédients saisis n'a pas d'importance
    Oui certes, mais le problème est le même que j'ai à chaque fois, il faut que j'arrive à séparé mes ingrédients comme expliquer plus haut

  10. #10
    Candidat au Club Avatar de HydreFunky
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2016
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Helloooo

    Pour le moment je me suis un peu 'perdu ', j'arrive à séparé les ingrédients du visiteur, à rechercher leurs IDs respectif, et trouver les recettes qui contienne les ingrédients :Youhouuuuu:

    Mais maintenant, ce que je n'arrive absolument pas, c'est de comparé les ingrédients des visiteurs à ceux des recettes ...

    Voici le code (Un peu "beaucoup dégueulasse") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    $ingredient_visiteur = $_POST['ingredient'];
    			include 'Public/Mysql/link.php';
    			$ingredient_recherche_use = rtrim($ingredient_visiteur,', ');
    					// RECHERCHE ID INGREDIENT
    					//On recherche les IDs des ingredients ecrit pas le visiteur
    					$sth = $connexion->query("SELECT * FROM ingredient WHERE nom IN ($ingredient_recherche_use) ");
    					while ($donnees = $sth->fetch())
    						{
    						$id_resultat = "'".$donnees['id']."',";
    						$id_resultat_use = rtrim($id_resultat,',');
     
    								echo '<br>ID des ingredient du visiteurs '.$id_resultat_use;
     
    					// 	RECHERCHE FK_ID_RECETTE
    					// On recherche les recettes contenant les IDs des ingredients du visiteur
    					$sthid = $connexion->query("SELECT * FROM ingredient_recette WHERE fk_id_ingredient IN ($id_resultat_use) ");
    					$donnees_id = $sthid->fetch();
     
    							if ($donnees_id['fk_id_recette'] == TRUE)
    							{
    									echo '<br>ID_FK_RECETTE : '.$donnees_id['fk_id_recette'].'<br>';
     
    									$fk_id_recette = "'".$donnees_id['fk_id_recette']."',";
    									$fk_id_recette_use = rtrim($fk_id_recette,',');
     
    								$sthidrecette = $connexion->query("SELECT * FROM ingredient_recette WHERE fk_id_recette IN ($fk_id_recette_use) ");
    								while($donnees_id_recette = $sthidrecette->fetch())
    								{
    								echo 'La recette N° :'.$fk_id_recette_use.' contient les IDs ingredient N° '.$donnees_id_recette['fk_id_ingredient'].'<br>';
    								//Maintenant il faut verifier que chaque IDs est entrée par le visiteur
     
    								}
    							}
    						}
    Par pitié, dite moi que vous avez une solution s'il vous plaît

Discussions similaires

  1. difference entre deux chaines de caractères char*
    Par mandrain dans le forum Débuter
    Réponses: 2
    Dernier message: 12/06/2014, 18h51
  2. Trouver les differences entre deux chaines
    Par xxxavvv dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2010, 23h42
  3. supprimer texte entre deux chaine de caractere
    Par fadoch dans le forum C++
    Réponses: 7
    Dernier message: 14/01/2010, 16h59
  4. Réponses: 1
    Dernier message: 02/12/2009, 16h18
  5. Réponses: 7
    Dernier message: 03/02/2006, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo