Pourcentage

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 19:59

Alors, j'ai essayé de faire un calcul pour obtenir un pourcentage de pertinence issu d'une recherche en MATCH AGAINST mais j'ai besoin de faire 2 fois la même requête pour que cela marche et je ne suis pas sûr que mon petit code soit des plus judicieux...
<?php
include( "mysql.inc.php" );
$requete = "SELECT *, MATCH (fr) AGAINST ('temps') AS score FROM dic WHERE MATCH (fr) AGAINST('temps*' IN BOOLEAN MODE) ORDER BY score DESC";
$requete2 = "SELECT *, MATCH (fr) AGAINST ('temps') AS score FROM dic WHERE MATCH (fr) AGAINST('temps*' IN BOOLEAN MODE) ORDER BY score DESC";
$execution  = mysql_query( $requete, $connection );
$execution2  = mysql_query( $requete2, $connection );
$total = @mysql_num_rows( $execution ) ;
$u = mysql_fetch_array( $execution2 ) ;
$v= round ($u["score"],3);
if ($total!=0)
 {
while( $un_mot = mysql_fetch_array( $execution ) ) 
      {
$valeur= round ($un_mot["score"],3);
if ($v==0) {
$v=1;
}
$pourcent = round(($valeur*100)/($v),2);
       
echo $pourcent."% ".$un_mot["fr"] . " 【" . $un_mot["jap"]; ?>】<br />
<?php if ($com>0) { echo wordwrap($un_mot["com"], 80,"<br />","<br />");} else echo "";
}
}
else {
echo "aucun resultat";
}

?>  
 
lorsque le critère est complétement trouvé ça va jamais de 100% à 1% mais plutôt de 100% à 50%. Ce qui ne m'aide pas pour mettre en place une barre dynamique fonction du pourcentage...

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 23:03

Bon, je pars sur le principe que c'est pas trop mauvais puisque personne ne s'insurge ou sinon que c'est tellement laid que c'en est désespérant !

Enfin, je voulais donc avoir à partir de mon % une barre crée en image dynamique via PHP. J'ai fait un code qui me permet donc d'afficher le pourcentage et qui marche mais lorsque j'essaie d'intégrer ça dans mon fichier image, la valeur de retour du % est toujours de 100...

image.php
<?php  
header ("Content-type: image/png");
include( "mysql.inc.php" );
$requete = "SELECT *, MATCH (fr) AGAINST ('pluie') AS score FROM japfr WHERE MATCH (fr) AGAINST('pluie' IN BOOLEAN MODE) ORDER BY score DESC";
$requete2 = "SELECT *, MATCH (fr) AGAINST ('pluie') AS score FROM japfr WHERE MATCH (fr) AGAINST('pluie' IN BOOLEAN MODE) ORDER BY score DESC";
$execution  = mysql_query( $requete, $connection );
$execution2  = mysql_query( $requete2, $connection );
$u = mysql_fetch_array( $execution2 ) ;
$v= round ($u["score"],3);

while( $un_mot = mysql_fetch_array( $execution ) ) 
      { 
if ($v==0) {$v=1;}
$valeur= round ($un_mot["score"],3); // ça renvoie 100
$pourcent = round(($valeur*100)/($v),2);   // ça renvoie 100 aussi
$largeurImage = 100; 
$hauteurImage = 10;  
$image = imagecreate ($largeurImage, $hauteurImage)  or die ("Erreur lors de la création de l'image"); 
$heure = '' . date('H i'); // On stocke l'heure et les minutes dans une variable         

    $fond = imagecolorallocate($image, 143, 190, 241); // Fond bleu clair
	 $fond2 = imagecolorallocate($image, 25, 25, 25); // colonne blanc
    $couleur_texte = imagecolorallocate($image, 255, 255, 255); // Texte en blanc
	
        $largeurImageRectangle =  ($pourcent/$v);  // je suis sur que le problème est par là
        ImageFilledRectangle ($image, 0, 0, $largeurImageRectangle,40, $fond2);  

imagestring($image, 0, 0, 0, $valeur, $couleur_texte); // On affiche l'heure dans la bonne couleur

imagepng($image);
}

?>  

resultat.php
<?php
include( "mysql.inc.php" );
$requete = "SELECT *, MATCH (fr) AGAINST ('pluie') AS score FROM japfr WHERE MATCH (fr) AGAINST('pluie' IN BOOLEAN MODE) ORDER BY score DESC";
$requete2 = "SELECT *, MATCH (fr) AGAINST ('pluie') AS score FROM japfr WHERE MATCH (fr) AGAINST('pluie' IN BOOLEAN MODE) ORDER BY score DESC";
$execution  = mysql_query( $requete, $connection );
$execution2  = mysql_query( $requete2, $connection );
$total = @mysql_num_rows( $execution ) ;
$u = mysql_fetch_array( $execution2 ) ;
$v= round ($u["score"],3);
if ($total!=0)
 {
while( $un_mot = mysql_fetch_array( $execution ) ) 
      {
$valeur= round ($un_mot["score"],3);
if ($v==0) {$v=1;}
$pourcent = round(($valeur*100)/($v),2);
       
echo "<img src=\"modules\dico\image.php\">".$pourcent."% ".$un_mot["fr"] ."  ". $un_mot["jap"]; 
}
}
else {
echo "pas de traduction";

}
?>  
J'ai remis les requêtes dans le fichier image.php parce que je ne voyais pas comment faire autrement...
Merci d'avance à ceux qui prendront le temps de lire ça^^

Mammouth du PHP | 19672 Messages

25 janv. 2006, 23:21

J'ai un peu de mal avec ton système : tu obtiens 100% systématiquement, mais je ne comprends pas vraiment ce que tu veux calculer : tes deux requêtes sont exactement les mêmes :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 23:27

Salut Cyrano,

En fait, j'avais essayé d'obtenir le %age avec juste une seule requête mais je ne sais pas pourquoi, ça me changeait les résultats de la requête ! Alors j'ai fait 2 requêtes identiques : une pour afficher les résultats, une pour afficher le %age. je me doute que c'est pas top mais je n'ai pas trouvé mieux...

Enfin du coup, je pars sur mon système de 2 requêtes. Je voulais intégrer la valeur du %age pour que cela devienne la longueur du rectangle donc si 100% = rectangle entier, si 90%, plus petit, etc, etc dans mon fichier image.php

Si je demande à afficher juste le résultat dans résultat.php, j'ai les %ages qui s'affichent correctement
mais dans le fichier image.php, le %age devient 100. et je ne peux pas faire d'echo une fonction... Enfin je pense que j'ai pas la bonne méthode...

Mammouth du PHP | 19672 Messages

25 janv. 2006, 23:40

Si tu me donnais un exemple de données avec le résultat que ça devrait produire, et avec pour couronner tout ça la structure de la table, on pourrait trouver la manière de ne faire qu'une seule requête qui te donnerait les bonnes informations...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 23:50

C'est vrai que c'est pas très clair comme ça^^

la table c'est :

id, fr, jap, pro, com ou fr, jap, pro, com sont des varchar indexes en fulltext pour la recherche

sinon, le résultat, peut se voir en image ici :

http://www.raindropfr.com/result.jpg

la base de donnée est pas actualisée sur le serveur test...

Est ce que c'est un peu plus clair ? C'est vrai que je sais ce que je veux faire mais j'ai dû mal à être clair...

inuendo
Invité n'ayant pas de compte PHPfrance

25 janv. 2006, 23:57

Ah, en gros, si je pouvais récupérer la valeur $pourcent dans image.php ou l'incorporer de result.php vers image.php, j'aurais ma barre qui évoluerait en fonction :

la barre fait 100 de longueur
si $pourcent =100 alors la barre fera 100
si $pourcent =80 alors la barre fera 80 dans le rectangle de 100.

Il faudrait juste que je puisse récupérer la variable $pourcent mais je vois pas comment faire...

Mammouth du PHP | 19672 Messages

26 janv. 2006, 00:04

Bon, je ne comprends pas encore tout: ta requête te retourne quoi au juste ? Est-ce que théoriquement les résultats obtenus suffiraient pour créer tes graphiques et dans ce cas pourquoi la seconde requête identique ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

inuendo
Invité n'ayant pas de compte PHPfrance

26 janv. 2006, 00:13

La requête me retourne par pertinence les mots associés à la recherche donc à la base :

J'entre un mot : maison

La requete me renvoie :

Maison - la traduction 100%
La maison bleue - la traduction 99%

et me classe par score du plus pertinent au moins pertinent.

Le score est du type : 6,2132412542 pour le résultat le plus pertinent puis
5,8275223 pour le 2eme est ainsi de suite...

J'ai changé ce score pour obtenir un % où le premier résutlat = 100 (enfin c'est ce que je veux faire).

Donc je voulais utiliser ce pourcentage dans mon image dynamique pour avoir une barre qui évolue en fonction du %age.

Ce qu'on voit sur l'image, c'est le problème : dans image.php, il renvoie toujours 100 pour tous les mots au lieu de me renvoyer les %age comme dans result.php...

Pourquoi 2 requêtes ?
Parce que (je ne sais pas pourquio) si j'utilisais la même requête pour définir ma variable du premier score (celui de référence qui deviendra 100), les résultats affichés changés ! alors j'ai mis 2 requêtes mais j'avais peut-être mal formulés mes variables...

Désolé d'être aussi confus dans mes explications.

Mammouth du PHP | 19672 Messages

26 janv. 2006, 00:28

Bon ok, alors là, on va laisser le SQL de coté, tu ne vas faire qu'une seule requête et en utiliser correctement les résultats retournés.

Et on va laisser faire le PHP dans l'immédiat : c'est un problème mathématique :

Donc tu as une valeur qui va servir de référence pour déterminer le 100%... de la taille j'imagine pour ton image.

Prenons quelques chiffres arbitraires:
- 14.5
- 10.33
- 5.1
- 1.75
Nous devons commencer en extraire le plus grand, donc 14.5 pour déterminer le coefficient qui servira à multiplier les autres:
- x = 100/14.5 (ce me semble)
À partir de là, il ne reste qu'à multiplier les autres résultats par x pour obtenir la dimension correspondante dans l'échelle.
Donc si pour :
- 14.5 * x = 100;
- 10.33 * x = 71.2413...;
- 5.1 * x = 35.1724....;
- 1.75 * x = 12.0689...;
Ça te semble juste ?

Traduction en PHP : si tes résultats sont bien triés lors de la récupération, le premier sert à calculer le coefficient... dois-je vraiment continuer ? :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

inuendo
Invité n'ayant pas de compte PHPfrance

26 janv. 2006, 00:31

c'est ce que j'ai fait je crois ?
$pourcent = round(($valeur*100)/($v),2);
ou $valeur = le score de la ligne dans la boucle while
et $v = le score de la première ligne (hors de la boucle)

c'est ça ?

Je vais essayer de revenir à une requête...

inuendo
Invité n'ayant pas de compte PHPfrance

26 janv. 2006, 00:34

100% Jour de pluie, temps de pluie (nm); pluvieux(se) (adj) motjap (adj-no, n)
71.67% Eau de pluie (nm) motjap (n)70.87% Pluie, précipitation (nf) motjap (n)
70.87% Goutte de pluie (nf) motjap (n)
70.87% Goutte de pluie (nf) motjap (n)
69.31% Infiltration d'eau de pluie par le toit (nf) motjap (ns)
etc

C'est ce que me retourne mon code dans result.php

inuendo
Invité n'ayant pas de compte PHPfrance

26 janv. 2006, 00:37

(non, non, je ne flood pas^^)

j'ai enlevé la deuxième requête et ça marche toujours dans result.php, c'est donc bien ma première méthode qui était foireuse^^
<?php
include( "mysql.inc.php" );
$requete = "SELECT *, MATCH (fr) AGAINST ('pluie') AS score FROM japfr WHERE MATCH (fr) AGAINST('pluie' IN BOOLEAN MODE) ORDER BY score DESC";
$execution  = mysql_query( $requete, $connection );
$execution2  = mysql_query( $requete, $connection );
$total = @mysql_num_rows( $execution ) ;
$u = @mysql_fetch_array( $execution2 ) ;
$v= round ($u["score"],3);
if ($total!=0)
 {
while( $un_mot = mysql_fetch_array( $execution ) ) 
      {
$valeur= round ($un_mot["score"],3);
if ($v==0) {$v=1;}
$pourcent = round(($valeur*100)/($v),2);
       
echo "<img src=\"modules\dico\image.php\">".$pourcent."% ".$un_mot["fr"] ."  ". $un_mot["jap"]; 
}
}
else {
echo "pas de traduction";

}
?>  
Mais, je n'arrive pas à récupérer la valeur de $pourcent dans image.php...

Mammouth du PHP | 19672 Messages

26 janv. 2006, 00:46

c'est ce que j'ai fait je crois ?
$pourcent = round(($valeur*100)/($v),2);
Il me semble bien que non: ce que je suggère serait plus proche de:
$pourcent = round(100/$valeur);
C'est tout : par la suite, tu multiplies les résultats par $pourcent pour obtenir la proportion correspondante. Disons que ta formulae, c'est plus proche de l'art de se compliquer la tâche en coupant les cheveux en 4 :langue:

Proposition :
<?php
include( "mysql.inc.php" );
$requete  = "SELECT *, MATCH (fr) AGAINST ('pluie') AS score ".
            "FROM japfr ".
            "WHERE MATCH (fr) AGAINST('pluie' IN BOOLEAN MODE) ".
            "ORDER BY score DESC";
$execution  = mysql_query( $requete,  $connection );
$total = mysql_num_rows( $execution ) ;
if ($total != 0)
{
    $i = 0;
    while( $un_mot = mysql_fetch_array( $execution ) )
    {
        $valeur = round ($un_mot["score"],3);
        if ($v == 0)
        {
            $v = 1;
        }
        /* Si on est au premier tour, on calcule le coefficient, sinon on reconduit celui déterminé au premier tour. */
        $coeff = ($i == 0) ? round(100/$valeur) : $coeff;
        /* On calcule le pourcentage correpondant à la valeur sauf au premier tour où la plus grande valeur est obligatoirement 100 */
        $pourcent = ($i == 0) ? 100 : $valeur * $coeff;

        echo "<img src="modules/dico/image.php">". $pourcent ."% ". $un_mot["fr"] ."  ". $un_mot["jap"];
        $i++;
    }
}
else 
{
    echo "pas de traduction";
}
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

inuendo
Invité n'ayant pas de compte PHPfrance

26 janv. 2006, 00:55

Je me doutais que je me compliquais la vie !

Faudra que je regarde plus près ton code (merci pour les détails \:D/ )

En tout cas, ça arrive à quelque chose près au même résultat au niveau des stats sur la page :

100% Jour de pluie, temps de pluie (nm); pluvieux(se) (adj) motjap (adj-no, n)
71.094% Eau de pluie (nm) motjap (n)
70.295% Pluie, précipitation (nf) motjap(n)
70.295% Goutte de pluie (nf)motjap (n)
70.295% Goutte de pluie (nf) motjap(n)
68.748% Infiltration d'eau de pluie par le toit (nf) motjap (ns)
etc

Merci en tout cas pour l'amélioration du script !
Cependant, cela ne résout pas le problème qui est le fait d'avoir le %age dans image.php pour faire éévoluer la barre...
En fait, c'est peut-être tout bête, mais je n'arrive pas à avoir la $pourcent qui évolue dans image.php, il reste à la valeur de ligne 1...
<?php  
header ("Content-type: image/png");
include( "mysql.inc.php" );
$requete = "SELECT *, MATCH (fr) AGAINST ('pluie') AS score FROM japfr WHERE MATCH (fr) AGAINST('pluie' IN BOOLEAN MODE) ORDER BY score DESC";
$execution  = mysql_query( $requete, $connection );
$execution2  = mysql_query( $requete, $connection );
$u = mysql_fetch_array( $execution2 ) ;
$v= round ($u["score"],3);

while( $un_mot = mysql_fetch_array( $execution ) ) 
      { 
if ($v==0) {$v=1;}
$valeur= round ($un_mot["score"],3);

$pourcent = round(($valeur*100)/($v),2);   
$largeurImage = 50; 
$hauteurImage = 10;  
$image = imagecreate ($largeurImage, $hauteurImage)  or die ("Erreur lors de la création de l'image"); 
$heure = '' . date('H i'); // On stocke l'heure et les minutes dans une variable         

    $fond = imagecolorallocate($image, 143, 190, 241); // Fond bleu clair
	 $fond2 = imagecolorallocate($image, 25, 25, 25); // colonne blanc
    $couleur_texte = imagecolorallocate($image, 255, 255, 255); // Texte en blanc
	
        $largeurImageRectangle =  (80/2);  
        ImageFilledRectangle ($image, 0, 0, $largeurImageRectangle,40, $fond2);  

imagestring($image, 0, 0, 0, $valeur, $couleur_texte); // On affiche l'heure dans la bonne couleur

imagepng($image);
}

?>  
[php]
C'est l'ancien code de image.php... Je vais essayer de l'actualiser avec ton code mais je ne vois pas comment je peux avoir ça : 
/*php $largeurImageRectangle =  $pourcent;  
        ImageFilledRectangle ($image, 0, 0, $largeurImageRectangle,40, $fond2);  
 /php*/
dans image.php puisque la variable n'y est pas...