6

AJAX と PHP を使用して、その場で (ユーザーが一番下までスクロールしたときに) テーブルから 20 個の結果を取得しようとしています。

これまでのところ、次のことを行っています...

AJAX

// Infinite Scroll
loadData( 0 );
//Hide Loader for Infinite Scroll
$('div.ajaxloader').hide();

});

function loadData ( last_id ) {
    var $entries = $('.directory'),
        $loader = $('.ajaxloader', $entries).show();
    $.get( '/getentries.php', { last_id : last_id }, function( data ) {
        $entries.append( data ).append( $loader.hide() );
        filterEntries();
    });
};


//Isotope filter - no changes to this code so I didn't include it

$(window).scroll(function () {
    if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) {
        $('div.ajaxloader').show('slow');
        loadData( $( '.directory item:last' ).data('id') )
    }

PHP

try {
  // Connect and create the PDO object
  $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8

  // Define and perform the SQL SELECT query
  $sql = "SELECT * FROM `directory` WHERE user_active != ``";
  $result = $conn->query($sql);

  $sth = $conn->prepare("SELECT * FROM directory WHERE user_active != ''");
        $sth->execute(array(':county' => $county));

        $c = 1;
        while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
            echo '<div class="entry';
                 if (($c % 4) == 1) echo ' alpha ';
           // ECHO RESULT STYLES ETC HERE
        $c++;
        }

  $conn = null;        // Disconnect
}
catch(PDOException $e) {
  echo $e->getMessage();
}

今、私の AJAX とクエリは正常に動作しているように見えますが、次の 20 とは対照的に、すべてのレコードを再度プルするだけの問題がありますか?

私はこれまでこれをやったことがないので、素朴に聞こえたら申し訳ありませんが、どんな助けでも大歓迎です!

4

3 に答える 3

1

mysql クエリに制限を追加する必要があります。以下のコードをご覧ください

// Infinite Scroll
loadData( 0 );
//Hide Loader for Infinite Scroll
$('div.ajaxloader').hide();

});

function loadData ( last_id ) {
    var $entries = $('.directory'),
        $loader = $('.ajaxloader', $entries).show();
    $.get( '/getentries.php?startp=0&endp=20', { last_id : last_id }, function( data ) {
        $entries.append( data ).append( $loader.hide() );
        filterEntries();
    });
};


//Isotope filter - no changes to this code so I didn't include it

$(window).scroll(function () {
    if ($(window).scrollTop() >= $(document).height() - $(window).height() - 10) {
        $('div.ajaxloader').show('slow');
        loadData( $( '.directory item:last' ).data('id') )
    }


PHP


try {
  // Connect and create the PDO object
  $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb);
  $conn->exec("SET CHARACTER SET utf8");      // Sets encoding UTF-8

  // Define and perform the SQL SELECT query
  $sql = "SELECT * FROM `directory` WHERE user_active != ``";
  $result = $conn->query($sql);

  $sth = $conn->prepare("SELECT * FROM directory WHERE user_active != '' limit $_REQUEST['startp'],$_REQUEST['endp']");
        $sth->execute(array(':county' => $county));

        $c = 1;
        while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
            echo '<div class="entry';
                 if (($c % 4) == 1) echo ' alpha ';
           // ECHO RESULT STYLES ETC HERE
        $c++;
        }

  $conn = null;        // Disconnect
}
catch(PDOException $e) {
  echo $e->getMessage();
}

ありがとうリパ・サハ

于 2012-12-20T09:57:25.217 に答える
0

SELECT * FROM foo WHERE id > $lastIndex ORDER BY id LIMIT 20;

編集:おっと。これは、準備されたステートメントを使用しない、通常の mysql 用です。php docsに基づいて、答えは次のようになります。

$sql = "SELECT * FROM directory WHERE id > :lastIndex AND user_active != '' LIMIT 20";
$sth = $conn->prepare($sql);
$sth->execute(array(':lastIndex' => $lastIndex));

これが行うことは、 の後に次の 20 件の結果を取得すること$lastIndexです。必要なことは、要求とともに lastIndex の値 (ページ上の結果の数と一致する必要があります) を送信し、それに応じて使用することだけです。

または、逆の操作を$lastIndex行い、結果をクライアントに送信して、javascript が格納され、ユーザーが新しい要求を行ったときに使用することもできます。

于 2012-12-19T20:13:34.020 に答える
0

簡単な答えは、クエリにオフセットを追加することです。それはページネーションのようなものです。現在のページを追跡し、特定の値でクエリをオフセットするだけです。この場合、ページを変更する代わりに、最後にロードするだけです。ここに例がありますあなたはそれをググってそれについてもっと読むことができます

于 2012-12-20T03:31:29.040 に答える