PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 22-09-2013 14:14:38

Stegue
Membre
Inscription : 22-09-2013
Messages : 6

Limiter la fonction LIMIT

Bonjour,

Je sais le titre est bizarre mais pourtant j'aimerais savoir jusqu'ou s'arrête cette fonction LIMIT dans ma requête.

Mon problème:
Sur ma page, j'appelle des extraits depuis un BDD. Je limite le nbre à 8 par page.

Je suis en train de mettre en place un système de vote par étoiles. J'appelle cette page avec la fonction INCLUDE.

Mais plutôt que d'avoir ça:

Extrait1
noteExtrait1

Extrait2
noteExtrait2

Extrait3
noteExtrait3

etc jusqu'à 8

J'ai ça:

Extrait1
noteExtrait1
noteExtrait2
noteExtrait3

etc... les 8 notes à chaque Extrait

Pas si facile à expliquer... hmm

Comment de pas impacter la fonction LIMIT à ma fonction INCLUDE ?

Merci.

Hors ligne

#2 22-09-2013 15:58:19

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Limiter la fonction LIMIT

Bonjour,

Comment de pas impacter la fonction LIMIT à ma fonction INCLUDE ?

L'un n'a rien à avoir avec l'autre.

Allez dans phpMyAdmin, entrez


show create table nomdevotretable;
 

Pour chacune des tables concernées par votre requête, ensuite montrez nous votre requête qui génère les résultats, ensuite on sera en mesure de vous aider à résoudre votre problème.

Jc.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#3 22-09-2013 16:38:34

Stegue
Membre
Inscription : 22-09-2013
Messages : 6

Re : Limiter la fonction LIMIT

Voilà la structure des 2 tables:

CREATE TABLE `ratings` (
`id` int(10) NOT NULL default '0',
`total_votes` int(5) NOT NULL default '0',
`total_value` int(5) NOT NULL default '0',
`used_ips` longtext NOT NULL,
`date` timestamp(14) NOT NULL,
PRIMARY KEY  (`id`)
) TYPE=MyISAM

CREATE TABLE `citations_celebres` (
`id` int(11) NOT NULL auto_increment,
`citation` longtext,
`numcitateur` int(11) default '0',
`votes` int(5) NOT NULL default '0',
`score` int(15) NOT NULL default '0',
`twitter` int(11) default NULL,
PRIMARY KEY  (`id`),
KEY `numcitateur` (`numcitateur`),
KEY `id` (`id`),
KEY `score` (`score`),
KEY `votes` (`votes`),
KEY `twitter` (`twitter`)
) TYPE=MyISAM

Pour la requête, c'est l'INCLUDE mais je ne suis pas sur que c'est bien ça que tu, heu vous voulez voir. (On tutoyait pas d'office sur les forums avant ? wink )

<?php include ("rating.php"); ?>

Hors ligne

#4 22-09-2013 16:45:54

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Limiter la fonction LIMIT

Bonjour

Pour la requête, c'est l'INCLUDE mais je ne suis pas sur que c'est bien ça que tu, heu vous voulez voir. (On tutoyait pas d'office sur les forums avant ?

En effet c'est la requête SQL qui se trouve dans le fichier rating.php que l'on a besoin de voir pour vous aider.

Cordialement,

Jc.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#5 22-09-2013 17:02:56

Stegue
Membre
Inscription : 22-09-2013
Messages : 6

Re : Limiter la fonction LIMIT

Le voilà entier du coup:
C'est un fichier téléchargé en package qu'on trouve partout.

<?php


$result = mysql_query($sql);
$ids = array();
while ($row = mysql_fetch_assoc($result)){
$ids[] = $row['id'];
}
?>
<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<link rel="stylesheet" href="rating.css" />
<script type="text/javascript" src="rating.js"></script>
</head>
<body>
<?php
for($i=0;$i<count($ids);$i++)
  {
    $rating_tableName     = 'ratings';
   $id=$ids[$i];
 $q="SELECT ratings.total_votes, ratings.total_value FROM $rating_tableName WHERE ratings.id=$id";
$r=mysql_query($q);
if(!$r) echo mysql_error();
while($row=mysql_fetch_array($r))
{
  $v=$row['total_votes'];
  $tv=$row['total_value'];
  $rat=$tv/$v;
 
  }
 
 
 
  $j=$i+1;
  $id=$ids[$i];
echo'<div class="product">
           Rate Item '.$j.'
            <div id="rating_'.$id.'" class="ratings">';
                for($k=1;$k<6;$k++){
          if($rat+0.5>$k)$class="star_".$k."  ratings_stars ratings_vote";
          else $class="star_".$k." ratings_stars ratings_blank";
          echo '<div class="'.$class.'"></div>';
          }
                echo' <div class="total_votes"><p class="voted"> Rating: <strong>'.@number_format($rat).'</strong>/5 ('.$v. '  vote(s) cast)
            </div>
        </div></div>';}
?>
</body></html>

La requête $sql vient de la page principale:

$sql = "SELECT citateurs_celebres.nom, citateurs_celebres.prenom, citations_celebres.citation, citations_celebres.id FROM citateurs_celebres LEFT JOIN citations_celebres ON citateurs_celebres.id = citations_celebres.numcitateur ORDER BY id LIMIT $limit_start, $pagination";
 

Hors ligne

#6 22-09-2013 22:04:55

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Limiter la fonction LIMIT

Bonjour,

C'est un fichier téléchargé en package qu'on trouve partout.

A la vue de ce code, je dirais que cela ne m'étonne pas, l'absence totale de qualité rejoignant le fait qu'il soit distribué partout.

Alors oui votre problème est normal puisque votre include vous donne l'ensemble des notes pour la citation en cours. Enfin d'après les requêtes que vous nous montrez.
Donc l'include n'est pas adapté à ce que vous voulez faire. Il vous faut donc supprimer cet include et passer par la requête adéquate, sauf que les tables montrées c'est du n'importe quoi.
Donc après avoir pris soin d'avoir uniformisé vos id + numcitateur en INT(10) NOT NULL pour le moins, vous pourrez utiliser cette seule requête pour faire votre affichage souhaité:


$sql="SELECT t0.id,t0.nom,t0.prenom,t1.citation, CASE WHEN t0.total_vote=0 THEN 0 ELSE FLOOR((t0.total_values/t0.total_votes)+0.5) END AS rate
      FROM
        (SELECT t0.id,t0.nom,t0.prenom,t1.citation, t2.total_values, t2.total_votes
        FROM citateurs_celebres AS t0 LEFT JOIN citations_celebres AS t1 ON t0.id=t1.numcitateur
           LEFT JOIN ratings AS t2 ON t1.id=t2.id
        WHERE t1.citation NOT NULL) AS t0
      ORDER BY t0.nom";
 

Ensuite il vous suffit de récupérer la page courante via l'url par exemple via $page=intval($_GET['page']) et d'afficher les lignes correspondantes  ($a=$page*8;$a<(($page+1)*8);$a++)
en changeant de paragraphe d'affichage lorsque la valeur de t0.id change.

Bonne continuation wink

Dernière modification par Jc (22-09-2013 22:07:32)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#7 23-09-2013 12:28:01

Stegue
Membre
Inscription : 22-09-2013
Messages : 6

Re : Limiter la fonction LIMIT

Jc a écrit :

Ensuite il vous suffit de récupérer la page courante via l'url par exemple via $page=intval($_GET['page']) et d'afficher les lignes correspondantes  ($a=$page*8;$a<(($page+1)*8);$a++)
en changeant de paragraphe d'affichage lorsque la valeur de t0.id change.

Merci beaucoup, mais je pense que c'est un peu trop compliqué pour moi.

Hors ligne

#8 23-09-2013 14:15:52

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Limiter la fonction LIMIT

bonjour,

Cela reste très simple.
Lorsque vous affichez x lignes à raison de 8 par page, sur la première page vous allez afficher les lignes de 1 à 8, sur la seconde de 9 à 16, sur la troisième de 17 à 24, etc.. Vous voyez donc que le nombre de  lignes affichées restent un multiple de 8.
En sachant que la première ligne de votre resultset retourné par l'exécution de votre requête possède l'index 0, on a en transposant


for ($ligne=(($page-1)*8);$ligne<($page*8);$ligne++){  
   // lignes à afficher
}
 

Ensuite il est vrai qu'il y a un aspect un peu obscur dans votre fonctionnalité du à l'absence totale d'un modèle de données cohérent.
Corrigez donc moi si je me trompe, mais un auteur peut avoir 0 ou plusieurs citations et chaque citation peut être l'objet de 0 ou plusieurs votes. Par contre il semble juste de dire qu'une citation ne peut avoir qu'un seul et unique indice de popularité (vos étoiles).
Donc si cela est le cas, il est vrai qu'une petite modification au niveau de la requête que je vous ais fournie, reste nécessaire.

++

Dernière modification par Jc (23-09-2013 14:16:39)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#9 24-09-2013 12:19:24

Stegue
Membre
Inscription : 22-09-2013
Messages : 6

Re : Limiter la fonction LIMIT

Jc a écrit :

Ensuite il est vrai qu'il y a un aspect un peu obscur dans votre fonctionnalité du à l'absence totale d'un modèle de données cohérent.
Corrigez donc moi si je me trompe, mais un auteur peut avoir 0 ou plusieurs citations et chaque citation peut être l'objet de 0 ou plusieurs votes. Par contre il semble juste de dire qu'une citation ne peut avoir qu'un seul et unique indice de popularité (vos étoiles).
Donc si cela est le cas, il est vrai qu'une petite modification au niveau de la requête que je vous ais fournie, reste nécessaire.

++

Bonjour,

Oui, c'est bien ça. Je m'y colle. wink

Hors ligne

#10 28-09-2013 07:08:05

Stegue
Membre
Inscription : 22-09-2013
Messages : 6

Re : Limiter la fonction LIMIT

J'ai pu m'en sortir avec un peu de ça ici et ailleurs, merci.

Hors ligne

Pied de page des forums