我已将修复程序应用于DB_driver.php中的Codeigniter,以便我可以通过将$this->db_select();
添加到function simple_query($sql)
来一次连接到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是现有数据库)。我$active_group
中的/config/database.php
设置为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和users表(我的管理面板数据库)。
但是,如果我想在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作为前缀?
答案 0 :(得分:1)
我认为您可以使用回调函数来调用执行检查的特定函数:
所以改变这个:
$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->
}
答案 1 :(得分:0)
只是为了使它更通用:扩展表单验证类,创建一个新函数并在规则中使用它。假设您的第二个数据库设置为$ this-> db2 你的规则是is_db2_unique [table.field]
在您的语言文件中添加以下行: $ lang [' form_validation_is_db2_unique'] =' {field}字段必须包含唯一值。';
库: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;
}
}