ID: 24251 Comment by: marv at cyberia dot net dot lb Reported By: qurve at qurve dot com Status: Analyzed Bug Type: Documentation problem Operating System: FreeBSD 4.7 PHP Version: 4.3.2 New Comment:
The problem lies with function php_fopen_with_path in php-src/main/fopen_wrappers.c The code is inconsistent with the what the documentation suggests (which is c-like behaviour). And since I think the documented behaviour is more intiuative, the code appears in-correct. Currently, the code is as follows: If the filename starts with a '.' (such as "../c/c.php" above), the function looks for the file relative to the 'main' script. Else if the filename is an absolute path, the function opens it directly. Otherwise, the function looks for the file relative to the directories listed in the 'include_path' configuration directive. If that fails, it then checks relative to the directory of the currently executing script. This has the consequences stated in the initial bug report. It also means that relative includes are always enabled. Adding a '.' path to the paths in include_path does not enable relative includes. It causes PHP to check relative to the 'main' script before checking relative to the currently executing script. I think it would be better if the function: Opens the file directly if it is an absolute path. Otherwise, scan the 'include_path' directive and replace a '.' path with the path of the currently executing script. Look for the file relative to the directories listed in the modified 'include_path'. Previous Comments: ------------------------------------------------------------------------ [2003-06-23 23:42:28] qurve at qurve dot com If the cwd for the include is the cwd for a.php, how come when /root/b/b.php includes "b2.php" it includes /root/b/b2.php and not /root/b2.php? ------------------------------------------------------------------------ [2003-06-23 22:21:04] [EMAIL PROTECTED] It's working just like it is supposed to be working. The working directory (cwd) is the one for the 'main' script, a.php in your case. NOT the directory where the 'sub' scripts are located. ------------------------------------------------------------------------ [2003-06-21 12:35:12] qurve at qurve dot com I should also note that this behavior isn't even consistent: +---+----------------+------------+----------------+-------------------+----------+ | # | file | includes | should include | actually includes | correct? | +---+----------------+------------+----------------+-------------------+----------+ | 1 | /root/a.php | b/b.php | /root/b/b.php | /root/b/b.php | yes | | 2 | /root/b/b.php | b2.php | /root/b/b2.php | /root/b/b2.php | yes | | 3 | /root/b/b2.php | ../c/c.php | /root/c/c.php | /c/c.php | no | +---+----------------+------------+----------------+-------------------+----------+ Behavior 1 works as it should Behavior 2 works as it should Behavior 3 works not as expected Behavior 2 and 3 are inconsistent with each other. ------------------------------------------------------------------------ [2003-06-18 21:26:50] qurve at qurve dot com Description: ------------ This was posted previously, but I did not feel the issue was really answered by the responses and I upgraded to 4.3.2 and it's still like this. I'm not sure whether this is how it's supposed to work, but if it is I'm amazed because it's extremely counter-intuitive. '.' should always be relative to the script that is calling include*()/require*() even if that script was include*()'d/require*()'d itself. full write-up here: http://www.qurve.com/broken_paths.txt Reproduce code: --------------- http://www.qurve.com/broken_paths.txt Expected result: ---------------- /root/a.php includes: "b/b.php" /root/b/b.php includes: "../c/c.php" php should include /root/c/c.php Actual result: -------------- /root/a.php includes: "b/b.php" /root/b/b.php includes: "../c/c.php" php attempts to include /c/c.php ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=24251&edit=1 -- PHP Documentation Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php