2016-01-01 6 views
2

Avertissement Big commencer par: Je suis toujours super nouveau pour php & js, donc s'il vous plaît soyez doux ... haha ​​infini Scrolling (mysql, php & js) boucle d'émission

Quoi qu'il en soit, je suis essayer de créer un simple défilement infini qui récupère les messages d'une table mysql. J'ai bricolé du code à partir de divers didacticiels sur Internet pour créer quelque chose qui accède et récupère des informations. Le problème est le nombre de messages et le nombre de messages récupérés. Avec "$ perpage" dans le fichier PHP défini à 10, les 20 premiers messages se chargent, puis chaque fois qu'il charge de "nouveaux messages", il charge simplement les messages 11-20 à plusieurs reprises. J'imagine que c'est probablement quelque chose de simple, mais mon niveau de php est vraiment seulement au niveau où je peux le comprendre, mais je ne peux pas l'écrire.

J'ai essayé d'ajouter LIMIT à la fin de la ligne $ sql, mais cela semblait juste casser le code.

Toute aide serait grandement appréciée!

Si vous voulez voir en action dans la vie réelle, le (très) projet de site est: site

$(document).ready(function(){ 
    function getresult(url) { 
    $.ajax({ 
     url: url, 
     type: "GET", 
     data: {rowcount:$("#rowcount").val()}, 
     beforeSend: function(){ 
     $('#loader-icon').show(); 
     }, 
     complete: function(){ 
     $('#loader-icon').hide(); 
     }, 
     success: function(data){ 
     $("#faq-result").append(data); 
     }, 
     error: function(){}    
    }); 
    } 
    $(window).scroll(function(){ 
    if ($(window).scrollTop() == $(document).height() - $(window).height()){ 
     if($(".pagenum:last").val() <= $(".total-page").val()) { 
     var pagenum = parseInt($(".pagenum:last").val()) + 1; 
      getresult('../php/best_result.php?page='+pagenum); 
     } 
    } 
    }); 
}); 


<?php 
require_once("login.php"); 
$db_handle = new DBController(); 
$perPage = 10; 

mysql_query("SET NAMES utf8"); 

$sql = ' 
    SELECT letter, dayfield, monthfield, yearfield, nickname, country 
    FROM BestWorst 
    WHERE `lettertype` = "best" ORDER BY `ID` DESC'; 



$page = 1; 
if(!empty($_GET["page"])) { 
$page = $_GET["page"]; 
} 

$start = ($page-1)*$perPage; 
if($start < 0) $start = 0; 

$query = $sql . " limit " . $start . "," . $perPage; 
$faq = $db_handle->runQuery($query); 

if(empty($_GET["rowcount"])) { 
    $_GET["rowcount"] = $db_handle->numRows($sql); 
} 
$pages = ceil($_GET["rowcount"]/$perPage); 
$output = ''; 
if(!empty($faq)) { 
    $output .= '<input type="hidden" class="pagenum" value="' . $page . '" /><input type="hidden" class="total-page" value="' . $pages . '" />'; 
    foreach($faq as $k=>$v) { 
    $output .= '<div class="entry wow fadeInUp lefttext"><br/><p>' 
     . nl2br($faq[$k]["letter"]) 
     . '</p><br/><p class="small" align="right">- This story took place on ' 
     . $faq[$k]["dayfield"] . '/' 
     . $faq[$k]["monthfield"] . '/' 
     . $faq[$k]["yearfield"] 
     . '. Posted by ' . $faq[$k]["nickname"] 
     . ' from ' . $faq[$k]["country"] 
     .'<p></div><br/><br/><br/>'; 
    } 
} 
print $output; 
?> 
+1

Mettez quelques informations de débogage. Avez-vous confirmé que l'URL correcte est passée à '$ .ajax()' et que la requête attendue est en cours de construction pour MySQL? – miken32

+0

Votre code jQuery ressemble à plusieurs éléments avec la classe 'pagenum' mais il n'y a qu'une seule sortie par PHP. Et il sort juste la valeur passée de '$ _GET [" page "]' sans le changer. – miken32

+0

Merci Miken32! Ok, quelques réponses noob venant à votre rencontre: 1) Je n'ai pas réalisé que l'URL avait besoin d'une page spécifique. Je l'avais laissé par inadvertance littéralement comme "url". J'ai essayé d'insérer le fichier php ci-dessus en tant qu'URL, mais cela juste ensuite boucles messages 1-10 encore et encore et encore. 2) En ce qui concerne "jQuery étant spécialement construit pour MySQL", je ne suis pas sûr de ce que cela signifie ..? Cependant, il récupère les informations de la base de données sql sans problème, c'est juste l'ordre de la récupération qui pose problème. 3) Votre dernier point à propos de l'attente de plusieurs éléments, quels changements au code recommanderiez-vous? – Leesome

Répondre

0

Vous avez un peu de confusion en ce qui concerne l'utilisation des $start et $perPage dans votre requête.

MySQL, la requête suivante obtient les 15 premiers résultats, à partir de 11 rangs (OFFSET 10) dans cet ensemble de résultats:

SELECT * FROM BestWorst LIMIT 15, 10  

qui est le même que

SELECT * FROM BestWorst LIMIT 15 OFFSET 10 

L'utilisation de $start dans votre cas doit correspondre à la OFFSET de la requête, tandis que le $perPage est littéralement LIMIT en termes de MySQL.

Par conséquent, l'échange des deux variables mentionnées dans votre requête devrait résoudre le problème.

$query = $sql . " limit " . $perPage . "," . $start; 

Maintenant, lorsque vous faites défiler la page, et obtenir la valeur de pagenum (envoyé via AJAX à votre script PHP) dans la variable $page, $start est multiplié en conséquence, en vous donnant les valeurs (0, 10, 20, ...) pour la OFFSET partie de votre requête - ce qui est tout à fait ce que vous attendez.