readdir

Discussion in 'PHP' started by barnaki, 8 Jan 2009.

  1. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    не book_dir определяется в подключаемом файле config/config.php там так и написано
    $book_dir = $_SERVER['DOCUMENT_ROOT']."/knigi";
    я вроде нашел проблему у меня в методе задается $books=array(); и при var_dump($books) оно сначала выдает нормальный массив а потом пишет непонятно откуда взявшийся пустой. сейчас разбираюсь
     
    #21 barnaki, 19 Oct 2010
    Last edited: 19 Oct 2010
  2. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    нашел проблему . просто оно каждый раз обнуляло $books и $i . я их сделал статическими переменными класса . и обращался так
    else {

    self::$books[self::$i] = $one;

    self::$i++;}
    }
    return self::$books;
    и все заработало
     
  3. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    появилась новая проблема. вообщем я пишу электронную библиотеку и есть у меня один класс паджинации.взял его на сайте softtime только пришлось ошибки исправлять. вот класс
    PHP:
     public function pages($page){
            
    $num =   $GLOBALS["books_on_page"];
           
    $query = "SELECT COUNT(*) FROM books; ";
            
    $books_total = db::db_query($query);
            
    $books = mysql_result($books_total, 0);
           
    $total = intval(($books - 1) / $num) + 1;
           
    $page = intval($page);
           if(empty(
    $page) or $page < 0) $page = 1;
      if(
    $page > $total) $page = $total;
           
    $page = intval($page);
           
    $start = $page * $GLOBALS["books_on_page"] - $num;
           
    $result = db::db_query("SELECT * FROM books LIMIT $start, $num;");
                  
    $i=0;
            while ((
    $postrow[] = mysql_fetch_array($result)) && ($i < $num)) {
                     echo 
    "==============================<br>";
                     echo
    "$i<br>";
                   echo 
    $postrow[$i]['book_id']."</br>
                  "
    .$postrow[$i]['book_name']."<br>
                  "
    .$postrow[$i]['book_description']."</br>
                  "
    .$postrow[$i]['book_autor']."</br>
                  "
    .$postrow[$i]['book_publishin_house']."<br>";
                     echo 
    "<a href=".$postrow[$i]['book_way'].">".$postrow[$i]['book_name']."</a>"."<br>";
                   echo
    "<br>==========================================";
                
    $i++;
                                   }

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

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

    // Вывод меню
    //echo $pervpage.$page2left.$page1left.'<b>'.$page.'</b>'.$page1right.$page2right.$nextpage;
            
    if (isset($prevpage)){echo "$prevpage";} if (isset($page2left)){echo "$page2left";}
            if (isset(
    $page1left)){echo "$page1left";}echo "<b>".$page."</b>";
            if (isset(
    $page1right)){echo "$page1right";}if (isset($page2right)){echo "$page2right";}
            if (isset(
    $nextpage)){echo "$nextpage";}

    } 
    как видите он в месте
    Code:
    (echo "<a href=".$postrow[$i]['book_way'].">".$postrow[$i]['book_name']."</a>"."<br>";) 
    создает ссылку.
    есть еще простенький htaccess. вот его код
    HTML:
    RewriteEngine On
    RewriteBase /
    RewriteRule .* index.php?url=$0 [QSA,L]
    проблема в следующем. если отключить htaccess то не будет работать паджинация. а если не отключать то ссылки перестают рабоать. в адрес просто выводит значение href той ссылки и все. вопрос такой. как сделать чтобы ссылки работали. тоесть открывали pdf файлы и скачивали rar а не перенаправляли туда.
     
  4. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    Попробуйте этот класс. Я им пользуюсь. Брал когда-то тут http://www.tigir.com/paging.htm

    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;
    }
    }
    ?>
     
    _________________________
  5. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    не класс паджинации меня полностью устраивает. все дело в htaccess мой htaccess перенаправляет все запросы на index.php но я читал что htaccess может преобразовать запрос в имя файла. думал что кто нить напишет инструкцию по тому как это делается.
    у меня в базе хранятся пути к файлам вида
    HTML:
    http://banderas/knigi/PHP_Books/Apress.Beginning.PHP.and.Oracle.From.Novice.to.Professional.Aug.2007.pdf
    и когда я шелкаю по ссылке в которую в href он этот путь поставляет из за htaccess вида
    Code:
    RewriteEngine On
    RewriteBase /
    RewriteRule .* index.php?url=$0 [QSA,L]
    у меня в адресной сроке получается
    Code:
    http://banderas/knigi/PHP_Books/Apress.Beginning.PHP.and.Oracle.From.Novice.to.Professional.Aug.2007.pdf
    тоесть оно вставляет но не скачивает rar и не открывает pdf. вот я и прошу чтобы кто нить подсказал что можно сделать.
     
    #25 barnaki, 21 Oct 2010
    Last edited: 21 Oct 2010
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki попробуйте прочитать следующую тему: /threadnav92492-1-10.html Если не поймете, то попробуйте задать вопрос в тот же топик по следующему шаблону:

    1) Есть такие URL
    2) Сейчас используется такой .htaccess
    3) Хочу чтобы URL стали такие и такие, и чтобы не мешали этому и этому (тут тоже приводите примеры)

    З.Ы. В вашем коде существует потенциальная возможность SQL-инъекции, это так, на всякий случай предупреждаю
     
    _________________________
  7. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    а где тут sql иньекция обясните. я только один запрос к базе делаю . start вычисляется и он полюбому цифра. а num я беру из GLOBALS
     
    #27 barnaki, 21 Oct 2010
    Last edited: 21 Oct 2010
  8. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki Если вы выполните поиск до того, как она будет проинициализирована, то вы получите свою инъекцию. Если вы скажете, что такое невозможно, так как переменная в конфиге - предлагаю все равно использовать intval()
     
    _________________________
  9. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    вообще в этом скрипте это нереально чтобы она не была инициализирована. но все таки сделаю intval
     
  10. barnaki

    barnaki Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    насчет мод реврайта все было просто
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule .* index.php?url=$0 [QSA,L]


    и все дела