这是我的一段PHP代码:
<?php
require_once 'php/Classes/User/UserDataBaseManager.php';
require_once 'facebook/src/facebook.php';
?>
当我尝试在http:/mydomain/myfile.php中浏览此代码时,浏览器会返回错误500.
Apache日志说:
[Wed Apr 18 20:38:07 2012] [error] [client 190.50.81.189] PHP Fatal error: require_once() [<a href='function.require'>function.require</a>]: Failed opening required 'php/classes/DataBase/DataBaseManager.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/virtuales/blyxo.com/php/Classes/User/UserDataBaseManager.php
解决方案?
答案 0 :(得分:2)
对我来说这是因为UserDatabaseManager.php文件试图包含DataBaseManager.php,但它提供了错误的路径。您的apache错误表示它将首先查看.
,即当前目录,然后/usr/share/pear
然后/usr/share/php
您的DataBasemanger.php文件不在最后两个文件中。当它试图查看当前目录时,它包含您的相对路径。因此,当您的UserDataBaseManager.php文件(位于php/Classes/User/
中)提供该路径时,apache最终会在php/Classes/User/php/classes/DataBase/DataBaseManager.php
有几种方法可以解决这个问题。您可以获取文档根目录并将其添加到每个包含这样的
中$root = $_SERVER['DOCUMENT_ROOT'];
require_once($root . "/php/classes/DataBase/DataBaseManager.php");
或者如果此应用程序位于受控环境中并且您可以编辑php.ini文件,则可以定义包含路径以同时查看/var/www/virtuales/blyxo.com/php/Classes/
并仅包含该文件
require_once("Database/DataBaseManager.php");
更好的解决方案可能是定义一个__autoload函数,每次尝试实例化一个新对象时都会调用该函数,并让它使用一些逻辑来查找要包含的文件。这个解决方案需要更多的重组,但你可能会考虑它。以下是定义您自己的自动加载器http://us2.php.net/manual/en/function.autoload.php
的文档我知道还有其他方法可以做到这一点。让我知道什么对你有用!
答案 1 :(得分:0)
尝试
echo getcwd();
找到解决任何路径相关问题的工作路径。
答案 2 :(得分:0)
你可以尝试
<?php require_once(dirname(__FILE__) . "php/Classes/User/UserDataBaseManager.php");?>
答案 3 :(得分:0)
我检查了 Apache error.log
,发现 dbname
中的 dbconn.php
存在问题,
PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1049] Unknown database 'study_db'
然后我更正了数据库名称,它开始工作了。