REGEXP et PHP pour recherche dans BDD MYSQL

Résolu/Fermé
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 - 13 déc. 2009 à 16:47
vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 - 20 déc. 2009 à 19:01
Bonjour,

Voilà j'ai fait un code afin de pouvoir faire une recherche dans ma base de données MYSQL mais le problème est que je ne sait pas comment optimiser mon code car il fait des recherche vraiment aléatoire et qui plus est n'est pas vraiment efficace.

/*Regexp de recherche */
$texte = preg_split('#[.,\' \!\?/]#i', $texte, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

/* On initailise la variable de sorti */
$sortiRecherche = '^(.+)?';

/* On initailise la variable de confirmation de recherche correct */
$ValidOK = 0;

/* On fait une boucle for pour voir toute les parties */
for ($i = 0; $i <= 99; $i++)
{
if (isset ($texte[$i]))
{
if ($texte[$i] != NULL)
{
/* Ici on écarte de la recherche tout les mot trop courant */
if (preg_match('#^(.)$#', $texte[$i]))
{
/* Un seul carctere on exclue */
}
else
{
/* Liste des exclusions */
if ($texte[$i] == 'une')
{
/* On exclue et de la recherche */
}
else if ($texte[$i] == 'les')
{
/* On exclue de la recherche */
}
else if ($texte[$i] == 'est')
{
/* On exclue de la recherche */
}
/* Liste des exclusions */
else
{
if (preg_match('#^(.{4,})$#', $texte[$i]))
{
/* La recherche est assez précise */
$ValidOK = 1;

/* On compléte la requete SQL */
$sortiRecherche .= '(' . $texte[$i] . ')+(.+)?';
}
else
{
/* Ce mot est trop courant, ou trop petit pour influencer sur la recherche mais on le laisse quand même */
$sortiRecherche .= '(' . $texte[$i] . ')?(.+)?';
}
}
}
}
else
{
$i = 100;
}
}
else
{
$i = 100;
}
}
/* On compléte le regex */
$sortiRecherche .= '$';
if ($sortiRecherche == '^$' OR $ValidOK != 1)
{
echo 'Votre recherche n\'est pas assez précise.';
}
else
{
echo 'La requete qui sera faite au serveur sera donc : \'' . $sortiRecherche . '\'';

/* On utilise le résultat dans la requete mysql */
include_once("../security/connection/connectionMYSQL.php");

/* Initialisation de la variable */
$j = 1;

/* On effectue la requete pour le titre */
$titre = mysql_query('SELECT * FROM news WHERE titre REGEXP \'' . $sortiRecherche . '\'');
while ($titreTrouve = mysql_fetch_array($titre))
{
$$j = $titreTrouve['titre'];
$j++;

/* On cherche le contenu correspondant a la news */
$contenuTitre = mysql_query('SELECT contenu FROM news WHERE titre=\'' . $titreTrouve['titre'] . '\'');
while ($contenuTitreTrouve = mysql_fetch_array($contenuTitre))
{
$$j = $contenuTitreTrouve['contenu'] . '<br /><br />';
$j++;
}
}

/* On recherche dans le contenu */
$contenu = mysql_query('SELECT * FROM news WHERE contenu REGEXP \'' . $sortiRecherche . '\'');
while ($contenuTrouve = mysql_fetch_array($contenu))
{
$$j = $contenuTrouve['contenu'];
$j++;

/* On cherche le titre correspondant a la news */
$titreContenu = mysql_query('SELECT titre FROM news WHERE contenu=\'' . $contenuTrouve['contenu'] . '\'');
while ($titreContenuTrouve = mysql_fetch_array($titreContenu))
{
$$j = $titreContenuTrouve['titre'] . '<br /><br />';
$j++;
}
}

/* On relance la recherche si rien n'a été trouver */
if ($j == 1)
{
/* On relance la recherche avec d'autre argument */
$sortiRecherche = preg_replace('#^[\^](.+)[\$]$#', '$1', $sortiRecherche);

echo '<br />La requete précedente n\'a trouver aucun résultat la requete a été modifier en : \'' . $sortiRecherche . '\'';

/* On effectue la requete pour le titre */
$titre = mysql_query('SELECT * FROM news WHERE titre REGEXP \'' . $sortiRecherche . '\'');
while ($titreTrouve = mysql_fetch_array($titre))
{
$$j = $titreTrouve['titre'];
$j++;

/* On cherche le contenu correspondant a la news */
$contenuTitre = mysql_query('SELECT contenu FROM news WHERE titre=\'' . $titreTrouve['titre'] . '\'');
while ($contenuTitreTrouve = mysql_fetch_array($contenuTitre))
{
$$j = $contenuTitreTrouve['contenu'] . '<br /><br />';
$j++;
}
}

/* On recherche dans le contenu */
$contenu = mysql_query('SELECT * FROM news WHERE contenu REGEXP \'' . $sortiRecherche . '\'');
while ($contenuTrouve = mysql_fetch_array($contenu))
{
$$j = $contenuTrouve['contenu'];
$j++;

/* On cherche le titre correspondant a la news */
$titreContenu = mysql_query('SELECT titre FROM news WHERE contenu=\'' . $contenuTrouve['contenu'] . '\'');
while ($titreContenuTrouve = mysql_fetch_array($titreContenu))
{
$$j = $titreContenuTrouve['titre'] . '<br /><br />';
$j++;
}
}

/* Resultat des courses */
if ($j == 1)
{
echo '<br />Aucun résultat ne correspond à votre demande.<br />Merci de la modifié.';
}
else
{
/* On ne faire rien un résultat a été trouver */
}
}
for ($w = 1; $w < $j; $w++)
{
echo '<br />' . $$w;
}
}

Ce code est bien sur pour le moment a peu près opérationnel mais je n'arrive pas a affiner les recherches, je sait que les mots entre parenthèse qui possède un ? n'intervienne en rien dans la recherche mais j'aimerai qu'il intervienne un peu mais pas de la même façon que les grands mots.

Merci pour votre aide futur.
Et par la même occasion si quelqu'un pouvait me dire se qu'il pense de mon code sa m'aiderai pas mal pour l'optimiser.
Merci
A voir également:

1 réponse

vladivostok Messages postés 228 Date d'inscription samedi 6 septembre 2008 Statut Membre Dernière intervention 8 février 2010 20
20 déc. 2009 à 19:01
C'est bon j'ai réussit.
0