постраничный вывод помогите

Discussion in 'PHP' started by dailik, 26 Aug 2010.

  1. dailik

    dailik New Member

    Joined:
    27 Oct 2008
    Messages:
    94
    Likes Received:
    2
    Reputations:
    0
    нужна постраничная навигация + вывод в две колонки
    вот скрипт он выводит то очень много то по 1 на стр. нужно чтоб например: в две колонки по 4 новости были.


    PHP:
    <?php 
    // Устанавливаем соединение с базой данных 
    include "connect.php"; 
    // Переменная хранит число сообщений выводимых на станице 
    $num = 2; 
    // Извлекаем из URL текущую страницу 
    $page = $_GET['page']; 
    // Определяем общее число сообщений в базе данных 
    $result = mysql_query("SELECT COUNT(*) FROM options"); 
    $posts = mysql_result($result, 0); 
    // Находим общее число страниц 
    $total = intval(($posts - 1) / $num) + 1; 
    // Определяем начало сообщений для текущей страницы 
    $page = intval($page); 
    // Если значение $page меньше единицы или отрицательно 
    // переходим на первую страницу 
    // А если слишком большое, то переходим на последнюю 
    if(empty($page) or $page < 0) $page = 1; 
      if(
    $page > $total) $page = $total; 
    // Вычисляем начиная к какого номера 
    // следует выводить сообщения 
    $start = $page * $num - $num; 
    // Выбираем $num сообщений начиная с номера $start 
    $result = mysql_query("SELECT * FROM options LIMIT $start, $num"); 
    // В цикле переносим результаты запроса в массив $postrow 
    while ( $postrow[] = mysql_fetch_array($result)) 
    ?> 




    <?php 
    echo "<table><tr>"; 
    for(
    $i = 0; $i < $num; $i++) 
    { 
     echo 
    "
             <td>"
    .$postrow[$i]['img']."</td>
             <td>"
    .$postrow[$i]['adress']."</td>"; 
           if (
    $i == '2')
                        {
                        
    $i = '0';
                        echo 
    "</tr><tr>";
                        }
    } 
    echo 
    "</table>"; 
    ?> 

     
     
    <?php 
    // Проверяем нужны ли стрелки назад 
    if ($page != 1) $pervpage = '<a href=?page=1><<</a> 
                                   <a href=?page='
    . ($page - 1) .'><</a> '; 
    // Проверяем нужны ли стрелки вперед 
    if ($page != $total) $nextpage = ' <a href=?page='. ($page + 1) .'>></a> 
                                       <a href=?page=' 
    .$total. '>>></a>'; 

    // Находим две ближайшие станицы с обоих краев, если они есть 
    if($page - 2 > 0) $page2left = ' <a href=?page='. ($page - 2) .'>'. ($page - 2) .'</a> | '; 
    if(
    $page - 1 > 0) $page1left = '<a href=?page='. ($page - 1) .'>'. ($page - 1) .'</a> | '; 
    if(
    $page + 2 <= $total) $page2right = ' | <a href=?page='. ($page + 2) .'>'. ($page + 2) .'</a>'; 
    if(
    $page + 1 <= $total) $page1right = ' | <a href=?page='. ($page + 1) .'>'. ($page + 1) .'</a>';

    // Вывод меню 
    echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage; 

    ?>  
     
  2. dailik

    dailik New Member

    Joined:
    27 Oct 2008
    Messages:
    94
    Likes Received:
    2
    Reputations:
    0
    блин никто не знает : ( ?
     
  3. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    Класс для постраничного вывода из БД
    PHP:
    <?php
    class Paging {

    private 
    $page_size = 10;
    private 
    $link_padding = 10;
    private 
    $page_link_separator = ' ';
    private 
    $next_page_text = 'следующая >';
    private 
    $prev_page_text = '< предыдущая';
    private 
    $result_text_pattern = 'Показано с %s по %s из %s';
    private 
    $page_var = 'p';

    private 
    $db;
    private 
    $q;
    private 
    $total_rows;
    private 
    $total_pages;
    private 
    $cur_page;

    public function 
    __construct($db, $q='', $page_var='p')
    {
        
    $this->db = $db;
        if (
    $q) $this->set_query($q);
        
    $this->page_var = $page_var;
        
    $this->cur_page = isset($_GET[$this->page_var]) && (int)$_GET[$this->page_var] > 0 ? (int)$_GET[$this->page_var] : 1;
    }

    public function 
    set_query($q)
    {
        
    $this->q = $q;
    }

    public function 
    set_page_size($page_size)
    {
        
    $this->page_size = abs((int)$page_size);
    }

    public function 
    set_link_padding($padding)
    {
        
    $this->link_padding = abs((int)$padding);
    }

    public function 
    get_page($q='')
    {
        if (
    $q) $this->set_query($q);

        
    $r = $this->db->query( $this->query_paging($this->q) );
        
    $this->total_rows = array_pop($this->db->query('SELECT FOUND_ROWS()')->fetch_row());

        if (
    $this->page_size !== 0) $this->total_pages = ceil($this->total_rows/$this->page_size);
        
        if (
    $this->cur_page > $this->total_pages)
        {
            
    $this->cur_page = $this->total_pages;
            if ( 
    $this->total_pages > 0 ) $r = $this->db->query( $this->query_paging($this->q) );
        }
        
        return 
    $r;
    }

    public function 
    get_result_text()
    {
        
    $start = (($this->cur_page-1) * $this->page_size)+1;
        
    $end = (($start-1+$this->page_size) >= $this->total_rows)? $this->total_rows:($start-1+$this->page_size);

        return 
    sprintf($this->result_text_pattern, $start, $end, $this->total_rows);
    }

    public function 
    get_page_links()
    {
        if ( !isset(
    $this->total_pages) ) return '';

        
    $page_link_list = array();

        
    $start = $this->cur_page - $this->link_padding;
        if ( 
    $start < 1 ) $start = 1;
        
    $end = $this->cur_page + $this->link_padding-1;
        if ( 
    $end > $this->total_pages ) $end = $this->total_pages;

        if ( 
    $start > 1 )  $page_link_list[] = $this->get_page_link( $start-1, $start - 2 > 0 ? '...' : '' );
        for (
    $i=$start; $i <= $end; $i++)  $page_link_list[] = $this->get_page_link( $i );
        if ( 
    $end + 1 < $this->total_pages ) $page_link_list[] = $this->get_page_link( $end +1, $end + 2 == $this->total_pages ? '' : '...' );
        if ( 
    $end + 1 <= $this->total_pages ) $page_link_list[] = $this->get_page_link( $this->total_pages );

        return 
    implode($this->page_link_separator, $page_link_list);
    }

    public function 
    get_next_page_link()
    {
        return isset(
    $this->total_pages) && $this->cur_page < $this->total_pages ? $this->get_page_link( $this->cur_page + 1, $this->next_page_text ) : '';
    }

    public function 
    get_prev_page_link()
    {
        return isset(
    $this->total_pages) && $this->cur_page > 1 ? $this->get_page_link( $this->cur_page - 1, $this->prev_page_text ) : '';
    }

    private function 
    get_page_link($page, $text='')
    {
        if (!
    $text)    $text = $page;

        if (
    $page != $this->cur_page)
        {
            
    $reg = '/((&|^)'.$this->page_var.'=)[^&#]*/';
            
    $url = '?'.( preg_match( $reg, $_SERVER['QUERY_STRING'] ) ? preg_replace($reg, '${1}'.$page, $_SERVER['QUERY_STRING']) : ( $_SERVER['QUERY_STRING'] ? $_SERVER['QUERY_STRING'].'&' : '' ).$this->page_var.'='.$page);
            return 
    '<a href="'.$url.'">'.$text.'</a>';
        }
        return 
    '<span>'.$text.'</span>';
    }

    private function 
    query_paging()
    {
        
    $q = $this->q;

        if (
    $this->page_size != 0)
        {
            
    //calculate the starting row
            
    $start = ($this->cur_page-1) * $this->page_size;
            
    //insert SQL_CALC_FOUND_ROWS and add the LIMIT
            
    $q = preg_replace('/^SELECT\s+/i', 'SELECT SQL_CALC_FOUND_ROWS ', $this->q)." LIMIT {$start},{$this->page_size}";
        }

        return 
    $q;
    }
    }
    ?>
     
    _________________________
  4. dailik

    dailik New Member

    Joined:
    27 Oct 2008
    Messages:
    94
    Likes Received:
    2
    Reputations:
    0
    никак не получаеться