2010-01-13 7 views
1

나는 이것을 사용하여 특정 사용자의 의견을 수집합니다. 각 페이지에 7 개의 설명을 표시하고 페이지 매김을 사용하려고합니다. 구현 단계는 무엇입니까? 죄송합니다. n00b 질문.PHP에서 페이지 매기기

$query = "SELECT msg, user_id, comment_time FROM comments WHERE aid = '$aid' ORDER BY comment_time DESC"; 
     $result = mysql_query($query) or die("ERROR: $query.".mysql_error()); 
     if (mysql_num_rows($result) > 0) { 
      while($row = mysql_fetch_object($result)){ 
       $uidval = $row->user_id; 
       if ($uidval != 0){ 
       $userInfo = $facebook->api_client->fql_query("SELECT name, pic_square_with_logo, profile_url FROM user WHERE uid='".$uidval."'"); 

      // echo '<br>Array Info<br>'; 
      // print_r($userInfo); 
      // echo '<br><br>'; 

       $nameuser = $userInfo[0]['name']; 
       $pic = $userInfo[0]['pic_square_with_logo']; 
       $profile_url = $userInfo[0]['profile_url']; 

       echo '<img src="'.$pic.'" />'; 
       echo '<a href="'.$profile_url.'">'.$nameuser.'</a>'; 
       echo '<br>'; 
       echo $row->comment_time; 
       echo '<br>'; 
       echo $row->msg; 
       echo '<br>'; 
       } 

      } 
     } 
+2

하지만 ACTUAL 웹 사이트에서 사용하지 마세요. 게시 한 SQL 쿼리는 웹 사이트를 XSS 취약점에 노출하기 때문입니다. [PHP Doctrine Project]]를 데이터베이스 상호 작용 레이어 또는 다른 좋은 프레임 워크로 사용하는 것이 좋습니다. 학습 목적을 위해했던 것처럼 쿼리 작성부터 시작하는 것이 좋습니다. –

답변

4

해결 방법은 SQL의 limit/offset 절을 사용하는 것이 가장 좋습니다. MySQL의 경우 쿼리에 LIMIT [offset] [count]을 추가하면됩니다. PostgreSQL은 별도의 select ... LIMIT [count] OFFSET [offset] 구문을 사용합니다.

아이디어는 반환하려는 결과의 수를 표시하려는 실제 수로 제한하는 것입니다. 200 페이지 중 1 페이지를 표시 할 경우 페이지 당 백개의 결과가 발생하면 성능이 크게 향상 될 수 있습니다.

물론 두 번째 쿼리 인 select count(*) from ...을 실행하여 결과 집합의 결과 수를 결정해야합니다. 이것을 페이지 당 결과 수로 나눠서 페이지 수를 얻었습니다.

당신은 가능성이

http://mysite.com/index.php?page=7 

처럼 뭔가를 쿼리 문자열에 페이지 매개 변수를 전달하고 유사한 방법을 사용하여 데이터를 가져 오는 것이 좋습니다

(이 의사 코드를 고려, 내가 실제로 쿼리 아니에요 알고 적절하게)

<?php 

$num_per_page = 20; // 20 results per page 

$page = isset($_GET['page']) ? $_GET['page'] : 0; // start from page 0 

// Build our big query minus the SELECT part here 
$from_part = 'tbl_results [where ...]"' 

$num_results = query("SELECT COUNT(*) FROM $from_part"); 

// Use ceil to round upwards 
$num_pages = ceil($num_results/$num_per_page); 

// Cap the page a the last page 
if ($page > $num_pages) 
    $page = $num_pages; 

// Cap the page at the first page 
if ($page <= 1) 
    $page = 1; 

$offset = $page * $num_per_page; 

// Build the final query to select the relevant page of data 
$results = query("SELECT * FROM $from_part LIMIT $offset, $num_per_page"); 

?> 
0

LIMIT x, y를 사용하여 페이지로 가져올 첫 번째 및 레코드 수를 나타냅니다.

3

이는 페이지 매김을 구현하는 것입니다 방법 기본적인 방법입니다 :

// Page number, >= 1, could come from $_GET for example 
$page = 1; 
// Amount of items to show on page 
$perpage = 7; 
// Calculate the index of first item to show, 
// on page 1 we obviously want to start from 0, hence the - 1 part 
$start = ($page - 1) * $perpage; 
// Build the query using those variables 
$query = "SELECT ... LIMIT $start, $perpage"; 

당신은 것 첫 번째 테이블에있는 항목의 수를 확인하고 조정하여 계정에 최대 및 최소 페이지 숫자을해야 물론 페이지 변수 등이 있지만 시작해야합니다.

0

페이지 매기기를 배우는 것이 초보자로서 가치있는 시도이지만, 이미 작성된 코드를 사용하는 것이 좋습니다. 페이지 매김 구현을 위해 PEAR, Zend Framework 또는 다른 라이브러리 모음을 확인하십시오.

위의 예제는 페이지 매김이 작동하는 방식에 대한 좋은 설명을 제공하지만 보안 관행, 유지 관리 및 생산 품질 코드로 들어가는 다른 요소는 완전히 무시합니다. 나는 위의 주석가들에게 불을 붙이고있는 것이 아니기 때문에 나는 당신에게 생산 품질 코드를 쓸 시간이 없다는 것을 말하고있다. 그러므로 그들의 예 (복사 붙여 넣기)를 사용하지 말라는 것이다.

GET 매개 변수와 보안 데이터베이스 추상화 계층을 통해 들어오는 것을 제거하여 보안을 강화해야합니다. 또한 누군가가 수동으로 범위를 벗어나는 값 또는 범위 미만의 값을 입력하는지에 대한 프린지 시나리오를 처리해야합니다.

요즘 대부분의 문제는 KohanaPHP, Zend Framework, CakePHP, &c ...와 같은 프레임 워크에서 처리됩니다.