2010-01-13 5 views
1

Я использую это для сбора комментариев, сделанных отдельным пользователем. Я хочу отображать 7 комментариев на каждой странице и хочу включить разбивку на страницы. Каковы будут этапы реализации. Прости. n00b вопрос.pagination in 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/смещения. Для MySQL это достигается путем добавления LIMIT [offset] [count] к вашему запросу. PostgreSQL использует отдельный синтаксис select ... LIMIT [count] OFFSET [offset].

Идея заключается в том, что вы ограничиваете количество результатов, возвращаемых фактическому номеру, который вы хотите отобразить. Это может привести к огромному увеличению производительности, если вы показываете страницу 1 из 200, со сто результатами на страницу.

Конечно, вам нужно запустить второй запрос - 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 ...) в эти дни.