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