You are here: Re: Relative paths in require_once problem (possibly all include routines) « PHP Programming Language « IT news, forums, messages
Re: Relative paths in require_once problem (possibly all include routines)

Posted by Jerry Stuckle on 01/03/08 17:39

Logos wrote:
> On Jan 2, 9:20 pm, Jerry Stuckle <jstuck...@attglobal.net> wrote:
>> Logos wrote:
>>> On Jan 2, 3:48 pm, Jerry Stuckle <jstuck...@attglobal.net> wrote:
>>>> Logos wrote:
>>>>> On Dec 17 2007, 5:27 am, Jerry Stuckle <jstuck...@attglobal.net>
>>>>> 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" <no....@example.com> wrote:
>>>>>>>> "Royan" <romayan...@gmail.com> wrote in message
>>>>>>>> news:8769e733-17fe-4083-865c-ccd496707023@e25g2000prg.googlegroups.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.
>>> Unfortunately our server is hosted, so I can't fiddle the install.
>>> Also, for a newbie like myself, that would be a fairly arcane bit of
>>> knowledge about server install/configuration.
>> Then get a new host. Anyone who runs PHP as a CGI isn't worth the cost
>> of hosting.
>>
>>> I've been using 'require_once(dirname(__FILE__)."/../
>>> someaught.php")'...likely there's some hideous downside to doing it
>>> that way, but it certainly has saved me some headaches trying to
>>> resolve dependency calls when a file includes a file that includes a
>>> file...I tried using Maarten Manders' smartloader class with it's
>>> __autoload trick, but couldn't get it to work. :P
>>> Tyler
>> Other than the fact you are now path-dependent? That is, you can't move
>> the file to another directory without having to modify your code?
>>
>> And I don't use __autoload. It can have significant overhead.
>>
>> --
>> ==================
>> Remove the "x" from my email address
>> Jerry Stuckle
>> JDS Computer Training Corp.
>> jstuck...@attglobal.net
>> ==================
>
> mmmm, path dependency...
>
> So, what do you recommend instead, then, that wouldn't use
> document_root? Saying 'switch hosts' doesn't help much, as it's not
> gonna happen.
>

Why now? If you can't get what you need from your current host, there
are thousands who will give you want you need.

You could parse the URL being used and count the number of directories
down you are. Then you could parse __FILE__ to get your absolute
directory. Then back up to get to your root directory. But that has
its own problems, and can leave you open to hacking attempts.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstucklex@attglobal.net
==================

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация