数据库未在codeigniter中的特定类型的404路由上自动加载

数据库未在codeigniter中的特定类型的404路由上自动加载,codeigniter,routes,http-status-code-404,autoload,Codeigniter,Routes,Http Status Code 404,Autoload,我有一个名为Hello.php的控制器,它只有一个名为world的方法。控制器在construct时间和world函数echohello world启动事务并提交事务 class Hello extends CI_Controller { public function __construct() { parent::__construct(); $this->db->trans_begin; } public functi

我有一个名为
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'



现在我要做三件事:

  • 调用
    hello/world
    -期望
    hello-world
    ,然后提交
  • 调用
    hello/fake
    -预期404路由,然后在回滚前调用
    -在回滚后调用
  • 调用
    fake/fake
    -预期404路由,然后在回滚前调用
    -在回滚后调用
  • 相反,情况就是这样

  • 调用
    hello/world
    -获取
    hello-world
    ,然后按预期提交
  • 调用
    hello/fake
    -回滚前获取
    load->database()bad_parameters.php
  • 的构造函数中,第2点按预期显示“回滚前-回滚后”,没有任何错误


    尽管2号和3号都是404路由,但3号示例运行良好,但2号示例存在此问题。为什么会这样?我已经在自动加载我的数据库了

    您正在使用哪个CI版本?尝试更新您的CI版本

    在CI 2.1.0中,修复了一个错误(反应堆19),其中1)在某些情况下忽略404#U覆盖路由,2)当控制器存在但请求的方法不存在时,404#U覆盖控制器无法使用自动加载库


    我在这里找到了一个解决方案:

    为了保留这一答案:

    替换(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']))
    

    你看过你的PHP错误日志了吗?应该会出现500个错误我发现了一些。。。db->trans\u rollback()存在问题。。。让我更新这个问题。在我提到的第2点,PHP执行正在停止,因为第2点没有发生trans_回滚。您看到的trans_回滚错误是什么?好的。。。。。我又挖了更多。。。。。。。我意识到这是一个自动加载问题。。。。。数据库未自动加载。。。。。。我正在更新这个问题,你可以添加一个pre_系统钩子来纠正它。既然你提到了它,我注意到在我用404路由定义的框架中也发生了类似的事情。可能是应用程序流中的错误。路由是应该发生的第二件事,但是修改
    系统
    文件夹中的文件不是一件不可能的事。。。不…?at说大多数用户永远不需要这样做,但是对于那些想要显著改变CodeIgniter核心的用户来说,替换或扩展它们的选项确实存在。因此,您可以编写一个alterator类来替换原始方法,并且您仍然不会修改核心文件。我给您的更改将是在alterator类中覆盖哪些方法的一个路径点。我使用的是CI 2.0.3-也许这是主要问题。将尝试升级到CI 2.1.0,并稍后进行评论。
    if ( ! empty($this->routes['404_override']))