2015-01-09 57 views
0

我已将修复程序应用于DB_driver.php中的Codeigniter,以允许我通过将$this->db_select();添加到function simple_query($sql)而同时连接到2个数据库。使用CodeIgniter form_validation规则is_unique加载了多个数据库

然后我有一个加载我的两个数据库,一个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和用户表(我的管理面板数据库)的工作就好了。

但是,如果我想做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前缀他们

回答

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-> 
} 
+0

我曾想过这一点,但希望能有一种方法,我可以使用原生的东西,并没有写我自己。谢谢。 – Jguy 2015-01-09 19:59:07

0

只是为了使这个多一点通用:扩展表单验证类,使一个新的功能和使用方法在规则中。说你的第二个数据库设置为$这个 - > 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; 
    } 
} 
相关问题