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_total0);
           
    $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 0$page2left ' <a href= ./page?page='. ($page 2) .'>'. ($page 2) .'</a> | ';
    if(
    $page 0$page1left '<a href= ./page?page='. ($page 1) .'>'. ($page 1) .'</a> | ';
    if(
    $page <= $total$page2right ' | <a href= ./page?page='. ($page 2) .'>'. ($page 2) .'</a>';
    if(
    $page <= $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] > ? (int)$_GET[$this->page_var] : 1;
    }

    public function 
    set_query($q)
    {
        
    $this->$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 $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 $start 1;
        
    $end $this->cur_page $this->link_padding-1;
        if ( 
    $end $this->total_pages $end $this->total_pages;

        if ( 
    $start )  $page_link_list[] = $this->get_page_link$start-1$start '...' '' );
        for (
    $i=$start$i <= $end$i++)  $page_link_list[] = $this->get_page_link$i );
        if ( 
    $end $this->total_pages $page_link_list[] = $this->get_page_link$end +1$end == $this->total_pages '' '...' );
        if ( 
    $end <= $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 $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]


    и все дела