1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P68 pdf

5 256 1

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 131,62 KB

Nội dung

7.4 Recommandations 313 renvoient le résultat. Elles se trouvent dans classes/Util.php. Les deux autres fonctions se chargent de calculer respectivement les formules (7.3) et (7.2), page 306. Afin de calculer une prédiction, on procède en deux étapes : 1. d’abord on calcule le coefficient de corrélation entre l’internaute pour lequel on s’apprête à faire la prédiction et tous les autres : on stocke ces valeurs dans un tableau associatif $tabCorr indexé par le nom des internautes ; 2. puis on prend chaque film non noté par l’internaute, on applique la fonction calculant la prédiction, et on affiche le résultat. Le calcul des prédictions pour un ensemble de films est implanté par la méthode privée prediction() du contrôleur Recomm, donnée ci-dessous. private function prediction ($email , $nb_films) { $films = array() ; // Calcul des corrélations avec les autres internautes $reqInternautes = "SELECT i.∗ FROM Internaute i , Notation n " . " WHERE n.email = i.email AND i.email != ’$email’ " . " GROUP B Y i . e m a i l HAVING COUNT( ∗)>10"; $listeInter = $this−>bd−>execRequete ( $reqInternautes ) ; $tab_corr = array() ; while ($internaute = $this−>bd−>objetSuivant ($listeInter )) $tab_corr [$internaute−>email ] = Util :: calculCorrelation ($email , $internaute−>email , $this−>bd) ; // Recherche des films , en ordre aléatoire $ r eq uet e = "SELECT ∗ FROM Film ORDER BY RAND() " ; $resultat = $this−>bd−>execRequete ($requete) ; $i=1; while ($film = $this−>bd−>objetSuivant ($resultat )) { // On vérifie que ce film n’ est pas noté par l ’ internaute $notation = Util :: chercheNotation ($email , $film−>id , $this −>bd) ; if (! $notation) { // Calcul de la prédiction pour ce film $prediction = Util :: calculPrediction ($email , $film−>id , $tab_corr , $this−>bd ) ; $prediction = round ($prediction∗100) /100; $films [$film−>id] = $prediction ; if ($i++ >= $nb_films) break ; } } // On renvoie le tableau des prédictions return $films; } 314 Chapitre 7. Production du site On constate qu’il faut manipuler beaucoup d’informations pour arriver au résultat, ce qui risque de soulever des problèmes de performance pour une base de données volumineuse. En particulier, le tableau des corrélations contient autant d’éléments qu’il y a d’internautes dans la base, et le passage de ce tableau en paramètre de la fonction CalculPrediction() peut être assez pénalisant. Un passage par référence éviterait cela. Une fois qu’une application est stabilisée, et dans la mesure où elle est conçue de manière véritablement modulaire, il est relativement facile de remettre en cause quelques fonctions pour améliorer les performances. Ici une optimisation simple consisterait à ne pas recalculer systématiquement et en temps réel les corrélations entre internautes, mais à le faire périodiquement – par exemple une fois par jour – en stockant le résultat dans une table MySQL. Au lieu de passer le tableau $tabCorr en paramètre de la fonction CalculPrediction(), cette dernière pourrait alors chercher les corrélations dans la table. La méthode statique Util::calculCorrelation() calcule et renvoie le coeffi- cient de corrélation entre deux internautes, selon la formule (7.3). Elle effectue donc une boucle sur tous les films, prend ceux qui ont été notés par les deux internautes, et calcule les composants de la formule. static function calculCorrelation ($email1 , $email2 , $bd) { $somme_numerateur = 0.; $somme_denom1 = 0 . ; $somme_denom2 = 0 . ; $moyenne1 = self :: moyenneInternaute ($email1 , $bd) ; $moyenne2 = self :: moyenneInternaute ($email2 , $bd) ; $ r eq uet e = "SELECT ∗ FROM Film" ; $listeFilms = $bd−>execRequete ($requete) ; while ($film = $bd−>objetSuivant ( $listeFilms )) { $notation1 = self :: chercheNotation ($email1 , $film−>titre , $bd) ; $notation2 = self :: chercheNotation ($email2 , $film−>titre , $bd) ; if ($notation1 and $notation2) { $somme_numerateur += ( $notation1−>note − $moyenne1) ∗ ($notation2−>note − $moyenne2) ; $somme_denom1 += pow( $notation1 −>note − $moyenne1 ,2) ; $somme_denom2 += pow( $notation2 −>note − $moyenne2 ,2) ; } } $somme_denominateur = sqrt ($somme_denom1 ∗ $somme_denom2) ; if ($somme_denominateur != 0) $corr = abs($somme_numerateur) / $somme_denominateur ; else $corr = 0; 7.4 Recommandations 315 return $corr ; } Les fonctions pow(), sqrt() et abs() font partie du riche ensemble de fonctions de PHP (voir annexe C). Finalement la méthode statique Util::calculPrediction() applique la formule (7.2) pour calculer la prédiction sur un film comme la moyenne des notations des autres internautes sur ce film, pondérées par les coefficients de corrélation. static function calculPrediction ($email , $id_film , $tab_corr , $bd) { // Calcul de la moyenne des notes de l ’ internaute courant $ma_moyenne = self :: moyenneInternaute($email , $bd) ; // Boucle sur toutes les autres notations du même film $ r e q _n o ta ti o ns = "SELECT ∗ FROM Notation WHERE id_film = ’ $id_film ’"; $liste_notations = $bd−>execRequete ($req_notations) ; // Application de la formule de corrélation $somme_corr = 0.; $somme_ponderee = 0.; while ($notation = $bd−>objetSuivant ($liste_notations)) { $moyenne = self :: moyenneInternaute($notation−>email , $bd) ; $somme_corr += (float) $tab_corr ["$notation−>email " ]; $somme_ponderee += ( float ) $tab_corr [ " $notation−>email " ] ∗ ($notation−>note − $moyenne) ; } if ($somme_corr != 0.) return $ma_moyenne + ($somme_ponderee / $somme_corr) ; else return $ma_moyenne; } On peut remarquer dans cette fonction que les variables $sommeCorr et $sommePonderee sont explicitement manipulées comme des réels, avec la commande de conversion (float) placée devant une expression. Comme PHP est libre de convertir une variable en fonction du type qui lui semble le plus approprié, il vaut mieux prendre la précaution de donner explicitement ce type s’il est important. XML 8 Ce chapitre propose une introduction à XML et présente quelques utilisations pos- sibles de ce langage dans le cadre d’un site web basé sur MySQL et PHP. L’intérêt de XML dans un tel contexte consiste essentiellement à faciliter l’échange de données, aussi bien pour exporter des données de la base MySQL et les transmettre sur le réseau, que pour récupérer des données et les insérer dans la base. Nous verrons comment représenter une base de données relationnelle en XML et comment utiliser les fonctions PHP pour extraire des données de cette représentation. Une autre possibilité d’utilisation de XML est la publication de données. Un des atouts de XML est de rendre la représentation de l’information indépendante des applications qui la manipulent. Dans notre cas, cela signifie qu’un document XML produit par un site web MySQL/PHP n’est pas réduit à être affiché dans un navigateur, à la différence des documents HTML construits jusqu’à présent. On peut, après une phase de transformation, proposer les informations de ce document au format HTML, mais aussi PDF pour une lecture ou impression de qualité, SVG pour des graphiques, ou enfin RSS. En d’autres termes on sépare le contenu de la présentation, ce qui rejoint en partie les objectifs des solutions de templates présentées dans le chapitre 5. Notre présentation de XML est bien entendu illustrée dans le cadre du site W EBSCOPE, les fonctionnalités étant rassemblées dans le contrôleur XML dont la page d’accueil est reprise figure 8.1. On peut, à l’aide d’un formulaire semblable à celui utilisé pour la notation (voir page 295), rechercher des films et en obtenir une représentation sous forme de document XML, indépendante donc de MySQL, PHP ou HTML. On peut également appliquer une transformation XSLT à ce même document pour le mettre au format HTML (selon le même principe, on pourrait obtenir de nombreux autres formats). Enfin il est possible d’effectuer l’opération inverse, à savoir transmettre au serveur un fichier contenant un document XML . essentiellement à faciliter l’échange de données, aussi bien pour exporter des données de la base MySQL et les transmettre sur le réseau, que pour récupérer des données et les insérer dans la base. Nous. peut remarquer dans cette fonction que les variables $sommeCorr et $sommePonderee sont explicitement manipulées comme des réels, avec la commande de conversion (float) placée devant une expression base de données relationnelle en XML et comment utiliser les fonctions PHP pour extraire des données de cette représentation. Une autre possibilité d’utilisation de XML est la publication de données.

Ngày đăng: 06/07/2014, 00:20

TỪ KHÓA LIÊN QUAN