gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:22:20 30 4
gpt4 key购买 nike

问题:

当我更新我的 CodeIgniter 2.2.0 应用程序以使用 mysqli 数据库驱动程序时,它破坏了 CodeIgniter 的 backup function of the Database Utility Class .我曾经成功获得数据库备份的地方,现在却出现错误...

Unsupported feature of the database platform you are using.

该错误仅表示来自数据库实用程序类的 CodeIgniter 备份功能不支持 mysqli。根据在线文档,仅支持 MySQL。

但是,我不想使用已弃用的 mysql 数据库驱动程序。


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

我想我可以通过简单地扩展 CodeIgniter 的数据库实用程序类来解决这个问题。然而,CodeIgniter does not allow this as per documentation ...

Note: The Database classes can not be extended or replaced with your own classes.


另一种解决方法( fatal error ):

编辑:my answerthe accepted answer基于此解决方法。

此 GitHub 页面描述了一种通过创建 MY_Loader 类来扩展核心来扩展数据库类的方法。

https://github.com/bcit-ci/CodeIgniter/wiki/Extending-Database-Drivers

但是,当我尝试这个解决方案时,我遇到了这个 fatal error ...

Filename: core/MY_Loader.php, Line Number: 49

Fatal error: Call to undefined method CI_DB_mysqli_driver::where() in /home/account/codeigniter/system/libraries/Session.php on line 217

第 49 行是:$db =& new $my_driver(get_object_vars($db));

我正在完全按照上面链接中的描述使用 MY_Loader,并且 MY_DB_mysqli_utility 看起来像这样......

<?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
.....
}

}

(我不完全确定这个 GitHub 解决方法失败是因为它已经过时、我忽略了某些东西,还是因为我试图在 CI_DB_mysqli_utility 上使用它CI_DB_mysqli_driver.)

编辑:此解决方法失败,因为它仅用于扩展 _driver 而不是 _utility...两个完全不同的功能。


可行的解决方案(不理想):

我找到的唯一可行的解​​决方案是编辑 CodeIgniter 系统文件。出于显而易见的原因,我不想这样做。

位于 system/database/drivers/mysqli/mysqli_utility.php 的“损坏”备份函数如下...

function _backup($params = array())
{
// Currently unsupported
return $this->db->display_error('db_unsuported_feature');
}

有一个 Ellis Lab 线程显示了一个有效的函数...

https://ellislab.com/forums/viewthread/194645/

我通过使用新的 _backup 函数编辑核心系统文件来让它工作。

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

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

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


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

最佳答案

基于 accepted solution by @RandomSeed ...

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

然后它将从任何驱动程序加载默认实用程序文件的位置,我只是将其重定向以检查位于我的 application/libraries 目录中的自定义数据库实用程序文件是否存在。如果文件存在,则使用它,否则使用默认文件。

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();

}

}

application/libraries/MY_DB_mysqli_utility.php

<?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 - 如何扩展 CodeIgniter 数据库实用程序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27116299/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com