Set paths for PHP includes on localhost - php

My new ecom project is in the ecom folder on my mac located here:
"Applications/MAMP/htdocs/ecom"
I access it in the browser by typing localhost/ecom
Problem:
My script fails when I want to include a file, like this:
require('/includes/header.html');
It works when I write it like this:
require('/Applications/MAMP/htdocs/ecom/includes/header.html');
Is there a PHP function I can use to change a setting so that the top version works? Keeping in mind that I have other projects, localhost/wiki, localhost/social that should work in a similar manner.
Many thanks

require('/includes/header.html');
This is an absolute path. If you want to include a PHP file with a path relative to your current file and you don't know or don't care about the full path, use a relative path that does not begin with a /.
Assuming your PHP file is located in /Applications/MAMP/htdocs/ecom and header.html is located in /Applications/MAMP/htdocs/ecom/includes then you need the following code:
require('includes/header.html');

You should ise relative pathes.
/ means the directory beside of /Application
includes/header.html (without the startin /) means the folder relative to my current position. Normally beside the index.php

This is the simple idea use in Joomla / Wordpress / Cakephp & other open source.
Use:
require( dirname( __ FILE __ ).'/includes/header.php');
Let me know if this works.
Thanks,
Munjal

Related

Relative Path Basics

Although I have a fair idea of relative path but I am a little confused while using this particular relative path in a program. Please someone guide me through. I have the following directory structure:
The problem here is that I want to include config.php file in left.php, for that I have given a relative path, include(../../layout/config.php); but somehow this is not being included and the relative path that I have to use is include(../layout/config.php);. Can someone please explain why is that so? Because my knowledge says that I will have to leave includes->admin and then enter layout.
In PHP it's the working direcory that is used as the main path.
All relative paths originate from that folder.
As you wrote in comments you use index.php which is one folder lower than left.
I assume you are in index and include left.php, this does not update the working directory.
Your working directory is still "admin".
You can find out what the working directory is using echo getcwd();
http://php.net/manual/en/function.getcwd.php
As I wrote in comments you can use include($_SERVER['DOCUMENT_ROOT'] . "/Electronix_Store/electronix/layout/config.php"); to use full path instead.
This is easier if the files and folders are in the same position all the time.
My advise is to only use relative paths if you are working with day "user/123/" -> some folder structure in there.

php paths differ between ajax use and php use

I just stumbled upon a (at least for me) new weird behavior of paths while using php functions with pure php or ajax calls.
If I use just php the path in the php function is like:
require_once('wp-content/themes/xxx/tcpdf/tcpdf.php');
but if I use the exact same function with an ajax call, the path needs to be like this to make it work:
require_once('../tcpdf/tcpdf.php');
Can you explain me why this is so? Thank you very much!
The reason that you are getting that behavior is because all the includes are occuring from the root of the wordpress install so you are saying do down the directory structure several layers before you get to the file. Breaking it down it does like this.
wp-content/ Go down one directory level from the file i'm in
themes/ Then go down into the themes directory
xxx/ Then go to the xxx directory
tcpdf/ Then go to the tcpdf directory
tcpdf.php This is the file you want
When you are doing the second include you are in a directory that shares a parent with wp-content/themes/xxx/tcpdf/ so what you are saying is
../ Go up one directory level
tcpdf/ Go into the tcpdf directory
tcpdf.php This is the file you want
I guess when you are using it without an AJAX call, you are including it from some other file, that can make the difference.
However I recommend storing the application root directory in a constant (e.g. ROOT) and then you include everything relative to ROOT.
Redefine the include path to set_include_path ( APP_ROOT ). By doing so, ALL includes/requires will be relative to the application root that you will define in the constant APP_ROOT.
PHP normally has the current directory as include path, which can lead to problems like this you're having.

PHP Relative paths like ASP

This works
<?php include("inc/c.php")?>
But in a folder past this, this does not work
<?php include("../inc/c.php")?>
I have to do
<?php include("/var/web/public_html/etc/inc/c.php")?>
I know in ASP you can enable virtual paths and directories. Is this the same with PHP?
If you're including a file from a folder, all includes are relative to the includer's file.
Therefore, the same code should work for the file in the sub-folder:
<?php include("inc/c.php")?>
You can use realpath(dirname(__FILE__)) to include files relatively to current file:
include(realpath(dirname(__FILE__).'/../inc/c.php'));
You can add directories to PHP's include_path directory. When you specify a relative file name, PHP will look for that file relative to all directories specified in the include_path.
Take a look at http://php.net/manual/en/function.set-include-path.php#example-488.
use
dirname(__file__)
it will return you path of current directory.
But in a folder past this, this does not work
Nope, it does work.
I know in ASP you can enable virtual paths and directories. Is this the same with PHP?
Yes. But whole virtual path thing has nothing to do with your case.
This is not PHP problem. This is developer's problem who is using wrong path.
To make your code fool-proof, always use absolute paths. Build paths not from current location but from the site root. So, it will be all the same in the ANY page on your site.
Most general way would be
include $_SERVER['DOCUMENT_ROOT']."/etc/inc/c.php";

php - header file - relative paths problem

I have a web application in php. I have a header.php file where I have the opening html tag, meta data, css,js file includes.
I have multiple folders in this application. I have given relative paths to the css,js files in the header.php. The problem I am facing is, when I include this header.php file in some other file say, ./test-folder/my-file.php, the relative paths break.
so to solve this i have given absolute paths where ever needed. But I have to change these paths every time I upload on to server. Can this be done in any other way?
Thanks in advance
Anji
Do not use static value for path instead define a constant for document root and use that constant
define('ROOT_PATH',$_SERVER['DOCUMENT_ROOT']);
While including files you can use this constant.
include ROOT_PATH.'/some_dir/file.php';
You have bad architecture in your application. Try to search info about MVC.
This answer may be useful: https://stackoverflow.com/questions/5721353/what-is-good-neat-architecture-in-programming/5793753#5793753
So:
change architicture,
use autoload
Relative paths are relative to the current working directory (cwd). If you just include another file that cwd does not change.
If you want to have paths that are (somewhat) relative to the current script file path you can use e.g.
require dirname(__FILE__).'/some_dir/file.php';
or as of php 5.3
require __DIR__.'/some_dir/file.php';
see also: http://docs.php.net/language.constants.predefined
If I understood your question right, you just would like to know the root folder your application without the need to hardcode it.
The easier way is to define a constant as Shakti has answered.
However, you could actually have a file with a unique name such as "foobar" in the root folder, then walk up the tree from current directory until you find foobar.

PHP include file

i have two files:(localhost/template/)
index.php
template.php
each time when i create an article(an article system is what i'm trying to do),i create a folder and then i copy the index.php in that folder. I want to include template php in index.php but as a static url('cause the articles will be like a folder-subfolder/subfolder/.. structure )
i tried: include('localhost/template/template.php') with no result. how should i include it? thanks
The include method works on the file system path, not the "url path". Solution is to either
Give it an absolute path.
-- include('/some/path/to/template.php');
Change the relative path so it is correct after each copy you create.
-- include('../../template.php');
Change the include path of PHP so that the file is in, well, the include path.
-- Can be done either in the php.ini file, in the .htaccess file or with the set_include_path function. (Depending on how much you want to set it for, and what you have permission for)
You could include it relative to the current directory, like so:
require_once(dirname(__FILE__) . '/template.php');
dirname(FILE) will translate to the directory of the current script (index.php) and the line above will append '/template.php' resulting in the full path to the template.php side-by-side to the index.php file.
I find it best to include files this way vs without a full path to avoid issues with the PHP search path, for example. It's very explicit this way.
UPDATE: I misunderstood the original question. It sounds like template.php isn't copied, only index.php is. So you'll have something that could be like:
template/template.php
template/index.php (just a template)
foo/bar/index.php
foo/bar2/index.php
Since people can hit the foo/bar/index.php for example without funneling through a central script, you'll have to somehow find the template no matter where you are.
You can do this by setting the PHP include_path, for example through a .htaccess on a Apache server:
php_value include_path ".:/home/<snip>/template"
Then in each index.php you can include template.php and it'll search the current directory first, then try your template directory.
You could also compute the relative path when copying the script and put an include in there with the proper number of '..' to get out (e.g. '../../template/template.php'). It's kinda fragile, though.
You don't want the "localhost" in there. Includes work using the actual path on your server.
So you can either use relative ones such as posted above, or absolute in terms of server so this could be "/opt/www/" on linux or "c:\Program Files\Apache\htdocs" on windows. This will be different from system to system so to find out yours use the dirname(__FILE__) technique shown by wojo.
If you're trying to include the file as an url, you'll need to start it with http:// and have allow_url_include set to true in PHP settings. This is highly discouraged as it opens doors for security breaches.
Instead, you should either add localhost/template to your include path or use relative urls like include('../template.php').
The path looks wrong, you should include it with a path relative to where the calling file is, e.g. include('template/template.php'); or include('../template/template.php');

Categories