- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
问题:
当我更新我的 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 answer和 the 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/
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!