Re: Relative paths in require_once problem (possibly all include
Re: Relative paths in require_once problem (possibly all include
am 02.01.2008 18:21:36 von Logos
On Dec 17 2007, 5:27 am, Jerry Stuckle
wrote:
> Royan wrote:
> > Thanks Steve, thats a great idea, i've especially liked that part :)
> >>> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
>
> > Unfortunately this approach works great only if you can modify PHP.ini
> > but when you are on virtual hosting, the only way you can modify
> > settings in PHP.ini is by calling ini_set() function which has to be
> > invoced from somewhere. And in my case this "somewhere" is global.inc
> > This file is meant to keep all global stuff so it has to be included
> > into each and every file in my project, but this is the original
> > problem -- i can'tincludeit. Seems to be a vicious circle.
> > The only solution i can think of right now is to use the absolute path
> > for "global.inc" in each call to require_once. Thus i can put your
> > code that calculates relative path in "global.inc" and use it across
> > all other files.
>
> > 2BKDotCom
> >>> logger.inc doesn't need toincludeglobal.inc as long as global.inc
> >>> has been included before logger.inc is included..
>
> > It appears I've made a mistake in my original post. In fact you don't
> > have toinclude"global.inc" into foo.php, the error would persist. If
> > you wish I can send you test files that replicate the problem
>
> > On Dec 17, 2:30 am, "Steve" wrote:
> >> "Royan" wrote in message
>
> >>news:8769e733-17fe-4083-865c-ccd496707023@e25g2000prg.goog legroups.com...
>
> >>> Ok the problem is quite hard to explain, but i'll try to keep it as
> >>> simple as i can. Imagine I have the following structure of my files
> >>> and folders:
> >>> /root/global.inc
> >>> |__/files/foo.php
> >>> |__/utils
> >>> |__/logs/logger.inc
> >>> When I run foo.php I get the following error:
> >>> ==========
> >>> Fatal error: require_once() [function.require]: Failed opening
> >>> required '../../global.inc' (include_path='.;E:\www\root\') in E:\www
> >>> \root\utils\logs\logger.inc on line 3
> >>> ==========
> >>> That error occurs because
> >>> 1) "global.inc" is included ("required") into "logger.inc" and
> >>> "foo.php"
> >>> 2) "logger.inc" is included into "foo.php"
> >>> See, foo.php includes its file as "../global.inc" and logger.inc
> >>> "../../global.inc" (note relative path differs)
> >>> So if you now try to run "foo.php" the require_once from "logger.inc"
> >>> would start looking for "global.inc" relatively /root/files which is
> >>> wrong.
> >>> My question is... how do I make PHPincludefiles relative to their
> >>> location not their current "include" directory?
> >> i know what you mean. there are other solutions but this one was a quick fix
> >> for me and avoids some other setup/config difference on various systems.
> >> anyway, i use the following code. if you put it into a file called
> >> relative.path.php, save the file in your php.ini include_path. from then on
> >> in all of your scripts, all you have to do is this:
>
> >>
> >> require_once 'relative.path.php';
> >> require_once $relativePath . 'global.inc';
> >> ?>
>
> >> put that in logger.inc and foo.php and nothing blows up. here's the code for
> >> relative.path.php:
>
> >>
> >> $parsedUri = dirname($_SERVER['PHP_SELF']);
> >> $parsedUri .= substr($parsedUri, -1) != '/' ? '/' : '';
> >> $relativeUri = str_replace('/', '', $parsedUri);
> >> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
> >> if ($relativePath < 0){ $relativePath = 0; }
> >> $relativePath = str_repeat('../', $relativePath);
> >> if (!$relativePath){ $relativePath = './'; }
> >> ?>
>
> >> hth.
>
> Royan,
>
> BKdotcom has the right answer. Use $_SERVER['DOCUMENT_ROOT'] to get to
> the root directory of your site, then refer to everything form there.
>
> It works on all sites, and requires no modification the php.ini file.
> And the beauty of it is, if you have a different location for the root
> directory on your development site, the code still works in both places.
>
> --
> ==================
> Remove the "x" from my email address
> Jerry Stuckle
> JDS Computer Training Corp.
> jstuck...@attglobal.net
> ==================
FYI, $_SERVER['DOCUMENT_ROOT'] does NOT work on IIS, at least not with
PHP 5.
Re: Relative paths in require_once problem (possibly all include routines)
am 02.01.2008 19:15:23 von Steve
"Logos" wrote in message
news:6b42340f-d14b-4f1e-b1aa-a79a8242da9f@s8g2000prg.googleg roups.com...
> On Dec 17 2007, 5:27 am, Jerry Stuckle
> wrote:
>> Royan wrote:
>> > Thanks Steve, thats a great idea, i've especially liked that part :)
>> >>> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
>>
>> > Unfortunately this approach works great only if you can modify PHP.ini
>> > but when you are on virtual hosting, the only way you can modify
>> > settings in PHP.ini is by calling ini_set() function which has to be
>> > invoced from somewhere. And in my case this "somewhere" is global.inc
>> > This file is meant to keep all global stuff so it has to be included
>> > into each and every file in my project, but this is the original
>> > problem -- i can'tincludeit. Seems to be a vicious circle.
>> > The only solution i can think of right now is to use the absolute path
>> > for "global.inc" in each call to require_once. Thus i can put your
>> > code that calculates relative path in "global.inc" and use it across
>> > all other files.
>>
>> > 2BKDotCom
>> >>> logger.inc doesn't need toincludeglobal.inc as long as global.inc
>> >>> has been included before logger.inc is included..
>>
>> > It appears I've made a mistake in my original post. In fact you don't
>> > have toinclude"global.inc" into foo.php, the error would persist. If
>> > you wish I can send you test files that replicate the problem
>>
>> > On Dec 17, 2:30 am, "Steve" wrote:
>> >> "Royan" wrote in message
>>
>> >>news:8769e733-17fe-4083-865c-ccd496707023@e25g2000prg.goog legroups.com...
>>
>> >>> Ok the problem is quite hard to explain, but i'll try to keep it as
>> >>> simple as i can. Imagine I have the following structure of my files
>> >>> and folders:
>> >>> /root/global.inc
>> >>> |__/files/foo.php
>> >>> |__/utils
>> >>> |__/logs/logger.inc
>> >>> When I run foo.php I get the following error:
>> >>> ==========
>> >>> Fatal error: require_once() [function.require]: Failed opening
>> >>> required '../../global.inc' (include_path='.;E:\www\root\') in E:\www
>> >>> \root\utils\logs\logger.inc on line 3
>> >>> ==========
>> >>> That error occurs because
>> >>> 1) "global.inc" is included ("required") into "logger.inc" and
>> >>> "foo.php"
>> >>> 2) "logger.inc" is included into "foo.php"
>> >>> See, foo.php includes its file as "../global.inc" and logger.inc
>> >>> "../../global.inc" (note relative path differs)
>> >>> So if you now try to run "foo.php" the require_once from "logger.inc"
>> >>> would start looking for "global.inc" relatively /root/files which is
>> >>> wrong.
>> >>> My question is... how do I make PHPincludefiles relative to their
>> >>> location not their current "include" directory?
>> >> i know what you mean. there are other solutions but this one was a
>> >> quick fix
>> >> for me and avoids some other setup/config difference on various
>> >> systems.
>> >> anyway, i use the following code. if you put it into a file called
>> >> relative.path.php, save the file in your php.ini include_path. from
>> >> then on
>> >> in all of your scripts, all you have to do is this:
>>
>> >>
>> >> require_once 'relative.path.php';
>> >> require_once $relativePath . 'global.inc';
>> >> ?>
>>
>> >> put that in logger.inc and foo.php and nothing blows up. here's the
>> >> code for
>> >> relative.path.php:
>>
>> >>
>> >> $parsedUri = dirname($_SERVER['PHP_SELF']);
>> >> $parsedUri .= substr($parsedUri, -1) != '/' ? '/' : '';
>> >> $relativeUri = str_replace('/', '', $parsedUri);
>> >> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
>> >> if ($relativePath < 0){ $relativePath = 0; }
>> >> $relativePath = str_repeat('../', $relativePath);
>> >> if (!$relativePath){ $relativePath = './'; }
>> >> ?>
>>
>> >> hth.
>>
>> Royan,
>>
>> BKdotcom has the right answer. Use $_SERVER['DOCUMENT_ROOT'] to get to
>> the root directory of your site, then refer to everything form there.
>>
>> It works on all sites, and requires no modification the php.ini file.
>> And the beauty of it is, if you have a different location for the root
>> directory on your development site, the code still works in both places.
>>
>> --
>> ==================
>> Remove the "x" from my email address
>> Jerry Stuckle
>> JDS Computer Training Corp.
>> jstuck...@attglobal.net
>> ==================
>
> FYI, $_SERVER['DOCUMENT_ROOT'] does NOT work on IIS, at least not with
> PHP 5.
don't tell jerry that...he'll have to admit that my solution works and for
the reasons i expressed why i came up with it - i.e. document_root is tied
to server config. jerry's an old man who only has theory and a lot of time
to live in a theoritical programming environment...and share his
overestimated opinions here. :)
Re: Relative paths in require_once problem (possibly all include routines)
am 02.01.2008 23:48:04 von Jerry Stuckle
Logos wrote:
> On Dec 17 2007, 5:27 am, Jerry Stuckle
> wrote:
>> Royan wrote:
>>> Thanks Steve, thats a great idea, i've especially liked that part :)
>>>>> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
>>> Unfortunately this approach works great only if you can modify PHP.ini
>>> but when you are on virtual hosting, the only way you can modify
>>> settings in PHP.ini is by calling ini_set() function which has to be
>>> invoced from somewhere. And in my case this "somewhere" is global.inc
>>> This file is meant to keep all global stuff so it has to be included
>>> into each and every file in my project, but this is the original
>>> problem -- i can'tincludeit. Seems to be a vicious circle.
>>> The only solution i can think of right now is to use the absolute path
>>> for "global.inc" in each call to require_once. Thus i can put your
>>> code that calculates relative path in "global.inc" and use it across
>>> all other files.
>>> 2BKDotCom
>>>>> logger.inc doesn't need toincludeglobal.inc as long as global.inc
>>>>> has been included before logger.inc is included..
>>> It appears I've made a mistake in my original post. In fact you don't
>>> have toinclude"global.inc" into foo.php, the error would persist. If
>>> you wish I can send you test files that replicate the problem
>>> On Dec 17, 2:30 am, "Steve" wrote:
>>>> "Royan" wrote in message
>>>> news:8769e733-17fe-4083-865c-ccd496707023@e25g2000prg.google groups.com...
>>>>> Ok the problem is quite hard to explain, but i'll try to keep it as
>>>>> simple as i can. Imagine I have the following structure of my files
>>>>> and folders:
>>>>> /root/global.inc
>>>>> |__/files/foo.php
>>>>> |__/utils
>>>>> |__/logs/logger.inc
>>>>> When I run foo.php I get the following error:
>>>>> ==========
>>>>> Fatal error: require_once() [function.require]: Failed opening
>>>>> required '../../global.inc' (include_path='.;E:\www\root\') in E:\www
>>>>> \root\utils\logs\logger.inc on line 3
>>>>> ==========
>>>>> That error occurs because
>>>>> 1) "global.inc" is included ("required") into "logger.inc" and
>>>>> "foo.php"
>>>>> 2) "logger.inc" is included into "foo.php"
>>>>> See, foo.php includes its file as "../global.inc" and logger.inc
>>>>> "../../global.inc" (note relative path differs)
>>>>> So if you now try to run "foo.php" the require_once from "logger.inc"
>>>>> would start looking for "global.inc" relatively /root/files which is
>>>>> wrong.
>>>>> My question is... how do I make PHPincludefiles relative to their
>>>>> location not their current "include" directory?
>>>> i know what you mean. there are other solutions but this one was a quick fix
>>>> for me and avoids some other setup/config difference on various systems.
>>>> anyway, i use the following code. if you put it into a file called
>>>> relative.path.php, save the file in your php.ini include_path. from then on
>>>> in all of your scripts, all you have to do is this:
>>>>
>>>> require_once 'relative.path.php';
>>>> require_once $relativePath . 'global.inc';
>>>> ?>
>>>> put that in logger.inc and foo.php and nothing blows up. here's the code for
>>>> relative.path.php:
>>>>
>>>> $parsedUri = dirname($_SERVER['PHP_SELF']);
>>>> $parsedUri .= substr($parsedUri, -1) != '/' ? '/' : '';
>>>> $relativeUri = str_replace('/', '', $parsedUri);
>>>> $relativePath = strlen($parsedUri) - strlen($relativeUri) - 1;
>>>> if ($relativePath < 0){ $relativePath = 0; }
>>>> $relativePath = str_repeat('../', $relativePath);
>>>> if (!$relativePath){ $relativePath = './'; }
>>>> ?>
>>>> hth.
>> Royan,
>>
>> BKdotcom has the right answer. Use $_SERVER['DOCUMENT_ROOT'] to get to
>> the root directory of your site, then refer to everything form there.
>>
>> It works on all sites, and requires no modification the php.ini file.
>> And the beauty of it is, if you have a different location for the root
>> directory on your development site, the code still works in both places.
>>
>> --
>> ==================
>> Remove the "x" from my email address
>> Jerry Stuckle
>> JDS Computer Training Corp.
>> jstuck...@attglobal.net
>> ==================
>
> FYI, $_SERVER['DOCUMENT_ROOT'] does NOT work on IIS, at least not with
> PHP 5.
>
It works just fine. I've got it going on my system here and on a
Windows IIS VPS.
You just have to have PHP installed as an ISAPI app - not a CGI.
BTW - the same it true under Apache, IIRC.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================