我已经在 DB_driver.php 年对 Codeigniter 应用了修复程序,以允许我通过向 function simple_query($sql)
添加 $this->db_select();
来一次连接到 2 个数据库。
然后,我有一个MY_Controller.php,用于加载我的数据库和我扩展它的每个控制器:
class MY_Controller extends CI_Controller {
public function __construct() {
$this->db1 = $this->load->database('db1',TRUE);
$this->db2 = $this->load->database('db2',TRUE);
}
}
我的应用程序是现有数据库的后端管理面板。我宁愿不使用其他表操作现有数据库,而是我的管理面板需要的任何表都将存储在另一个数据库中(db1 是我的面板,db2 是现有数据库)。我在/config/database.php
$active_group
设置为 db1。
以下格式的表单验证:
$userRules = "trim|required|min_length[4]|max_length[25]|xss_clean|is_unique[users.username]";
$this->form_validation->set_rules('username', 'Username', $userRules);
工作正常,因为在这种情况下,我希望查询 db1 和用户表(我的管理面板数据库)。
但是,如果我想在 db2 上用这样的事情做同样的事情:
$useridRules = "trim|required|min_length[4]|max_length[25]|xss_clean|is_unique[login.userid]";
$this->form_validation->set_rules('userid', 'Username', $useridRules);
不起作用,因为它仍在尝试查询 db1。返回错误:
Error Number: 1146
Table 'db1.login' doesn't exist
SELECT * FROM (`login`) WHERE `user_id` = 'asdfjkl' LIMIT 1
Filename: libraries/Form_validation.php
Line Number: 954
db1.login 绝对不存在,因为我需要查询 db2 以获取登录表,因此错误是预期的,但不是想要的。
我很好奇是否有人找到了一种方法来使用 is_unique 验证规则来查询他们的第二个数据库或第一个数据库,具体取决于手头的实例,或者我是否需要使用回调来编写函数(或者您是否认为简单地将我的表放入现有 db2 中并用 ci_table 前缀会更好?
我认为您可以使用回调函数来调用执行检查的特定函数:
所以改变这个:
$userRules = "trim|required|min_length[4]|max_length[25]|xss_clean|is_unique[users.username]";
对此:
$userRules = "trim|required|min_length[4]|max_length[25]|xss_clean|callback_is_unique";
你需要有一个函数来处理它:
function is_unique($username){ // $username recieves the parameter automatically
//Go on with your query as bellow
$this->db2->
}
只是为了让它更通用一点:扩展表单验证类,创建一个新函数并在规则中使用它。 假设您的第二个数据库设置为 $this->DB2您的规则将是 is_db2_unique[table.field]
在您的语言文件中的某处添加以下行:$lang['form_validation_is_db2_unique'] = '{字段} 字段必须包含唯一值。
库:MY_Form_validation.php
<?php if ( defined('BASEPATH') === FALSE ) exit('No direct script access allowed');
// this is used as to extend the base form validation class,
class MY_Form_validation extends CI_Form_validation
{
function __construct($rules = array())
{
parent::__construct($rules);
}
public function is_db2_unique($str, $field)
{
sscanf($field, '%[^.].%[^.]', $table, $field);
return isset($this->CI->db2)
? ($this->CI->db2->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
: FALSE;
}
}