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
    электронная библиотека

    почему если закоментить все с if то все нормально считает . а если нет то лезет в вверхний каталог .
    я же пишу opendir("./$file")

    Code:
    <?php 
    $dir = opendir("../books");
    while(($file = readdir($dir)) !== false )
     
         {
    	 
    	 
    	 echo "$file<br />";
    	 if ($file != '.' || $file != '..' ) {
    	 $bookdir = opendir("./$file");
    	 
    	 while (($link = readdir($bookdir)) !== false)
    	 {
    	 echo "$link <br />";
    	 }                                  
    	 closedir($bookdir);                  }
    	 
    		 
    	 
    	 }
    	 
    closedir($dir);
    
    
    ?>
     
    #1 barnaki, 8 Jan 2009
    Last edited: 20 Oct 2010
  2. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    у меня в книге написанно цитата :
    chdir ("./js"); // переход в подкаталог текущего каталога . это ошибка ?
     
  3. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    PHP:
    if ($file != '.' || $file != '..' )
      
    Тут должно быть &&
     
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    readdir к файлам это жестоко, а что хочешь получить в итоге?
     
    _________________________
  5. astrologer

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

    Joined:
    30 Aug 2007
    Messages:
    837
    Likes Received:
    267
    Reputations:
    59
    И правда :)
     
  6. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    там короче папка в которой папки в книгами. папки там c++ или html называются . вот в этот скрипт прихожу где то из ../php/show_books.php
    я хочу чтобы оно входило не только в тот каталог но еще и в попкаталоги. и выводило список файлов из тех папок который выводит первый readdir
     
  7. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    я написал так но все пишет :
    Warning: scandir(/html) [function.scandir]: failed to open dir: No error in C:\php_files\home\banderas\site_gosti\php\show_books.php on line 38

    Warning: scandir() [function.scandir]: (errno 0): No error in C:\php_files\home\banderas\site_gosti\php\show_books.php on line 38


    $dir = opendir("../books");
    while(($file = readdir($dir)) !== false )

    {


    echo "$file<br />";
    if ($file != '.' || $file != '..' ) {
    $files = scandir($file) ;
    echo "<pre>";
    print_r($files);
    echo "</pre>"; }



    }

    closedir($dir);
     
  8. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Солнышко, потому что иначе это шелл, просто шелл, что практически равно взлом, особенно если у тебя виртуальный невыделенный хостинг
     
  9. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    так а что можно сделать ? как это обойти ?
     
    #9 barnaki, 8 Jan 2009
    Last edited: 8 Jan 2009
  10. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    чем не устраивает??
     
  11. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    так оно считает содержимое \books а там только папки а мне надо содержимое этих папок
     
  12. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    http://script4u.ru/php/file/431-phpbrowser-1.0.html

    вот весьма грамотная реализация, на мой взгляд, вообще, чтения и т.д.
     
    1 person likes this.
  13. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    спасибо посмотрю
     
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki мм?
    PHP:
    <pre><?php 

    $dir 
    "./somedir";

    function 
    recurs($dir,$tab="")
    {
        if(!
    is_dir($dir)) return;
        
        
    $dirs scandir($dir);

        foreach (
    $dirs as $one)
        {
            if (
    $one =='.' || $one =='..') continue;
            
    $path realpath($dir.'/'.$one);
            if (
    is_dir($path)) {echo $tab.'['.$one."]\r\n";recurs($path,$tab."\t");continue;}
            echo 
    "$tab$one\r\n";
        }
    }

    recurs($dir);

    ?>
     
    _________________________
    1 person likes this.
  15. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    мне надо чтобы выводился не только имя файла но и путь к нему ( собираюсь использовать пути в ссылках) . сделал так
    Code:
    public function read_book_dir($book_dir,$tab=""){
               if(!is_dir($book_dir)) return;
    
        $dirs = scandir($book_dir);
    
       foreach ($dirs as $one)
        {
            if ($one =='.' || $one =='..') continue;
            $path = realpath($book_dir.'/'.$one);
             //$way = realpath($one);
            if (is_dir($path)) {$way = realpath("$one");echo"way_dir=$way"."<br>";
            echo $tab.'['.$one."]<br>";$this->read_book_dir($path,$tab."\t");continue;}
            $way = realpath($one);echo "way_file=$way"."<br>";
           echo "$tab$one\r\n<br>";
    
           
        }
    но way все время пустой. . и realpath почему то не отрабатывает. кто подскажет почему. причем и мануале написано что realpath возвращает false если не отрабатывает. а тут просто пустая строка. подскажие это срочно.
     
    #15 barnaki, 15 Oct 2010
    Last edited: 15 Oct 2010
  16. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki внимательно читайте, что делает функция realpath
    А вы ей подсовываете только имя конкретной папки без относительного пути до нее. Как должно быть:
    PHP:
    <?php
    $dir 
    "C:\\";
    function 
    recurs($dir$tab "")
    {
        if (!
    is_dir($dir)) return;
        
    $dirs scandir($dir);
        foreach (
    $dirs as $one)
        {
            if (
    $one == '.' || $one == '..') continue;
            
    $path realpath($dir '/' $one);
            if (
    is_dir($path))
            {
                echo 
    $tab '[' realpath($dir '/' $one) . "]\r\n";
                
    recurs($path$tab "\t");
                continue;
            } 
            echo 
    $tab realpath($dir '/' $one) . "\r\n";
        } 

    recurs($dir);

    В вашем скрипте функция возвращает false, чтобы узнать об этом можно использовать функцию var_dump(). При приведении к строке значения false - получается пустая строка
     
    _________________________
    #16 Gifts, 15 Oct 2010
    Last edited: 15 Oct 2010
    1 person likes this.
  17. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    php return массива из класса

    есть метод
    PHP:
    public function total_books($book_dir,$tab=""){
            
    $i0;
            
    $books = array();



             if(!
    is_dir($book_dir)) return;

        
    $dirs scandir($book_dir);

        foreach (
    $dirs as $one)
        {
            if (
    $one =='.' || $one =='..') continue;
            
    $path realpath($book_dir.'/'.$one);

            if (
    is_dir($path)) {

           echo 
    $tab.'['.$one."]<br>";$this->total_books($path,$tab."\t");
            continue;}
            else {
                
    //echo "zashlo$i";
                
    $books[$i] = $one;
                
    //echo "$books[$i]";
                 
    $i++;}
                                    }

           
    // $dump = var_dump($books);
            //echo "$dump";
            
    $dump var_dump($books);
    // тут он выводит нормальный дамп
            
    echo "$dump";
            return 
    $books;
        }
    а тут в индексе
    PHP:
    $result $book->total_books($book_dir,"");

    echo 
    "<pre>";
    $dump var_dump($result);
    echo 
    "dump=$dump";
     
    print_r ($result);
    echo 
    "</pre>";
    result пустой. подскажите чего оно не возвращает этот массив
     
  18. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki чем вам не сиделось в исходном топике, и вы решили создать еще один?

    Что вы хотите получить в переменной $dump? По секрету - var_dump() не возвращает никакого результата.

    Создайте минимально рабочий файл с вашим классом и тем как вы вызываете его.
     
    _________________________
  19. barnaki

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

    Joined:
    2 Nov 2008
    Messages:
    676
    Likes Received:
    130
    Reputations:
    4
    вот файл класса
    PHP:
    class book {
    private static 
    $instance;
      private static 
    $from_singleton FALSE;

        function 
    __construct()
            {
            
    $db db :: singleton();


         if (
    self::$from_singleton == FALSE)
                {
                
    trigger_error('Direct instantionation is not allowed.'E_USER_ERROR);
             exit(
    "class db is creating not from singlton ");
                }
          
    self::$from_singleton FALSE;
          
     }
        
    //////////////////////////////////////////
        
    public static function singleton()
            {
                if (!isset(
    self::$instance))
                    {
                           
    $c __CLASS__;
                           
    self::$from_singleton TRUE;
                           
    self::$instance = new $c;
                    }

                    return 
    self::$instance;
            }

      public function 
    total_books($book_dir,$tab=""){
            
    $i0;
            
    $books = array();
             if(!
    is_dir($book_dir)) return;
        
    $dirs scandir($book_dir);
        foreach (
    $dirs as $one)
        {
            if (
    $one =='.' || $one =='..') continue;
            
    $path realpath($book_dir.'/'.$one);

            if (
    is_dir($path)) {

           echo 
    $tab.'['.$one."]<br>";$this->total_books($path,$tab."\t");
            continue;}
            else {
                
    //echo "zashlo$i";
                
    $books[$i] = $one;
                
    //echo "$books[$i]";
                 
    $i++;}
                                    }

                
    $dump var_dump($books);
            echo 
    "$dump";
            return 
    $books;
        }

    }
    вот его вызов
    PHP:
    <?php
    include ("config/config.php");
    include (
    "classes/db.php");
    $db db :: singleton();
    include (
    "classes/book.php");
    $book book :: singleton();
    //$book->make_book_href($book_dir,"");
    if (!isset($_GET['page'])) {$page =1;}
    $result = array();
    $result $book->total_books($book_dir,"");
    echo 
    "<pre>";
    $dump var_dump($result);
    echo 
    "dump=$dump";
     
    print_r ($result);
    echo 
    "</pre>";


    ?>
    и var_dump пишет что $result это array но пустой
    и print_r выводит array(0) а если в самом методе посмотреть то все нормально там array наполнен значениями. он почему то не передается. может кто скажет почему
     
  20. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    barnaki скорее всего вы не задаете переменную $book_dir, у меня ваш скрипт работает (естественно если удалить упоминания о переменной $db)
     
    _________________________