2013-05-28 3 views
0

Как бороться с вызовом PHP для загрузки элементов на прокрутку. У меня есть цикл циклов и вам нужен php-код для infinity.php для загрузки большего количества элементов в «поток» ID, но не может найти решение. Было бы полезно для некоторой помощи специалиста!Как производится бесконечная прокрутка?

PHP на Мейн-странице:

<?php 
$getStream = mysql_query("SELECT * FROM ".$DBprefix."xxx WHERE xxx='xxx' AND status='1' ORDER by id"); 

$counter = 0; 
$max = 2; 

while($stream = mysql_fetch_array($getStream) and ($counter < $max)) { 
$counter++; 

    } 
?> 

У меня есть этот Jquery:

function lastAddedLiveFunc() 
{ 
    $('div#loader').fadeIn(); 

    $.get("infinity.php", function(data){ 
     if (data != "") { 
      //console.log('add data..'); 
      $("#stream").append(data); 
     } 
     $('div#loader').empty(); 
    }); 
}; 

HTML:

<div id='stream'></div> 
+0

Проклятие вашего существования будет находиться в 'mysql_'. эта библиотека устарела, полна недостатков и оставляет вас невероятно уязвимой. Пожалуйста, рассмотрите использование 'mysqli_' или даже лучше,' pdo' (объекты данных php) – Ohgodwhy

+0

Спасибо за обновление! – Kim

+0

Создайте php-файл, который может принимать переменную get, которая служит в качестве счетчика того, где в базе данных выбрать. Когда список jquery достигнет конца, опросите сервер, для чего начать, а затем добавьте. –

ответ

1

Я думаю, вы пропустили несколько ключевых элементов здесь. Во-первых, когда мы используем прокрутку infinte, и мы извлекаем данные из базы данных, вам нужно предложение LIMIT, предложение LIMIT допускает отношение offset, total. где offset указывает начало строки, и общее количество строк, которые мы хотим принять.

Первоначально, вы будете иметь что-то вроде этого

$offset = $_GET['offset'] ? $_GET['offset'] : 0; //start at 0th row if no variable set 
$total = $_GET['total'] ? $_GET['total'] : 20; // get 20 rows if no variable set 

В выше, мы используем трехкомпонентную назначение переменной, чтобы проверить, если аргумент передается нам, если нет, то мы используем по умолчанию стоимость. Мы будем использовать mysqli и подготовленные методы bind_param, execute, bind_result и fetch_assoc().

if($getStream = $mysqli->prepare("SELECT * FROM ? WHERE xxx=? AND status=? ORDER by id LIMIT ?,?"): 

    $ret = ''; // a variable place holder 

    // in the above statement, fill in the ?'s 
    // the actual ? will be the value we wish to return, in order from first to last. 
    $getStream->bind_param('ssddd', $DBprefix.'xxx', 'xxx', 1, $offset, $total); 

    //execute our query 
    $getStream->execute(); 

    $getStream->bind_result($field1, $field2, $field3, $field4); // each field needs it's own variable name, that way we can access them later. 

    while($row = $getStream->fetch_assoc()): 
     $ret .= '<div class="my-infinite-element"><h3>'. $field1 .'</h3><p>'. $field2.'</p>'. $field3 .', '. $field4 .'</div>'; 
    endwhile; 

    echo $ret; 

else: 
    return FALSE; 
endif; 

Теперь мы обработаем возврат наших данных с использованием MySQLI; теперь давайте сделаем оператор ajax, чтобы вернуть данные.

$.ajax({ 
    type: 'GET', 
    url : 'infinity.php', 
    data: { 
     'offset' : $('.my-infinite-elements').length, 
     'total' : 20 
    }, 
    success: function(data){ 
     if(false !== data){ 
      $('#stream').append(data); 
     } 
    } 
}); 

В выше, единственное, что мы должны беспокоиться о том, $('.my-infinite-elements').length. Мы использовали класс my-infinite-elements для каждого возвращаемого элемента. Таким образом, мы можем подсчитать существующую длину элементов на странице, которая обеспечит наше значение offset (или где мы хотим начать получать строки). Если мы вытащили 20 результатов из нашей БД, это основано на 0, поэтому мы получим 0-19. Когда мы закончим .length, мы получим результат 1 based, который вернет 20 вместо 19. Это нормально, потому что мы НЕ хотим, чтобы и последняя строка вернулась, поэтому наша логика в порядке. Две переменные offset/total в нашей функции ajax соответствуют нашему назначению тройной переменной.

+0

Спасибо за очень хорошее объяснение! Но, к сожалению, я все еще пытаюсь заставить его работать. :( – Kim

+0

Я получаю «загружать больше», чтобы работать, но он снова и снова включает все и снова. И некоторые динамические элементы внутри каждого элемента, например, facebook, например, кнопки и Функции onclick не работают – Kim

+1

Используя мой код, вы получаете цикл? Мы не должны, из-за динамического вычисления длины, как для 'функций щелчка 'внутри элемента, это проблема' event delegation', которая требует события, которые должны быть привязаны к статическому родительскому элементу и делегированы динамическому, например '$ (document) .on ('click', 'myElement', function() {alert ('Dynamic Delegation!');}); 'Где документ статичен, никогда не удаляется/не читается, а' myElement' является селектором для динамического элемента. – Ohgodwhy

Смежные вопросы