簡體   English   中英

無限滾動與MySQL數據

[英]Infinite Scroll with MySQL Data

我遵循了位於本主題中的幫助: 使用帶有MySQL數據庫的無限滾動

並且已經接近使其正常工作。 我有一個頁面使用jquery砌體顯示在塊中,其中的塊由mysql數據庫中的數據填充。 當我滾動到頁面的末尾時,我成功獲取了loading.gif圖像,但圖像后立即顯示“沒有其他帖子可顯示”。 如果那是真的,那應該說些什么。 我最初只在5個帖子中調用了10-15個帖子,所以當我到達頁面底部時,其余的帖子應該加載,但是我收到的消息應該是在實際上沒有更多的時候出現了帖子。

這是我的JavaScript:

var loading = false;
    $(window).scroll(function(){
        if($(window).scrollTop() == $(document).height() - $(window).height()) {   
            var h = $('.blockContainer').height();
            var st = $(window).scrollTop();
            var trigger = h - 250;

              if((st >= 0.2*h) && (!loading) && (h > 500)){
                loading = true;
                $('div#ajaxLoader').html('<img src="images/loading.gif" name="HireStarts Loading" title="HireStarts Loading" />');
                $('div#ajaxLoader').show();
                $.ajax({
                    url: "blocks.php?lastid=" + $(".masonryBlock:last").attr("id"),
                    success: function(html){
                        if(html){
                            $(".blockContainer").append(html);
                            $('div#ajaxLoader').hide();
                        }else{
                            $('div#ajaxLoader').html('<center><b>No more posts to show.</b></center>');
                        }
                    }
                });
            }
        }
    });

這是塊實際位於的頁面上的php。 此頁面最初從數據庫中發布了5個項目。 javascript捕獲最后發布的ID,然后通過ajax將其發送到blocks.php腳本,然后腳本使用最后發布的ID從數據庫中獲取其余項目。

$allPosts = $link->query("/*qc=on*/SELECT * FROM all_posts ORDER BY post_id DESC LIMIT 5");
        while($allRows = mysqli_fetch_assoc($allPosts)) {
            $postID = $link->real_escape_string(intval($allRows['post_id']));
            $isBlog = $link->real_escape_string(intval($allRows['blog']));
            $isJob = $link->real_escape_string(intval($allRows['job']));
            $isVid = $link->real_escape_string(intval($allRows['video']));
            $itemID = $link->real_escape_string(intval($allRows['item_id']));

            if($isBlog === '1') {
                $query = "SELECT * FROM blogs WHERE blog_id = '".$itemID."' ORDER BY blog_id DESC";
                $result = $link->query($query);
                while($blogRow = mysqli_fetch_assoc($result)) {
                    $blogID = $link->real_escape_string($blogRow['blog_id']);
                    $blogTitle = $link->real_escape_string(html_entity_decode($blogRow['blog_title']));
                    $blogDate = $blogRow['pub_date'];
                    $blogPhoto = $link->real_escape_string($blogRow['image']);
                    $blogAuthor = $link->real_escape_string($blowRow['author']);
                    $blogContent = $link->real_escape_string($blogRow['content']);  

                    //clean up the text
                    $blogTitle = stripslashes($blogTitle);
                    $blogContent = html_entity_decode(stripslashes(truncate($blogContent, 150)));           

                    echo "<div class='masonryBlock' id='".$postID."'>";
                    echo "<a href='post.php?id=".$blogID."'>";
                    echo "<div class='imgholder'><img src='uploads/blogs/photos/".$blogPhoto."'></div>";
                    echo "<strong>".$blogTitle."</strong>";
                    echo "<p>".$blogContent."</p>";
                    echo "</a>";
                    echo "</div>";

                }
            }

這是AJAX調用的blocks.php腳本中的php:

//if there is a query in the URL
if(isset($_GET['lastid'])) {

//get the starting ID from the URL
$startID = $link->real_escape_string(intval($_GET['lastid']));
//make the query, querying 25 fields per run
$result = $link->query("SELECT  * FROM all_posts ORDER BY post_id DESC LIMIT '".$startID."', 25");

$html = '';
//put the table rows into variables
while($allRows = mysqli_fetch_assoc($result)) {
    $postID = $link->real_escape_string(intval($allRows['post_id']));
    $isBlog = $link->real_escape_string(intval($allRows['blog']));
    $isJob = $link->real_escape_string(intval($allRows['job']));
    $isVid = $link->real_escape_string(intval($allRows['video']));
    $itemID = $link->real_escape_string(intval($allRows['item_id']));

    //if the entry is a blog
    if($isBlog === '1') {
        $query = "SELECT * FROM blogs WHERE blog_id = '".$itemID."' ORDER BY blog_id DESC";
        $result = $link->query($query);
        while($blogRow = mysqli_fetch_assoc($result)) {
            $blogID = $link->real_escape_string($blogRow['blog_id']);
            $blogTitle = $link->real_escape_string(html_entity_decode($blogRow['blog_title']));
            $blogDate = $blogRow['pub_date'];
            $blogPhoto = $link->real_escape_string($blogRow['image']);
            $blogAuthor = $link->real_escape_string($blowRow['author']);
            $blogContent = $link->real_escape_string($blogRow['content']);  

            $blogTitle = stripslashes($blogTitle);
            $blogContent = html_entity_decode(stripslashes(truncate($blogContent, 150)));

            $html .="<div class='masonryBlock' id='".$postID."'>
                    <a href='post.php?id=".$blogID."'>
                    <div class='imgholder'><img src='uploads/blogs/photos/".$blogPhoto."'></div>
                    <strong>".$blogTitle."</strong>
                    <p>".$blogContent."</p>
                    </a></div>";

        }
    }
    echo $html;
}

我已經嘗試過使用jquery無限滾動插件,但是用這種方法似乎要困難得多。 我不知道這是什么問題。 我添加了警報並進行了測試,並且javascript腳本正在完全處理中,因此它必須與blocks.php對不對?

編輯:通過將sql查詢更改為SELECT * FROM all_posts WHERE post_id < '".$startID."' ORDER BY post_id DESC LIMIT 15我對此問題進行了臨時修復SELECT * FROM all_posts WHERE post_id < '".$startID."' ORDER BY post_id DESC LIMIT 15

現在,這些塊是通過ajax加載的,但是它們一次只能加載一個塊。 Ajax正在為每個單個塊發送一個請求,並且它們正在逐個消失,是否可以通過jquery石工一次使它們全部消失?

我在另一個答案中看到了您的代碼,建議您在MySql中使用LIMIT功能,而不是偏移值。 例:

SELECT * FROM all_posts ORDER BY post_id DESC LIMIT '".(((int)$page)*5)."',5

這只會在AJAX請求中使用頁碼,並自動獲取偏移量。 這是一個一致的查詢,並且獨立於頁面上的最后結果運行。 在您的jQuery代碼中發送諸如page = 1或page = 2之類的內容。 這可以通過幾種不同的方式完成。

首先,計算頁面上構造的元素數量,然后除以頁面上的數量。 這將產生頁碼。

其次,您可以使用jQuery並將當前頁碼綁定到正文:

$(body).data('page', 1)

每加載一頁將其遞增1。

這樣做確實是更好的方法,因為它對所有操作都使用一個查詢,並且不需要有關該頁面上已有數據的大量信息。

唯一需要注意的是,此邏輯要求第一頁請求為0,而不是1。這是因為1 * 5將求值為5,從而跳過了前5行。 如果其值為0,它將求值為0 * 5,並跳過前0行(因為0 * 5為0)。

讓我知道您有任何疑問!

您是否嘗試過調試?

如果您尚未使用,我建議您獲取firebug插件。

Ajax調用返回空嗎? 如果是這樣,請嘗試回顯sql並確認該語句正確,並且所有變量都包含預期的信息。 考慮到客戶端,服務器和數據庫之間發生大量通信,許多事情可能會失敗。

為了回應您的評論,您需要在這段代碼中添加html:

if(html){
     $(".blockContainer").append(html);
     $('div#ajaxLoader').hide();
}

我會在if語句之前執行console.log(html)console.log($(“。blockContainer”)。length)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM