【问题标题】:Warning: require_once(./mailer/class.phpmailer.php): failed to open stream:警告:require_once(./mailer/class.phpmailer.php):打开流失败:
【发布时间】:2019-12-08 17:17:21
【问题描述】:

树:

--myproject
----mailer
-------class.phpmailer.php
----test
-------index.php
----site.php
----class.php
----db.php
----index.php

index.php:(两者)

<?php 
require_once '../site.php';
?>

site.php:

<?php
require_once "class.php";
?>

class.php

<?php
require_once 'db.php';
require_once('./mailer/class.phpmailer.php');
?>

当我访问测试时,它显示:

警告:require_once(./mailer/class.phpmailer.php):打开失败 流:C:\wamp\www\myproject\class.php 中没有这样的文件或目录 在第 3 行


致命错误:require_once(): 未能打开所需的 './mailer/class.phpmailer.php' (include_path='.;C:\php\pear') in C:\wamp\www\myproject\class.php 在第 3 行


我也试过include_once,但同样的错误!

【问题讨论】:

  • 首先,如果site.php和index.php都在同一个目录下,你为什么要require_once '../site.php';

标签: php require-once include-once


【解决方案1】:

使用$_SERVER['DOCUMENT_ROOT'] 并包含完整路径。

例如,您可以在两个 index.php 文件上执行以下操作:

require_once($_SERVER['DOCUMENT_ROOT'].'/site.php');

还有site.php

require_once($_SERVER['DOCUMENT_ROOT'].'/class.php');

还有class.php

require_once($_SERVER['DOCUMENT_ROOT'].'/db.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/mailer/class.phpmailer.php');

原因是什么?因为$_SERVER['DOCUMENT_ROOT'] 会动态地将服务器上的完整文件路径返回给文档根目录。这就像说(假设你的文档根是/www/username/public_html):

require_once('/www/username/public_html/db.php');

这将始终相同 - 直到您更改到新的目录位置或服务器。发生这种情况时,不必重写每个require_once(),因为您使用了$_SERVER['DOCUMENT_ROOT'],PHP 将为您完成这项工作。

与绝对路径相比,使用相对路径可能会令人困惑,因为它是相对于当前位置的。

【讨论】:

    【解决方案2】:

    让我试着回答这个问题。

    在文件夹 test 下的 index.php 文件中,您可以使用如下代码:

    <?php 
    require_once '../site.php';
    ?>
    

    在 site.php 上你可以使用如下代码:

    <?php
    require_once "class.php";
    ?>
    

    在class.php上你可以添加如下代码:

    <?php
    require_once 'db.php';
    require_once('mailer/class.phpmailer.php');
    ?>
    

    在文件夹 myproject 根目录的 index.php 文件中,您可以使用如下代码:

    <?php 
    require_once 'site.php';
    ?>
    

    希望这个技巧可以帮到你。

    【讨论】:

      【解决方案3】:

      你打电话给

      require_once('./mailer/class.phpmailer.php');
      

      从index.php里面,所以文件在上面两层。

      改变

      require_once('./mailer/class.phpmailer.php');
      

      require_once('../mailer/class.phpmailer.php');
      

      更新

      刚刚意识到您需要两个 index.php 文件都可以工作。这不是最漂亮的解决方案,但您可以这样做:

      /test/index.php

      <?php
      
      $nested = true;
      require_once '../site.php';
      
      ?>
      

      /index.php

      <?php 
      
      $nested = false;
      require_once 'site.php';
      
      ?>
      

      这个新的“嵌套”变量将确定文件是在目录内还是在基础上。

      编辑您的 class.php 使其如下所示:

      <?php
      
      require_once 'db.php';
      
      if ($nested == true)
      require_once('../mailer/class.phpmailer.php');
      
      elseif ($nested == false)
      require_once('./mailer/class.phpmailer.php');
      
      ?>
      

      这应该可以解决两个文件中的问题。

      【讨论】:

      • @tusa 检查我的更新,这应该可以解决您的问题。
      猜你喜欢
      • 2011-10-17
      • 2014-10-21
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多