[PHP] Scandir() vs. opendir()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Ik zit nu toch met een wazig probleem.
Ik heb dit scriptje gemaakt:
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
<?php
$dir = $_SERVER['DOCUMENT_ROOT']."/fotoalbum";
echo $dir;
$mapjes = scandir($dir);
echo "<pre>".print_r($mapjes,true)."</pre>";
?>
<form method="POST" ACTION="bestemming">   
<select name="Mappen">   
<option value="" selected="selected">------ Maak hier je keuze ------</option>   

<?php   
if (is_dir($dir)) {  
    if ($dh = opendir($dir)) {  
        while (($map = readdir($dh)) !== false) {  
                if ($map != "." && $map != "..") { 
                    if(is_dir($map)) { 
                    echo "<option value=\"".$map."\">".$map."</option>\n";  
                    } 
                }     
        }  
        closedir($dh);  
    }  
}  
?>  
 </select>   
</form> 

En daarmee kan ik dus alle mappen in de map /fotoalbum (in de webroot) dan uitlezen.
Alleen heb ik een raar probleem waar ik neit uitkom, als ik dit script in de map fotoalbum zet werkt de code met opendir() prima, maar buiten die directory werkt die opendir() manier niet, en toont hij geen mappen.

Met scandir() krijg ik ongeacht in welke map ik zit altijd resultaat.
Met een volledig pad moet ik toch ook met opendir() ook altijd alles mappen kunnen zien?
Naar mijn weten is dit geen rechten-instelling ofzo op de server aangezien alle mappen netjes op mijn naam staan.

Iemand enig idee waarom opendir() alleen in zijn eigen map werkt, en niet daarbuiten, en scandir in elke map?
Ik worstel nu al echt 3 uur met dit probleem geloof ik. Of heb ik een ordinaire bug in PHP te pakken?

[ Voor 0% gewijzigd door AW_Bos op 04-01-2009 16:27 . Reden: overbodige escaping opgeruimd ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Hoe heb je bepaald dat het probleem daadwerkelijk in opendir zit? Ik vermoed namelijk dat het probleem in is_dir zit. Volgens mij loop je hier tegen weer zo'n typisch ontbreken van uniformiteit van php aan.

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


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
De fout treedt inderdaad bij opendir() op omdat die alleen de directories toont als het volledige pad naar de map wijst waar het script in staat (m.a.w.: script toont alleen directories in dezelfde map).

Scandir daarintegen doet zijn werk overal wel goed.
Janoz schreef op maandag 24 november 2008 @ 10:47:
Volgens mij loop je hier tegen weer zo'n typisch ontbreken van uniformiteit van php aan.
Hoe bedoel je? Foutje in mijn script, of een bugje in PHP?

[ Voor 33% gewijzigd door AW_Bos op 24-11-2008 10:52 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Wanneer is_dir false oplevert worden er ook geen directories getoond. Je verklaring waarom de fout bij opendir zou moeten liggen is dus niet steekhoudend. Voeg eens een aantal echo's toe zodat je zeker weet dat is_dir geen false oplevert, dan weet je zeker dat het bij open_dir zit.


Wat ik met die ontbrekende uniformiteit bedoel is (naast de camelcase vs underscore naamgeving;) ) het volgende:

Parameter beschrijving bij is_dir:
Path to the file. If filename is a relative filename, it will be checked relative to the current working directory.
Parameter beschrijving bij opendir:
The directory path that is to be opened
Mijn vermoeden is dus dat is_dir anders omgaat met de parameter dan opendir. Aangezien ze het bij de eerste over filename hebben zou het best kunnen dat hij niet met een trailing slash om kan gaan oid.

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


Acties:
  • 0 Henk 'm!

  • Depress
  • Registratie: Mei 2005
  • Laatst online: 18-09 22:29
Je moet in is_dir zowel je path als de map/filename mee geven.

Iets als:
PHP:
1
is_dir($path.$map);

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Depress schreef op maandag 24 november 2008 @ 11:43:
Je moet in is_dir zowel je path als de map/filename mee geven.

Iets als:
PHP:
1
is_dir($path.$map);
Dat gebeurt toch ook? :?
code:
1
$dir = $_SERVER['DOCUMENT_ROOT']."/fotoalbum";


Ik ga eens vanmiddag wat klooien met wat echo's...

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • Tiemez
  • Registratie: December 2003
  • Laatst online: 24-10-2022
Je kan ook SPL gebruiken hiervoor :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$dir = realpath('/home/rob/');
$dir =  new DirectoryIterator( $dir ) ;

print("<select name=\"directory\">\n");
        foreach($dir As $k => $obj){
                if( $obj->isDir() && !$obj->isDot() ) {
                        print("<option value=\"".$obj->getBaseName()."\">".$obj->getBaseName()."\">\n");
                }

        }
print("</select>\n");

?>

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Is inderdaad ook een optie.
Maar toch wil ik eerst eens uitzoeken waarom die opendir()-manier niet werkt :P.
In Directory Itterator duik ik van de week wel eventjes in :).

[ Voor 46% gewijzigd door AW_Bos op 24-11-2008 12:15 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • --MeAngry--
  • Registratie: September 2002
  • Laatst online: 19-09 16:35

--MeAngry--

aka Qonstrukt

Ariën Clay schreef op maandag 24 november 2008 @ 11:51:
[...]

Dat gebeurt toch ook? :?
code:
1
$dir = $_SERVER['DOCUMENT_ROOT']."/fotoalbum";


Ik ga eens vanmiddag wat klooien met wat echo's...
Waarom gebruik je dan geen:
code:
1
is_dir($dir . $map);

?

Tesla Model Y RWD (2024)


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
omdat ik die map al defineer in $dir?

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Nu online

orf

Ariën Clay schreef op maandag 24 november 2008 @ 12:27:
omdat ik die map al defineer in $dir?
en dat werkt niet omdat is_dir('document_root/mapnaam') niet bestaat. De functie 'weet' toch niet in welke map je bezig bent?

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Opendir geeft alleen de mapnamen terug van de mappen die hij vind. Scandir geeft absolute paden terug.
Je is_dir failed dus, je moet er hetzelfde pad instoppen als in opendir (dus het path waar de map is gevonden) plus de gevonden map; is_dir($dir . '/' . $map)

Als je dat niet wilt zul je eerst je working directory moeten aanpassen; chdir($dir).

Als je wat meer variabelen zou echoen in plaats van aannames te maken had dit direct al gevonden

[ Voor 47% gewijzigd door frickY op 24-11-2008 12:35 ]


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Huh
Er staat in de manual dit:
Path to the file..
Dus ik geef hem een path op toch, met DOCUMENT_ROOT?
Tja, zo staat dat er... :?

Ik snap er niks meer van?
Wat is dan het verschil tussen:

code:
1
$dir = $_SERVER['DOCUMENT_ROOT']."/fotoalbum";

en dit:
code:
1
is_dir($dir . $map);

Ehr, jah. Het probleem zit indd in de ingenestte is_dir.

[ Voor 35% gewijzigd door AW_Bos op 24-11-2008 12:43 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

orf schreef op maandag 24 november 2008 @ 12:30:
En dat werkt niet omdat is_dir('document_root/mapnaam') niet bestaat. De functie 'weet' toch niet in welke map je bezig bent?
PHP:
1
$_SERVER['DOCUMENT_ROOT']
geeft toch gewoon bijvoorbeeld /usr/username/public_html/ terug? :) Je hoeft dan toch niet per se te weten wáár het script staat, aangezien je niet het relatieve pad geeft, maar de absolute? En als je per se wil weten in welke map je zit, kan je toch
PHP:
1
$_SERVER['PHP_SELF']
gebruiken? :) Dan weet je zelfs in welk bestand je zit... ;)

Of ik mis nu wat... ;)

[ Voor 16% gewijzigd door CH4OS op 24-11-2008 12:43 ]


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
Je doet dit;
PHP:
1
2
3
        while (($map = readdir($dh)) !== false) {   
                if ($map != "." && $map != "..") {  
                    if(is_dir($map)) {


Je Itereert door de direcotryhandle die opendir heeft gemaakt met readdir.
De returnvalue van readdir is een map- danwel bestandsnaam, geen absoluut pad.
Die map/bestandsnaam stop je in is_dir().
Echo $map eens zodat je ziet wat we bedoelen.

Het enige wat je doet met
PHP:
1
 $dir = $_SERVER['DOCUMENT_ROOT']."/fotoalbum";

is een pad in een variabele onthouden. Dat is geen magic variable die opeens in alle functies wordt meegenomen of iets dergelijk, je zult hem zelf moeten meegeven waar je hem gebruiken wilt

[ Voor 8% gewijzigd door frickY op 24-11-2008 12:43 ]


Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Ariën Clay schreef op maandag 24 november 2008 @ 10:41:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$dir = $_SERVER['DOCUMENT_ROOT']."/fotoalbum";

if (is_dir($dir)) {  // Kijken of $dir een map is
    if ($dh = opendir($dir)) {  
        while (($map = readdir($dh)) !== false) {  
                if ($map != "." && $map != "..") { 
                    if(is_dir($map)) { // Hier kijk je of $map een map is, maar niet in $dir, maar in DOCUMENT_ROOT. Aanpassen naar $dir . '/' . $map dus om in $dir/$map te kijken.
                    echo "<option value=\"".$map."\">".$map."</option>\n";  
                    } 
                }     
        }  
        closedir($dh);  
    }  
}  
?>  

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 11:52

AW_Bos

Liefhebber van nostalgie... 🕰️

Topicstarter
Hehe, ik snap het :).
Ik zal er nog eens naar kijken vanavond.
Ach, het werkt zie ik al.... :> :> :> :>

[ Voor 51% gewijzigd door AW_Bos op 24-11-2008 12:53 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

Verwijderd

Even een opmerking van andere aard, ik zie in je eerste voorbeeld buiten de PHP-code wat HTML staan, waarbij je backslashes voor de quotes plaatst. Staat dit ook letterlijk zo in je code, of komt het door het forum hier of zo? Aangezien HTML-code buiten PHP rechtstreeks naar de browser gestuurd wordt lijkt het escapen van quotes me hier niet nodig.
Pagina: 1