2013-05-28 3 views
0

스크롤 할 때 항목을 가져 오기 위해 PHP 호출을하는 데 어려움을 겪습니다. 항목이 잠시 동안 반복되어 있고 infinity.php의 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

선택할 데이터베이스에서 카운터의 역할을하는 get 변수를 허용 할 수있는 PHP 파일을 만듭니다. jquery 목록이 끝에 도달하면 서버를 폴링하여 시작점을 지정한 다음 추가하십시오. –

답변

1

난 당신이 여기에 몇 가지 주요 부분을 놓치고있어 생각합니다. 먼저, infinte 스크롤을 사용하고 데이터베이스에서 데이터를 가져 오는 경우 LIMIT 절이 필요하고 LIMIT 절을 사용하면 offset, total 관계가 허용됩니다. 여기서 offset은 시작할 행을 나타내고 total은 우리가 원하는 행 수입니다.

처음에는 위의이

$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와 prepared, 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({ 
    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 값 (또는 행 가져 오기 시작 위치)을 제공합니다. DB에서 20 개의 결과를 추출하면 0을 기준으로하므로 0-19가됩니다. .length을 수행하면 1 based 결과를 얻게되며, 이는 결국 0 대신에 20을 반환하게됩니다. 마지막 행이 반환되기를 원하지 않기 때문에 괜찮습니다. 따라서 논리는 괜찮습니다. 우리의 ajax 함수에있는 두 변수 offset/total은 우리의 삼항 변수 할당에 해당합니다.

+0

정말 좋은 설명 주셔서 감사합니다! 하지만 불행히도 나는 여전히 작동하도록 노력하고 있습니다. : ( – Kim

+0

"로드가 더 많아지면 작동하지만, 모든 내용이 반복적으로 반복됩니다. 그리고 각 요소 내부의 일부 동적 요소, 버튼, onclick 함수가 작동하지 않습니다. – Kim

+1

코드를 사용하여 루프를 수신합니까? 길이를 동적으로 계산할 수 있기 때문에 요소 내에서 '클릭 함수'와 같이 '이벤트 위임'문제가 발생하지 않아야합니다 정적 부모 요소에 바인딩되고 동적 객체에 위임 할 이벤트 (예 : 'click', 'myElement', function() {alert ('Dynamic Delegation!');) 문서가 정적 인 곳은 절대로 제거/읽어 들이지 않으며, 'myElement'는 동적 요소의 선택자입니다. – Ohgodwhy

관련 문제