使用CodeIgniter form_validation规则is_unique,加载了多个数据库

时间:2015-01-09 19:09:48

标签: php mysql database codeigniter validation

我已将修复程序应用于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作为前缀?

2 个答案:

答案 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;
    }
}