Php 如何扩展CodeIgniter数据库实用程序类

Php 如何扩展CodeIgniter数据库实用程序类,php,mysql,codeigniter,mysqli,codeigniter-2,Php,Mysql,Codeigniter,Mysqli,Codeigniter 2,问题: 当我更新CodeIgniter 2.2.0应用程序以使用mysqli数据库驱动程序时,它破坏了CodeIgniter的功能。在我过去成功获得数据库备份的地方,我现在遇到了一个错误 您正在使用的数据库平台的不受支持的功能 该错误仅仅意味着数据库实用程序类中的CodeIgniter备份函数不支持mysqli。根据在线文档,仅支持MySQL 但是,我不喜欢使用不推荐使用的mysql数据库驱动程序 可能的解决方法(不允许): 我想我可以通过简单地扩展CodeIgniter的数据库实用程序类来解

问题

当我更新CodeIgniter 2.2.0应用程序以使用
mysqli
数据库驱动程序时,它破坏了CodeIgniter的功能。在我过去成功获得数据库备份的地方,我现在遇到了一个错误

您正在使用的数据库平台的不受支持的功能

该错误仅仅意味着数据库实用程序类中的CodeIgniter备份函数不支持
mysqli
。根据在线文档,仅支持MySQL

但是,我不喜欢使用不推荐使用的
mysql
数据库驱动程序


可能的解决方法(不允许)

我想我可以通过简单地扩展CodeIgniter的数据库实用程序类来解决这个问题。然而

注意:数据库类不能扩展或替换为您自己的类


另一种解决方法(致命错误)

编辑:和基于此解决方案

这个GitHub页面描述了一种通过创建
MY\u Loader
类来扩展数据库类的方法,以扩展核心

然而,当我尝试这个解决方案时,我得到了这个致命的错误

文件名:core/MY_Loader.php,行号:49

致命错误:在第217行的/home/account/codeigniter/system/libraries/Session.php中调用未定义的方法CI_DB_mysqli_driver::where()

第49行是:
$db=&new$my_驱动程序(get_object_vars($db))

我使用的
MY_Loader
与上面链接中描述的完全一样,并且
MY_DB\u mysqli\u实用程序
如下所示

<?php class MY_DB_mysqli_utility extends CI_DB_mysqli_utility {

    function __construct($params){
        parent::__construct($params);
        log_message('debug', 'Extended DB driver class instantiated!');
    }

    function _backup($params = array())
    {
        // the working backup function is here
        .....
    }

}
有一个Ellis实验室线程显示了一个可以工作的函数

我通过使用新的
\u backup
功能编辑核心系统文件,使其正常工作

function _backup($params = array())
{
    // the working backup function is here
    .....
}

那么我还能/应该在这里做什么?

mysqli
驱动程序不支持CodeIgniter的备份功能,我不允许扩展CodeIgniter数据库实用程序,除了编辑核心系统文件外,我别无选择。我似乎被卡住了,我来这里是想看看我是否遗漏了什么,或者是否还有什么可以做的,而不是编辑核心系统文件



编辑:请注意,CodeIgniter v3中的数据库实用程序类完全支持
mysqli

,因为使用php进行数据库备份由于内存和脚本超时而受到一定限制。 使用mysqldump创建一个cronjob进行备份怎么样

然而,如果这不是一个选项,可能会有所帮助

数据库类不能扩展或替换为您自己的类

这些类甚至不是final,因此我将忽略此通知并派生我自己的驱动程序(根据第140-143行):

  • system/database/drivers/
    中创建一个新文件夹,例如
    mysupersqli/
  • 创建一组文件
    mysupersqli|[driver | forge | result | utility].php
  • 在上面的每个文件中,声明一个类
    CI_DB_mysupersqli_[driver | forge | result | utility]
    ,该类扩展了它的
    CI_DB_mysupersqli*
    对应项(
    CI_DB_mysupersqli_-driver:$dbdriver
    ,根据您的喜好覆盖其余部分)
  • 或者,对
    系统/数据库/驱动程序/mysqli
    中的文件进行残酷的复制/粘贴/搜索和替换可能会更快(这也会使您的自定义驱动程序独立于内置的mysqli驱动程序,这可能是一件好事,也可能不是一件好事)
  • 现在,您应该能够修改新驱动程序的
    config/database.php

免责声明:未测试:)

涉及自定义加载程序()的解决方案仅与扩展数据库驱动程序相关。不能用
*\u实用程序
类替换
*\u驱动程序

$my_driver_file = APPPATH.'libraries/'.$my_driver.EXT; // *driver* required!!
相反,我将覆盖该选项。像这样的方法应该会奏效:

public function dbutil()
{
    /* snip for brevity */
    $class = config_item('subclass_prefix').'DB_'.$db->dbdriver.'_utility';
    $filename = APPPATH.'libraries/'.$class.EXT;
    require_once($filename);
    /* snip for brevity */
 }
免责声明:未测试:)

基于

我从CodeIgniter的
Loader
类中获取
dbutil()
函数,并将其精确复制到我的自定义
my_Loader
扩展中

然后,在它将从哪个驱动程序加载默认实用程序文件的地方,我简单地重定向它,以检查位于我的
应用程序/库
目录中的自定义数据库实用程序文件是否存在。如果文件存在,请使用它,否则使用默认文件

MY_Loader.php

<?php class MY_Loader extends CI_Loader {

    public function dbutil()
    {

        if (! class_exists('CI_DB'))
        {
            $this->database();
        }

        $CI =& get_instance();

        // for backwards compatibility, load dbforge so we can extend dbutils off it
        // this use is deprecated and strongly discouraged
        $CI->load->dbforge();

        require_once(BASEPATH . 'database/DB_utility.php');

        // START custom >>

        // path of default db utility file
        $default_utility = BASEPATH . 'database/drivers/' . $CI->db->dbdriver . '/' . $CI->db->dbdriver . '_utility.php';

        // path of my custom db utility file
        $my_utility = APPPATH . 'libraries/MY_DB_' . $CI->db->dbdriver . '_utility.php';

        // set custom db utility file if it exists
        if (file_exists($my_utility))
        {
            $utility = $my_utility;
            $extend = 'MY_DB_';
        }
        else
        {
            $utility = $default_utility;
            $extend = 'CI_DB_';
        }

        // load db utility file
        require_once($utility);

        // set the class
        $class = $extend . $CI->db->dbdriver . '_utility';

        // << END custom

        $CI->dbutil = new $class();

    }

}
<?php
    class MY_DB_mysqli_utility extends CI_DB_utility {

    // everything in here is same as default mysqli_utility
    ....

    // EXCEPT the _backup() function is my own

    function _backup($params = array())
    {
        //  my custom backup code
        ....
我对这个解决方案非常满意,因为它使我的CodeIgniter核心文件完全不受影响。如果我移动或忘记使用自定义实用程序文件,它会自动返回默认驱动程序的实用程序文件



编辑:请注意,CodeIgniter v3中的数据库实用程序类完全支持
mysqli
无需此解决方法。

谢谢,但问题不在于PHP、超时或内存,我已经有了一个可用的
mysqli
备份功能。问题是如何在不编辑CodeIgniter核心文件的情况下扩展/修复CodeIgniter驱动程序?我不确定是否真的需要这样做才能实现目标。也许这在CI v3中是固定的?CodeIgniter v3尚未正式发布,即使如此,仍有太多的事情需要检查和更改。换句话说,这不仅仅是上传一个新的系统文件集的问题。这很有趣。我不想在
系统中的任何地方存储任何自定义项,但是您的建议仍然比修改核心文件本身要好得多。是的,我应该更仔细地研究该解决方案。谢谢你指出这一点,我下一步要试试这个。谢谢!它起作用了。请参阅我的详细信息。如果<代码> MySQL LoP> <代码>在您的系统上,如果您是我,我会考虑发出一个系统调用。您确信<代码> $Case=‘CiyBd''。CI->db->dbdriver.”_效用'?看起来你是我
<?php
    class MY_DB_mysqli_utility extends CI_DB_utility {

    // everything in here is same as default mysqli_utility
    ....

    // EXCEPT the _backup() function is my own

    function _backup($params = array())
    {
        //  my custom backup code
        ....