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

Posted

技术标签:

【中文标题】在 codeigniter 中特定类型的 404 路由没有自动加载数据库【英文标题】:database is not getting autoloaded upon specific kind of 404 routing in codeigniter 【发布时间】:2012-07-22 22:15:55 【问题描述】:

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

请注意:我的数据库已使用 $autoload['libraries'] = array('database'); 从 config/autoload.php 自动加载


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 然后提交 致电 hello/fake - 期待 404 路由,然后是 before rollback - after rollback 呼叫fake/fake - 期待404路由,然后before rollback - after rollback

INSTEAD,这就是发生的事情

    致电hello/world - 得到Hello World 然后按预期提交 致电hello/fake - 获取before rollback 我的问题是关于这个 致电fake/fake - 按预期获得before rollback - after rollback

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

遇到了 PHP 错误

严重性:通知

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

文件名:controllers/bad_parameters.php

这是说 $db 未定义,而我确实从 config/autoload.php 自动加载数据库。

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

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

【问题讨论】:

您查看过您的 PHP 错误日志吗?应该会出现 500 错误 我发现了一些东西... db->trans_rollback() 有问题... 让我更新一下问题。在我提到的第 2 点,PHP 执行正在停止,因为 trans_rollback 没有在第 2 点发生。 2 您看到的 trans_rollback 错误是什么? 好的.....我挖掘了更多.......我意识到这是一个自动加载问题......数据库没有自动加载......我正在更新问题 你可以添加一个 pre_system 钩子来纠正它。既然您提到了它,我注意到在定义 404 路由的框架中发生了类似的事情。可能是应用程序流程中的错误。路由是应该发生的第二件事 【参考方案1】:

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

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

ci changelog

ci upgrading

【讨论】:

我正在使用 CI 2.0.3 - 也许这是主要问题。将尝试升级到 CI 2.1.0 并稍后发表评论。【参考方案2】:

我在这里找到了解决方法:

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']))

【讨论】:

但不会修改SYSTEM 文件夹中的文件是否...否...? here 它说 大多数用户永远不需要这样做,但是对于那些想要显着改变 CodeIgniter 核心的人来说,确实存在替换或扩展它们的选项。 所以,你可以写一个alterator类来替换原来的方法,你仍然不会修改核心文件。我给您的更改将成为在您的更改器类中覆盖哪些方法的路标。

以上是关于在 codeigniter 中特定类型的 404 路由没有自动加载数据库的主要内容,如果未能解决你的问题,请参考以下文章

在 CodeIgniter 中显示 404 页面

自定义 404 未在实时服务器上的 Codeigniter 中显示

codeigniter 自定义 404 页面不起作用

带有 quercus 的 codeigniter 显示 404 错误

如何使用 Codeigniter 在自定义 404 页面中重定向 404 错误?

Codeigniter 和 PHP - 强制 404?