【问题标题】:Problems when including a PHP class into an included PHP file that is called by Ajax将 PHP 类包含到 Ajax 调用的包含 PHP 文件中时出现问题
【发布时间】:2016-12-10 01:39:32
【问题描述】:

我的现场设置如下:

  • 我在我一直使用的服务器上对 PHP 文件(“ajax.php”)进行了 Ajax 调用,它工作正常。
  • 现在第一次指示 php 文件在其一个函数中包含第二个 PHP 类:

    if ($stmnt) {
        require_once('path/to/statement.class.php');
        $statement = new STATEMENT();
    }
    
  • 第二个类(“statement.class.php”)还包括与第二个类在同一文件夹中的第三个类,并尝试对其进行扩展:

    require_once('tcpdf_include.php');
    class MYPDF extends TCPDF {...}
    class STATEMENT {
        public function __construct() {...}
    }
    

我在语句类上运行了很多测试,当我直接从浏览器调用它时,我没有收到任何错误。它正确地包含了 tcpfd 类并对其进行了扩展,我可以按预期使用它。

但是,当使用上面提到的 Ajax 调用来指示“ajax.php”作为中间人时,服务器突然声称它找不到文件“tcpfd_include.php”以包含 “statement.class.php”中的错误,因此无法实例化或扩展其类 TCPDF:

执行简单的require_once('tcpdf_include.php'); 时出现以下错误:

致命错误:在第 10 行的 /home/[userxyz]/public_html/[ajax.php path]/path/to/statement.class.php 中找不到类“TCPD” p>

(第 10 行是我尝试扩展类的位置,这意味着它没有抱怨包含不成功,而是抱怨现在应该包含的类的不成功扩展)

如果我将包含更改为 include('tcpdf_include.php') or die ('dead');,我会收到通过 ajax 返回给我的不同错误消息:

警告:include(1):打开流失败:/home/[userxyz]/public_html/[ajax.php path]/path/to/statement.class.php 中没有这样的文件或目录第 4 行

警告:include(1):打开流失败:/home/[userxyz]/public_html/[ajax.php path]/path/to/statement.class.php 中没有这样的文件或目录第 4 行

警告:include():在 /home/[userxyz]/ 中打开 '1' 以包含 (include_path='.:/usr/lib/php:/usr/local/lib/php') 失败public_html/[ajax.php 路径]/path/to/statement.class.php 在第 4 行

致命错误:在第 10 行的 /home/[userxyz]/public_html/[ajax.php path]/path/to/statement.class.php 中找不到类“TCPD” p>

这现在让我相信相对路径不知何故搞砸了,所以我尝试了:

echo (file_exists($_SERVER['DOCUMENT_ROOT'].'/[ajax.php path]/path/to/tcpdf_include.php')?"true":"false");

就在麻烦的包含上方,它吐出true,即使是通过Ajax。 但即使我将包含更改为:

include_once ($_SERVER['DOCUMENT_ROOT'].'/[ajax.php path]/path/to/tcpdf_include.php') or die ("file doesn't exist");

我得到同样的错误,文件不存在,无法打开流,等等等等。

我在这里错过了什么?

【问题讨论】:

  • 这个文件中有什么:tcpdf_include.php?另请注意,您在提供的代码中拼错了文件名:require_once('tcpfd_include.php');
  • 感谢您指出这一点。但这个问题不在我的代码中。 TCPDF 类提供了在服务器上创建 PDF 文件的功能(参见“tcpdf.org"
  • [ajax.php path] 应该是什么意思?如果那是指你的脚本file,那么它怎么会在文件系统路径的中间呢?您能否显示完整的真实路径,而不替换它的一部分?
  • 对不起,我试图让它变得不那么复杂,而不是更复杂:public_html/create/tcpdf/examples/tcpdf_include.php 是完整路径 [ajax.php 路径] 只是应该意味着这是我的 ajax.php 文件所在的文件夹。
  • imo,始终使用绝对文件路径。您可以在绝对文件路径中使用相对目录。当您要访问同一目录中的文件时。例如require_once(__DIR__ .'/path/to/statement.class.php');。要访问一个目录,然后执行:require_once(__DIR__ .'/../path/to/statement.class.php');。等等。这些总是有效的,因为它们不使用“当前工作目录”。使用 getcwd(); 查看 PHP 将在哪里查找相关文件。

标签: php ajax class subclass


【解决方案1】:

好的,我在浪费了几个小时后终于解决了问题: 事实证明,@Ryan 的答案是解决方案的要点。但是,我在错误的地方寻找问题。

我将 B.php 包含在 A.PHP 中,将 C.PHP 包含在 B.PHP 中,当这不起作用时,我错误地认为 C.PHP 没有正确包含在 B.PHP 中。我不认为我试图在 B.PHP 中扩展的类实际上不在 C.PHP 内部,而是在 D.PHP 或 E.PHP 内部,因为 TCPDF 类自己包含相对路径。通过尝试从 C.PHP 所在文件夹之外的目录中包含整个 shebang,我导致了整个 TCPDF 包中的子包含问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2012-11-02
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多