recherche et classement avec php

hanlin

WRInaute occasionnel
Bonjour,
J'essaye de mettre en place une page qui me permet de donner des statistiques sur le nombre de fois ou chaque auteur d'ouvrage a été cité dans les articles du site.
J'ai une table listant les auteurs (id,, nom, occurance)
J'ai une table articles (titre, texte)

J'ai écrit un morceau de code mais bon , c pas top et je galère même si j'arrive à obtenir ce que je veux...Deux problèmes :
1-une erreur à la fin de l'exécution qui s'affiche en haut de ma page :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource...
2-le temps de chargement est long (j'ai 600 auteurs à chercher dans une table d'articles importante), je ne sais pas vraiment comment optimiser cela pour consommer moins de ressources.
Si quelqu'un pouvait me donner son avis d'expert et m'aider à avancer dans ma besogne, je lui serait reconnaissant.
Voici ce que j'ai écrit :
Code:
<?php 

	function get_rows ($key) 
	{
	

        $total = mysql_query("SELECT COUNT(*) FROM article WHERE title REGEXP '[[:<:]]($key)[[:>:]]'");
		
	
        $total = mysql_fetch_array($total);
        return $total[0];
		
    } 
	
	$sql= mysql_query ("select * from author ");

    while ($results= mysql_fetch_array ($sql)) 
	{
	
			$id= $results['id'];
  			$number=get_rows ($key);
	
	  

			mysql_query("UPDATE author SET occurence='$number' WHERE (id='$id')"); 
	
	}



?>

Merci par avance ! :D
 

u94082

WRInaute occasionnel
Salut,

Vu le nombre important d'auteurs et d'articles il est clair que tu ne pourra jamais avoir une page suffisamment rapide à charger pour ton visiteur. Il faut forcément passer par un cache et une tache cron (mais bon je peut me tromper, ya pas un gourou ds le coin ?).
Et puis pour bien faire la fonction qui cherche le nombre d'auteurs dans les articles et met à jour la table occurence devrait être implémentée au moment ou tu enregistre l'article dans ta bdd, mais bon c'est que pour le futur...
Dans l'absolu il ne vaudrait pas mieux partir sur quelque chose comme ci-dessous ?

Code:
$query_articles = 'sélection des articles';
$articles = mysql_fetch_array($query_articles);

$query_auteurs = 'sélection des auteurs';
$auteurs = mysql_fetch_array($query_auteurs);

foreach ($articles as $article) {
   foreach ($auteurs as $auteur) {
      $occurences = explode($auteur, $article);
      $occurences = $occurences - 1;
      echo $auteur' trouvé '.$occurences.' foi(s) dans .'$article.'<br>';
   }
}
 

hanlin

WRInaute occasionnel
Salut antinomx et merci pour ta réponse. Ce que j'ai tenté aujourd'hui c'est de faire un peu comme tu l'as décrit...Une table avec le nom de tous les auteurs. Un cron que je lance tous les soirs et qui met à jour cette table. Pour le morceau de code que j'ai mis en ligne, ma fois , cela marche assez bien. Mais j'ai peur que lorsque la base d'article devient important (genre 10000, cela sera plus galère...).
Dans ton code, si j'ai bien compris je sélectionne des articles ? Je dois les selectionner en fonction de chaque auteur resultant de la requete
Code:
mysql_fetch_array($query_auteurs);
. DU coup je ne vois pas ce que je peux mettre dans la premiere requete de ton code
Code:
$query_articles = 'sélection des articles';
. C'est pour cela que j'ai cru utile de mettre d'abord la fonction
Code:
function get_rows ($key)
...
Je suis pas très bon en prog, je bidouille, peut être que j'ai loupé un truc... Pour l'instant cela fonctionne, j'ai pensé à grouper les auteurs par 100 et à mettre à jour la table par groupe de 100 en faisant genre une pause entre chaque mise à jour.
ça doit être simple mais ça ma tordu la cervelle cette histoire... 8O
merci
 

u94082

WRInaute occasionnel
hanlin a dit:
Mais j'ai peur que lorsque la base d'article devient important (genre 10000, cela sera plus galère...).
C'est bien pour ça qu'il faut implémenter cette étape avant, au moment ou l'article est enregistré dans ta base juste après l'avoir écrit.

Le principe du code posté c'est de sélectionner tous les articles (le texte) et tous les auteurs (le nom). Puis de parcourir les deux tableaux qui en résultent. Donc tu parcours tous les articles, pour chaque tu parcours tous les auteurs en explosant le texte par le nom, ça te donne un tableaux dont tu compte le nombre de clés.

Le code est trop simplifié, en fait ça serait plutôt :
Code:
$query_articles = mysql_query("SELECT texte FROM articles");
$articles = mysql_fetch_array($query_articles);

$query_auteurs = mysql_query("SELECT nom FROM auteurs");
$auteurs = mysql_fetch_array($query_auteurs);

foreach ($articles as $article) {
   foreach ($auteurs as $auteur) {
      $occurences = count(explode($auteur[0], $article[0]));
      $occurences = $occurences - 1;
      echo $auteur' trouvé '.$occurences.' foi(s) dans .'$article.'<br>';
      mysql_query("UPDATE author SET occurence='$occurences' WHERE nom='$auteur[0]'"); 
      flush;
   }
}

Enfin faut tester... je suis pas vraiment sûr
 

Discussions similaires

Haut