4

我有一个名为的控制器Hello.php,它只有一个名为world. 控制器在construct时间启动事务,world函数回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";
    }
}

现在我要做3件事:

  1. 打电话给hello/world- 期待Hello World然后提交
  2. 呼叫hello/fake- 期待 404 路由,然后before rollback - after rollback
  3. 呼叫fake/fake- 期待 404 路由,然后before rollback - after rollback

相反,这就是发生的事情

  1. 呼叫-按预期hello/world获得然后 COMMITHello World
  2. 打电话给hello/fake-得到before rollback<-我的问题是关于这个
  3. 呼叫fake/fake-before rollback - after rollback 达到预期

我在第 1 点收到的错误消息。2是:

遇到 PHP 错误

严重性:通知

消息:未定义的属性:Bad_parameters::$db

文件名:控制器/bad_parameters.php

这是说 $db 未定义,而我确实从config/autoload.php.

现在,如果我包含$this->load->database();在 CONSTRUCTOR 中bad_parameters.php,则第 2 点按预期显示“回滚前 - 回滚后”,没有任何错误。

即使 2 号和 3 号都是 404 路由,3 号示例工作正常,但 2 号示例存在此问题。为什么会发生这种情况?我已经在自动加载我的数据库。

4

2 回答 2

1

您使用的是哪个 CI 版本?尝试更新您的 CI 版本。

在 CI 2.1.0 修复了一个错误(Reactor #19),其中 1)404_override 路由在某些情况下被忽略,2)当控制器存在但请求的方法确实时,自动加载的库对 404_override 控制器不可用不是。

ci 更新日志

ci升级

于 2012-07-30T05:32:25.470 回答
0

在这里,我找到了解决此问题的方法:

https://bitbucket.org/ellislab/codeigniter-reactor/changeset/2fa0e75a2101

为了保留这个答案:

替换 (system/core/CodeIgniter.php) 第 292 行:

show_404("{$class}/{$method}");

使用 (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']))

使用 (system/core/Router.php) 第 273 行:

if ( ! empty($this->routes['404_override']))
于 2012-07-30T07:03:42.810 回答