php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #5455 readdir() still doesn't work
Submitted: 2000-07-08 11:53 UTC Modified: 2000-09-07 14:21 UTC
From: johan at ekenberg dot se Assigned:
Status: Closed Package: Directory function related
PHP Version: 4.0.2 OS: Linux 2.2.14
Private report: No CVE-ID: None
 [2000-07-08 11:53 UTC] johan at ekenberg dot se
I still experience problems with readdir(), using Apache 1.3.12 and PHP 4.0.1pl2:

The while loop exists at the first evaluation of the if-statement. If the if-statement is commented out, the code works.

   $dir = opendir(".");
   while ($file = readdir($dir)) {
      print "<br>$file";
      if ($file == "foo") {
         // anything
      }
   }

Config:
  PHP Version 4.0.1pl2

  './configure' '--with-apache=../apache_1.3.12' '--with-mysql' '--with-gd' '--with-ttf' '--with-ftp' '--with-swf' '--with-mcrypt' '--with-mhash' '--with-xml' '--disable-posix-threads' '--enable-memory-limit=yes' '--enable-track-vars' '--enable-debug=no'

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-07-08 12:02 UTC] stas at cvs dot php dot net
Works for me in latest CVS. Could you please try?
 [2000-07-11 16:48 UTC] johan at ekenberg dot se
I've tried the latest CVS as of July 10, and it still doesn't work. It seems (with pl2 and latest CVS alike) that it may work once or twice before breaking. Please note that if the "if-statement" is commented out, the code works fine.

Please let me know if there's anything more I can do to help!
 [2000-07-12 03:04 UTC] stas at cvs dot php dot net
How exactly it doesn't work? What happens if you enable debug - do some messages appear? What was "anything" in your script? What is the exit code after exit?
 [2000-07-12 05:32 UTC] johan at ekenberg dot se
As I wrote earlier, the problem is that the while-loop exits at the first evaluation of the "if-statement", thus printing only the first directory entry - a dot. If the "if-statement" is removed or commented out, the complete directory listing is printed out.

"anything" is just that - anything or nothing. Call it "bogus", "foo", or remove it completely - it just doesn't matter.

Enabling debug did not produce any messages in the PHP or error-logs.

How do I check the exit code? This is run as an Apache module with no errors produced in the logs - I suppose that's an exit code of 0?

Please check the following URL for a working example:
http://www.ekenberg.se/readdir/index.php
 [2000-07-13 04:22 UTC] stas at cvs dot php dot net
What do you mean by "while loop exits"?
If you run "gdb httpd -X" and then try you script - what gdb says? Could you also put breakpoint on zend_bailout() and see if it isn't called from somewhere (and if it is - from where?)
 [2000-07-15 05:09 UTC] johan at ekenberg dot se
1. The while loop is only evaluated once, despite the fact that there are more directory entries to list. I earlier wrote that the while-loop exits at the first evaluation of the if-statement, but that is not true. The execution continues after the if-statement until the end of the while loop, there it exits. If the if-statement is removed or commented out, the while loop will continue looping until all entries in the directory are listed. With the if-statement left in place it's exactly like putting "break;" as the last line of the while loop - it never evaluates more than once. I guess that something in the if-statement makes readdir($dir) evaluate to false the next time.

   $dir = opendir(".");
   while ($file = readdir($dir)) {
      print "<br>$file";
      if ($file == "foo") {
         // anything or nothing here, doesn't matter
      }
      // Code placed here will also be evaluated,
      // but as long as the if-statement above is not
      // removed, the while loop will exit after 
      // completing once - like putting a
      // break;
      // as the last line of the while loop.
   }

I earlier submitted an URL with a working example which I believe displays the issue rather clearly: http://www.ekenberg.se/readdir/index.php

2. "gdb -X httpd" doesn't report anything unusual - httpd happily keeps on executing, there are no errors and it doesn't exit. zend_bailout() is never called.

 [2000-07-15 09:53 UTC] johan at ekenberg dot se
Stefan Kirch [s.kirch at bauer-kirch.de] mailed me:

-- start quote --
I have the same problem (#5535) and found a "work-around" like the following:

  if (ereg("^foo$", $file)) {

RegEx works fine, so it seems to be a problom of string-comparison. Codes like 

  if ($x == "5") {

also breaks the loop, on the other hand, numerical comparisons like

  if ($x == 5) {

works fine.
-- end quote --

I don't know if this might give any clues to the experts?

 [2000-09-02 20:13 UTC] sniper@php.net
Please upgrade to php4.0.2. I just tried your example code and 
it works just fine for me.

Reopen if problem still persists.

--Jani
 [2000-09-06 05:08 UTC] johan at ekenberg dot se
I've still got the problem after upgrade to 4.02.
System is libc5 (Slackware 4.0) running 2.2.16.

Example code and phpinfo() available here:
  http://www.ekenberg.se/readdir/index.php

 [2000-09-06 17:50 UTC] sniper@php.net
You don't use closedir() anywhere in your code. 
Please try this example:

<?php

$dir = opendir(".");

while ($file = readdir($dir)) {
    if ($file != "." && $file != "..") {
        echo "$file<br>";
    }
}
closedir($dir);
?>

If this doesn't help, upgrade to latest CVS.
This works just fine for me.

--Jani
 [2000-09-07 03:50 UTC] johan at ekenberg dot se
Added closedir() but it doesn't help.
I've also added a third example with your exact code request. Try it out here: http://www.ekenberg.se/readdir/index.php
Sorry to say it doesn't work either.

If you tell me there are really any changes to opendir() in the latest CVS that would motivate an upgrade, I'm willing to try - but this is the third time I'm asked to upgrade to the latest CVS or stable version with the same motivation: "It works for me". But it hasn't still.

I'd be happy to provide a user account on the server if that would be of any help.

It seems this bugreport more or less duplicates bug no. 5540.
 [2000-09-07 14:21 UTC] johan at ekenberg dot se
Finally solved thanks to stas@zend.com

Should be in CVS soon.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Mar 19 06:01:30 2024 UTC