【问题标题】:Reading from file (require)从文件中读取(需要)
【发布时间】:2016-05-04 04:14:54
【问题描述】:

我有这样的东西:http://i.imgur.com/KPulyBg.png,我目前正在处理“admin”文件夹,在里面我有“admin.php”,但问题是我想从中读取“core/init.php”那里。现在我在 admin.php 中有这个

<?php
require '../includes/header.php';
?>

<?php
$user = new User();
if(!$user->isLoggedIn()){
    Redirect::to(404);
}
else if(!$user->hasPermission('admin')){
    Redirect::to(404);
}
?>
<div id="content">

</div>

<?php
require '../includes/footer.php';
?>

在“includes/header.php”里面我有 php require_once 'core/init.php';但我为我的管理页面得到了这个:

Warning: require(core/init.php): failed to open stream: No such file or directory in C:\xampp\htdocs\OOP\includes\header.php on line 2

Fatal error: require(): Failed opening required 'core/init.php' (include_path='.;C:\xampp\php\PEAR') in C:\xampp\htdocs\OOP\includes\header.php on line 2

我知道我必须添加 ../,但随后我在 index.php 页面上遇到了该错误,该页面必须在没有该页面的情况下运行,因为它不在文件夹内,它仅从包含文件夹运行页眉和页脚。

【问题讨论】:

    标签: php require


    【解决方案1】:

    header.php HEADER_DIR 基于__FILE__ 变量中定义。其中__FILE__ 是 php 的魔法常量之一,请参阅此处了解更多信息:http://php.net/manual/en/language.constants.predefined.php

    define('HEADER_DIR', dirname(__FILE__)); 
    
    // then use it in all includes 
    require HEADER_DIR . "/../core/init.php";
    require HEADER_DIR . "../some_other_folder/some_file.php";
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用 $_SERVER["DOCUMENT_ROOT"] 而不是 "../" 我认为这将解决您关于 require 操作的问题。

      <?php
      require ($_SERVER["DOCUMENT_ROOT"].'/includes/header.php');
      ?>
      
      <?php
      $user = new User();
      if(!$user->isLoggedIn()){
          Redirect::to(404);
      }
      else if(!$user->hasPermission('admin')){
          Redirect::to(404);
      }
      ?>
      <div id="content">
      
      </div>
      
      <?php
      require ($_SERVER["DOCUMENT_ROOT"].'/includes/footer.php');
      ?>
      

      您可以在此处找到有关 DOCUMENT_ROOT 密钥的参考:http://php.net/manual/en/reserved.variables.server.php

      【讨论】:

        【解决方案3】:

        正如documentation 解释的那样:

        根据给定的文件路径包含文件,如果没有给出,则根据指定的include_path

        ...

        如果定义了路径——无论是绝对路径(在 Windows 上以驱动器号或 \ 开头,在 Unix/Linux 系统上以 / 开头)还是相对于当前目录(以 . 或 .. 开头)——include_path 将完全忽略。

        这如何应用于您的代码?

        require_once 'core/init.php'; - PHP 搜索来自php.ini 指令include_path 的所有路径。它将core/init.php 附加到列表中的每个路径,并检查以这种方式计算的路径是否存在。很可能不会。

        require_once './core/init.php'; - include_path 没关系;将提供的相对路径(core/init.php)追加到当前目录,获取文件的路径;

        解决办法是什么?

        上述方法在实践中都不起作用。

        使用子目录包含文件的最安全方法是使用魔术常量__DIR__ 和函数dirname() 来计算正确的文件路径。

        require '../includes/header.php';
        

        变成

        require dirname(__DIR__).'/includes/header.php';
        

        require_once 'core/init.php';
        

        变成

        require_once dirname(__DIR__).'/core/init.php';
        

        因为__DIR__是当前文件(includes/header.php)所在的目录。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-07
          • 1970-01-01
          • 2016-08-25
          • 2014-01-23
          • 2014-06-10
          • 2021-02-10
          • 2012-11-22
          • 1970-01-01
          相关资源
          最近更新 更多