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

Using CodeIgniter form_validation rule is_unique with more than one database loaded

我已经在 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);
  }
}

我的应用程序是现有数据库的后端管理面板。我宁愿不使用额外的 table 操作现有数据库,而是将我的管理面板需要的任何 table 存储在另一个数据库中(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 和用户 table(我的管理面板数据库)。

但是,如果我想在 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 以获取登录名 table,所以错误是预料之中的,但不是我们想要的。

我很好奇是否有人找到了一种方法来使用 is_unique 验证规则来查询他们的第二个数据库或第一个数据库,具体取决于手头的实例,或者我是否需要编写一个使用回调的函数(或者如果您认为将我的 table 简单地放入现有的 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->
}

只是为了让它更通用:扩展表单验证 class,创建一个新函数并在规则中使用它。说你的第二个数据库设置在 $this->db2 你的规则是 is_db2_unique[table.field]

在您的语言文件中的某处添加以下行: $lang['form_validation_is_db2_unique'] = 'The {field} field must contain a unique value.';

图书馆: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;
    }
}