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…
<?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…
<?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`.