我有一个名为Hello.php
的控制器,它只有一个名为world
的方法。控制器在construct
时间和world
函数echo hello world
启动事务并提交事务。
class Hello extends CI_Controller {
public function __construct() {
parent::__construct();
$this->db->trans_begin;
}
public function world(){
echo "hello world";
$this->db->trans_commit;
}
}
请注意:我的数据库已从config / autoload.php自动加载$autoload['libraries'] = array('database');
从config/routes.php
我已将404错误路由到名为bad_parameters.php的控制器$route['404_override'] = 'bad_parameters'
;
class Bad_parameters extends CI_Controller {
public function __construct() {
parent::__construct();
}
public function index(){
echo "before rollback - ";
$this->db->trans_rollback();
echo "after rollback";
}
}
现在我要做三件事:
hello/world
- 期待Hello World
然后发送COMMIT hello/fake
- 期待404路由,然后before rollback - after rollback
fake/fake
- 期待404路由,然后before rollback - after rollback
INSTEAD ,这就是发生的事情
hello/world
- 获取Hello World
然后按预期执行COMMIT hello/fake
- 获取before rollback
< - 我的问题是关于此 fake/fake
- 按预期获得before rollback - after rollback
我在第一点得到的错误消息。 2是:
遇到PHP错误
严重性:注意
消息:未定义属性:Bad_parameters :: $ db
文件名:controllers / bad_parameters.php
这是说$ db是未定义的,而我DID是从config/autoload.php
自动加载数据库。
现在,如果我在$this->load->database();
的CONSTRUCTOR中包含bad_parameters.php
,则在没有任何错误的情况下,点2之前显示'回滚前 - 回滚后'。
尽管第2号和第3号都是404路由,但是第3个例子工作正常但是第2个例子有这个问题。为什么会这样?我已经在自动加载我的数据库了。
答案 0 :(得分:1)
您正在使用哪个CI版本?尝试更新CI版本。
在CI 2.1.0修复了一个错误(Reactor#19),其中1)404_override路由在某些情况下被忽略,2)当控制器存在时,404_override控制器无法使用自动加载的库但是要求的方法没有。
答案 1 :(得分:0)
我在这里找到了解决方法:
https://bitbucket.org/ellislab/codeigniter-reactor/changeset/2fa0e75a2101
保留这个答案:
replace(system / core / CodeIgniter.php)第292行:
show_404("{$class}/{$method}");
with(system / core / CodeIgniter.php)第292行:
// Check and see if we are using a 404 override and use it.
if ( ! empty($RTR->routes['404_override']))
{
$x = explode('/', $RTR->routes['404_override']);
$class = $x[0];
$method = (isset($x[1]) ? $x[1] : 'index');
}
else
{
show_404("{$class}/{$method}");
}
并替换(system / core / Router.php)第273行:
if (!empty($this->routes['404_override']))
with(system / core / Router.php)第273行:
if ( ! empty($this->routes['404_override']))