You’d like to take advantage of CodeIgniter’s built-in database backup function as described here…
http://www.codeigniter.com/user_guide/database/utilities.html#backup
As you can see, only the mysql
PHP database extension is supported. However, since the mysql
PHP database extension has been deprecated, maybe you’re using another PHP database extension like mysqli
instead. Now the problem is that you can no longer use CodeIgniter’s built-in database backup function without getting this error…
Unsupported feature of the database platform you are using.
The error simply means that if you use any PHP database extension besides mysql
, there is no function included within any of CodeIgniter’s database drivers’ utility file for doing the backup.
No problem, we’ll just “extend” CodeIgniter’s database class.
Wrong! As per documentation,
Note: The Database classes can not be extended or replaced with your own classes.
Despite this limitation, there is a workaround below that will not involve editing CodeIgniter’s core system files.
Solution:
Instead, we’ll simply “extend” CodeIgniter’s Loader class. Within this custom Loader, we’ll only copy and slightly modify the
dbutil()
function. Study the function below and compare it to the original. I simply check for the existence of my custom utility driver file and load it in place of the default.
application/core/MY_Loader.php
contains…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<?php class MY_Loader extends CI_Loader { public function dbutil() { // this function taken from CI v2.2.0 // system/core/Loader.php // modified as indicated below 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(); } } |
Now we need to find the database driver that we’re using. For mysqli
, it should be located within system/database/drivers/mysqli/mysqli_utility.php
. This file contains the _backup()
function and you can see that it’s empty (“unsupported”).
Create an exact duplicate of this file; rename it MY_DB_mysqli_utility.php
and place it here…
application/libraries/MY_DB_mysqli_utility.php
Everything within this file should remain the same as the original, except for the name of the class
and the contents of the _backup()
function…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php class MY_DB_mysqli_utility extends CI_DB_utility { // this code taken from CI v2.2.0 // system/database/drivers/mysqli/mysqli_utility.php // everything in here is same as default mysqli_utility .... // EXCEPT the _backup() function contains my own code function _backup($params = array()) { // my custom working backup code .... |
NOW you can put whatever code you see fit into this version of the _backup()
function. I’m not going to tell you how to do this, but you could look inside of system/database/drivers/mysql/mysql_utility.php
for some inspiration. You could also try the backup function suggested in this posting, which seems to be working.
The advantages to my technique are as follows…
– Updating the CodeIgniter system files leaves this solution intact.
– Changing the dbdriver
setting in config/database.php
will simply cause a fallback to the selected database utility driver. This solution is specific to one particular database driver (mysqli
).
– Removing the MY_Loader.php
file causes a fallback to the default database utility driver.
– Removing the MY_DB_mysqli_utility.php
file causes a fallback to the default database utility driver.
– Update any other database utility driver by changing mysqli
where-ever appropriate.
Note: This solution was successfully performed using CodeIgniter v2.2.0.
Is that possible to use DB_forge inside DB_utility..??
I want to hide some must needed query inside DB_utility. This will creates tables into my database. So what is the best or right way?
Thank you in advance.
My recommendation is to upgrade to CodeIgniter 3.0, which already contains a working Database Utility class for
mysqli
.