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 Logos on 01/03/08 13:58

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.

 

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

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