Toon posts:

[PHP] class fout met het openen van dirs

Pagina: 1
Acties:

Verwijderd

Topicstarter
Aller eerst even mijn verontschuldigingen voor de rare topic titel. Hoe dan ook ik zit met een probleempje in een class. Het is vreemd maar als ik de volgende class run op mijn localhost (gebruikmakend van win98 en PHPtriad) krijg ik een foutmelding dat php een ongeldige bewerking uitvoert. Vervolgens een 500 Internal Server Error in mijn browser.
De bedoeling van de class is dat hij een directory opent, uitleest en de subdirectories automatisch opent, uitleest etc.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Crawler
{
    var $dir;
    var $entry;
    var $_error;

    function setDir($dus)
    {
        $this->dir = $dus;
    }
    
    function INIT ()
    {
        $this->entry = array('Dir' => array(), 'File' => array());
        if(!$this->dir) $this->dir = getcwd();
    }
    
    function Error ($_error)
    {
        $this->_error = $_error;
    }
    
    function EntryList($type, $entry)
    {
        $entries = count($this->entry[$type]);
        $entries = $entries + 1;
        $this->entry[$type][$entries] = $entry;
    }
    
    function CheckDir ($dir)
    {
        if(!$bla = opendir($dir)) Error("Error: $dir. This is not a valid directory.");
        else
        {
            while (($entry = readdir($bla)) !== false) 
            {
                if(is_dir($entry))
                {
                    $this->EntryList('Dir', $entry);
                    $this->CheckDir($entry);
                }
                else $this->EntryList('File', $entry);
            }  
            closedir($dir);
        }
    }

}

$Crawl = new Crawler();
$Crawl->setDir('C:\apache\htdocs\achterhetnieuws');
$Crawl->INIT();
$Crawl->CheckDir($Crawl->dir);
print_r($Crawl->Entry);


Heeft iemand enig idee wat het probleem is?

  • Grum
  • Registratie: Juni 2001
  • Niet online
En als je gaat debuggen ? :)

• opent ie de dir ?
• lees ie de filenames ?
• heeftie na de filenames nog de dir pointer open ?
• error_reporting( E_ALL );

Debuggen ?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    function INIT () 
    { 
        $this->entry = array('Dir' => array(), 'File' => array()); 
        if(!$this->dir) $this->dir = getcwd(); 
    } 

en

$Crawl = new Crawler(); 
$Crawl->setDir('C:\apache\htdocs\achterhetnieuws'); 
$Crawl->INIT(); 
$Crawl->CheckDir($Crawl->dir); 
print_r($Crawl->Entry);


Is trouwens verre van 'mooi', probeer eens iets als:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    function Crawler( $inDir ) // constructor 
    { 
        $this->setDir( $inDir );
        $this->entry = array( 'Dir' => array(), 'File' => array()); 
    } 

// Meegeven met de contructor.
$Crawl = new Crawler( 'C:\apache\htdocs\achterhetnieuws' );

// CheckDir intern $this->Dir laten uitlezen ipv nog es meegeven.
$Crawl->CheckDir(); 

print_r( $Crawl->Entry );


Dat scheelt al een boel in de netheid.

Daarnaast leent de manier waarop je je data opslaat niet echt voor een OO aanpak. Je kan het net zo goed met 1 recursive functietje doen.

HTH :D

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

er zitten nog wel meer weirdheden in :D

code:
1
2
if ( !$bla = opendir($dir) ) 
   Error("Error: $dir. This is not a valid directory.");


Je kent 't resultaat van de opendir() call toe aan de variabele (!$bla) ... Best kans dat de memorymanager daar een beetje van over zijn nek gaat.

Vervolgens roep je een functie Error () aan. Die bestaat niet. Wel een method Error, maar daarbij moet je in PHP expliciet de instantie $this aangeven. $this->Error ()...

overigens lijkt het mij logischer om een trigger_error () of user_error () te gebruiken, en/of gewoon false te retourneren.

hth :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Thnx dudes
Maar ik snap niet dat php eruit knalt. Dat slaat nergens op.

  • Grum
  • Registratie: Juni 2001
  • Niet online
D e b u g g e n.

Je script is gewoon niet zinnig om in een class te stoppen. Schrijf er gewoon een recursieve functie voor ben je zo klaar. (Zeker als je het ranzig doet met een global var :D)

Verwijderd

[duimzuig="niet ge-debugged modes"]
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function leesdir($naam){
static $content = array();

if(!isset($content[$naam]))
  $content[$naam] = array();

$a = opendir($naam);
while (($entry = readdir($a) !== false){ 
  if(is_dir($entry))
    leesdir($entry);
  else
    $content[$naam][] = $entry;
}
closedir($a); 
}

[/duimzuig]

[ Voor 0% gewijzigd door Verwijderd op 01-09-2002 14:03 . Reden: typo in code ]


Verwijderd

Topicstarter
Had ik ookal geprobeerd, maar dat trektie dus ook niet. (Komt volgens mij omdat je uit de ene functie dezelfde functie aanspreekt.)
Vreemd allemaal.

Verwijderd

Verwijderd schreef op 01 september 2002 @ 14:51:
Had ik ookal geprobeerd, maar dat trektie dus ook niet. (Komt volgens mij omdat je uit de ene functie dezelfde functie aanspreekt.)
Vreemd allemaal.
Recursie is gewoon toegestaan.. bekijk je php configuratie maar eens goed.. gewone echo's doet ie wel? gewoon een dir openen en sluiten ook ?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
Grum: (Zeker als je het ranzig doet met een global var :D)
:D :D

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 01 september 2002 @ 14:51:
Had ik ookal geprobeerd, maar dat trektie dus ook niet. (Komt volgens mij omdat je uit de ene functie dezelfde functie aanspreekt.)
Vreemd allemaal.

Als je serieus geholpen wilt worden zal je iets meer moeten uitleggen :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Weet je zeker dat je geen stackoverflow melding krijgt?.. Ik kan me namelijk voorstellen dat ie . en .. ook als geldige directories ziet en vervolgens zichzelf ook op deze dirs aan gaat roepen.

Bij recursie is het zo belangrijk om te kijken of je stopcriteria wel kloppen.....

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1