【发布时间】:2014-08-14 01:37:54
【问题描述】:
首先,如果它是相关的,它在会话处理程序中。这个函数是写入数据库的函数,并与我的其他函数一起传递给session_set_save_handler
session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy', 'sess_gc');
我有这段代码...
$qid = "select count(*) as total
from zen_sessions
where sesskey = '" . $key . "'";
if(!class_exists('DB'))
require_once dirname(dirname(__FILE__)).'/class/DB.class.php';
var_dump(new DB()); //this is line 109
$total = DB::select_one($qid);
条件和var_dump 用于测试。奇怪的是,有时它可以正常工作,而另一些却给我一个错误:
Fatal error: Class 'DB' not found in /path/to/file/session_functions.php on line 109
我不知道这怎么会在 require 而不是 var_dump 时崩溃,为什么只是有时?
提前感谢您的任何见解。
编辑——对评论/问题的回应:
以下代码的结果
var_dump(class_exists('DB', false));
var_dump(is_file(dirname(__DIR__).'/class/DB.class.php'));
是:
bool(false) bool(true)
在尝试要求它之前和要求之后的相同结果(或者当它没有给我错误时为真) 看起来像:
bool(true) bool(true) object(DB)#3 (0) { }
前一个代码块是大约每 5 个页面加载一次的结果,而错误是其他 4 个的结果。
Edit2 -- 新发现。
更奇怪的是根据manual我应该永远不会看到这些调试语句或错误
注意:
“写”处理程序直到输出流被执行后才被执行 关闭。因此,“写”处理程序中调试语句的输出 永远不会在浏览器中看到。如果需要调试输出, 建议将调试输出写入文件。
编辑 3 - 为清楚起见的注释:
DB 类应该已经自动加载(并且在应用程序的其他任何地方)class_exists 和 require 只是用于测试目的。
编辑 4 - 堆栈跟踪
我决定尝试在找不到该类以查看堆栈跟踪时抛出异常,这就是我得到的
Fatal error: Uncaught exception 'Exception' with message 'DB Class Not Found.'
in /path/to/file/session_functions.php:108
Stack trace: #0 [internal function]: sess_write('074dabb967260e9...', 'securityToken|s...')
#1 {main} thrown in /path/to/file/session_functions.php on line 108
【问题讨论】:
-
如果您改为使用
class_exists('DB', false)会怎样? +var_dump(is_file(dirname(dirname(__FILE__)).'/class/DB.class.php'));+__DIR__而不是dirname(__FILE__) -
@zerkms 看到我的编辑。结果几乎一样。
-
警告您的代码容易受到 sql 注入攻击!
-
@DanielA.White 当你不知道
$key来自哪里时,这是一个相当大的飞跃。不过感谢您的关注。 -
你在使用“命名空间”吗?从不工作的代码的第一原则开始......经常为“DB”执行“class_check”。在您认为应该加载的点之后立即开始。然后将该检查移向引起麻烦的代码。如果找不到“DB”类,则抛出异常。始终确保在使用类之前显式加载它们。使用“自动加载器”或“include_once”。如果在程序的大多数运行中使用该类,则始终无条件加载该类。