我可以在PHP中存储一个可以在所有文件中访问的变量,而不包含另一个文件吗?

时间:2014-08-03 13:43:13

标签: php mysql

这个想法是存储测试网站的基地址,它实际上是主域内的子文件夹(例如:www.mydomain.com/mywebsite/)。获得此字符串值并不困难。我只需要在索引页面中使用$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']

但我想要的是存储此值并使用它来包含其他文件。因此,包含存储变量的文件以获取完整路径是没有意义的。我想使用它,类似于$_SESSION["someName"]。这样做的问题在于,出于安全原因,我将session_start()包装在函数secure_session_start()中,该函数位于另一个文件中,并且在被调用之前需要包含。 / p>

因此,简而言之,我需要在单个文件included()required()之前获取此变量的值,之后它已经从" index.php&#设置了39;页。

如果我可以使用session_start(),那么就可以存储在$ _SESSION中。但我不能......

修改: -

这是文件的层次结构:

enter image description here

现在,Public_html指向WWW.MYDOMAIN.COM。那是我的网站。

我目前正在为我的客户创建一个网站:WWW.CLIENTWEBSITE.COM。但我只是在网站完成后才托管它。 但就目前而言,客户可以看到进展情况,WWW.MYDOMAIN.COM/CLIENTWEBSITE /

因此,当我开发网站时,我需要使用相对路径' (例如:../ somefolder / something.etc)或者我可以使用' WWW.MYDOMAIN.COM/CLIENTWEBSITE /'为URL,require等添加前缀,但是一旦我将它们的域名托管到WWW.CLIENTWEBSITE.COM,它就会改变。但我并不想最终改变所有页面中的每个网址。所以我想要一个具有某种超全局范围的变量,它可以存储这个base-url,我需要只更改一次。

我在相对路径方面遇到的问题很少。所以,我想使用完整的URL链接到文件。这就是我提出这个问题的原因。

我面临相对路径的问题: (这不是实际问题,但我正在扩展它)

的index.php

<?php
include_once 'includes/bootstrap_functions.php';

/* ...functions following it... */

bootstrap_functions.php

<?php
include_once "../common/dbhandler.php";

function someDBFunction(){
    global $DBH;
    .
    .
    .
/* ...functions following it... */

dbhandler.php

<?php

include_once "psl-config.php";

$DBH = new PDO("mysql:host=".HOSTNAME.";dbname=".DBNAME, DBUSER, DBPASS);

/* ...functions following it... */

PSL-config.php中

<?php

define("HOSTNAME","localhost");
define("DBNAME","somename");
define("DBUSER","someuser");
define("DBPASS","somepassword");

然后当我运行index.php时,我得到了这个:

enter image description here

4 个答案:

答案 0 :(得分:2)

许多脚本使用常量作为原始脚本的基本URL /路径。把这个放在你的包含之前:

define( "URL", $_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME'] );

现在您可以在这些文件中使用它们,但它们无法更改它。

$img = URL . "/image.png";

我不确定HTTP_HOST和SCRIPT_NAME是否适合您的使用,但这不是问题。

注意:请勿使用会话/ cookie来存储它。这很奇怪。除非路径是随机的。如果您需要在多个脚本上使用相同的变量,则需要进行结构更改。考虑如果用户登陆首页以外的页面可能会发生什么。

更新

引入了一个问题,即定义URL的脚本实际上并不在“文档根目录”中,实际上域名从localhost更改为example.org

注意:我在这个答案中无法使用mydomain dot com。请改用example.org!

如果您的脚本位于子文件夹中,则有两种选择。使用dirname向上浏览两个文件夹,或通过str_replace删除子文件夹。如果将来重命名文件夹/脚本,第一个选项不太可能中断。

Input: http://example.org/subfolder/include/common/common_functions.php
Target http://example.org/subfolder/

选项1:向上两个文件夹(和条文件名)

$siteurl = 'http://' .  $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
$siteurl = dirname($siteurl); // removes "common_function.php"
$siteurl = dirname($siteurl); // removes "common/"
$siteurl = dirname($siteurl); // removes "include/"
define( "URL", $siteurl ); // result: http://example.org/subfolder/

选项2:删除相对文件名

$siteurl = 'http://' .  $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
$siteurl = str_replace('include/common/common_function.php', '', $siteurl);
define( "URL", $siteurl ); // result: http://example.org/subfolder/

在这两个选项中,我们都使用$_SERVER['HTTP_HOST']。截至this answer's definition,HTTP_HOST是访问者看到的主机名。这应为localhostexample.org为您的客户。我鼓励你自己测试一下。

在这两个选项中,$site_url的使用是完全可选的,因此更容易阅读。如果您不喜欢干净的代码,可以将它们组合在一起:

define( "URL", dirname(dirname(dirname('http://' .  $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] ))) );

路径VS网址

我上面的示例使用的是URL。这些是您发送到浏览器的内容,尤其是图像,JavaScript和CSS文件。例如:<img src="<?php echo URL; ?>/images/my-image.png">

如果要包含其他脚本,则不希望使用URL。你想要一条路径。

$sitepath = __FILE__; // /var/www/example.org/include/common/common_functions.php
$sitepath = dirname( $sitepath ); // removes common_functions.php
$sitepath = dirname( $sitepath ); // removes common/
$sitepath = dirname( $sitepath ); // removes include/
define( "PATH", $sitepath ); // /var/www/example.org/

甚至可能不需要使用您的路径,但您可以定义它:

include( PATH . '/include/common/another-script.php' );
// Alternatives relative to current script:
include( 'another-script.php' ); // When the current script is in the same folder
include( 'common/another-script.php' ); // Current script is in the "include" folder
include( '../rare/another-script.php' ); // "rare" folder is next to "common", current script is in "common"

答案 1 :(得分:0)

您可以使用php.ini directive配置auto_prepend_file,{{1}}会在每次网络请求之前自动包含<{1}}

答案 2 :(得分:0)

这是我找到的一个选项,使用setcookie("root","www.mydomain.com/subfolder/");,然后在您需要的任何地方使用echo $_COOKIE["root"],无论页面如何。

这种方法非常出色,但对敏感数据来说并不安全。

这种方法的不利之处在于,cookie将与客户端和服务器之间的所有类型的通信一起发送,这使得页面加载速度变慢,特别是如果cookie存储了一些大数据(例如:image)

答案 3 :(得分:0)

引用Best Practices in PHP上的内容:

  

使您的应用程序位置无关

     

当包含文件嵌套并驻留在不同的情况下,PHP在某些情况下会出现问题   文件夹,目前还不清楚文件的目录级别   包括在内。可以通过使用绝对路径名或使用来解决此问题   $ _SERVER [&#39; DOCUMENT_ROOT&#39;]作为起点。然而,这使你的   代码位置依赖 - 如果将其向下移动它将不再运行   你的目录结构一级。对于cource,我们不喜欢这样。一世   找到了解决这个问题的方便方法。顶级页面   (浏览器调用的那个)需要知道相对   应用程序根目录的路径。不幸的是没有这样的   PHP中的函数和webapp上下文概念完全不存在   PHP。所以我们无法自动确定应用程序根目录   在所有情况下都是可靠的(真的不可能。不要尝试。   它不值得努力。)让我们定义一个名为的全局变量   每个包含顶层的目录中的包含文件中的$ ROOT   页面。必须包含include文件(称为root.inc.php)   任何其他包含文件之前的页面逻辑。现在你可以使用$ ROOT了   要引用的变量包含具有确切路径的文件!

     

示例:我们在/ admin / pages /中放置了页面。 $ ROOT变量   因此必须设置为$ ROOT =&#39; ../..' ;;。包含的页面逻辑   该文件夹中的页面将引用其包含文件,如   require_once(&#34; $ ROOT / LIB / base.inc.php&#34);

这肯定使用include,并且文件在所有目录中重复,但是是一种非常有用的方法。第一段解释了我所处的确切困境。第二段是确保你可以在我使用的所有php文件中使用相同代码并且仍然可以自由移动的好方法不同目录中的文件,重命名目录,甚至更改域......非常简单但有效!!

我确实考虑过根据地址&#39;在index.php文件附近的文件中。但要包含它,您仍需要知道当前文件的位置。我从没想过要在所有目录中重复这个文件。