Reputation: 3623
This bug has depleted my rational thinking power over the past 64 minutes and I really don't know what I should do.
When i use the following 3 lines in an included file:
var_dump(file_exists('G:/xampp/htdocs/myproject/public_html/includes/htmlPurifierAndMarkdown.php')); //retuurns true
var_dump(__FILE__);
include '../htmlPurifierAndMarkdown.php'; //gives error
i get the following output :
boolean true
string 'G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php' (length=71)
( ! ) Warning: include(../htmlPurifierAndMarkdown.php) [function.include]: failed to open stream: No such file or directory in G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php on line 4
Call Stack
# Time Memory Function Location
1 0.0005 345328 {main}( ) ..\add.php:0
2 0.0036 382408 include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\events.class.php' ) ..\add.php:28
3 0.0041 398024 include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\standardpost.class.php' ) ..\events.class.php:2
4 0.0047 413928 include( 'G:\xampp\htdocs\myproject\public_html\includes\classes\genral.class.php' ) ..\standardpost.class.php:2
In a nutshell:
so am i just imagining stuff or is this some serious php bug?
when i access genral.class.php
manually, no error is generated. do special rules apply when including from within an included file?
Update 2
When i set the include path to '../includes/htmlPurifierAndMarkdown.php' , which is the path relative to the main calling script, which in turn includes a script which includes genral.class.php
it works, but since this new include is relative to only one of the many calling scripts, it breaks down for the others. Do special rules apply when including a file from within an included file??
Upvotes: 1
Views: 1625
Reputation: 5589
The __FILE__
constant returns the full path and filename of the file containing that line. It is possible for this file to be located inside a directory other than the current working directory. In your particular example you can use this:
include dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'htmlPurifierAndMarkdown.php';
An example of what might be going on is as follows:
/example.com/public_html/index.php
/example.com/public_html/
/example.com/public_html/includes/classes/genral.class.php
../htmlPurifierAndMarkdown.php
..
is translated relative to current working directory and not relative to the included file. Thus you end up with /example.com/htmlPurifierAndMarkdown.php
and a nasty error message.Upvotes: 5
Reputation: 272006
../
is a relative path -- relative to the current working directory. And the current working directory is the one in which the outer script (the one being requested by the browser) resides. In the above example, PHP will resolve paths relative to add.php
.
Use dirname(__FILE__)
to get the absolute path of the current file (whether requested or included). You can use it to calculate absolute path to a known file using relative paths.
Upvotes: 1
Reputation: 4185
try to include file like this :
include(realpath(dirname(__FILE__) . '/../') . 'htmlPurifierAndMarkdown.php');
in other way you have these files ::
/index.php
/includes/classes/genral.class.php
/includes/htmlPurifierAndMarkdown.php
index.php :
include('/includes/classes/genral.class.php');
genral.class.php :
include('/includes/htmlPurifierAndMarkdown.php');
if you begin with index.php this will be work fine ...
Upvotes: 0