使用不同数据库在 Codeigniter 3 中进行表单验证

Form validation in Codeigniter 3 using different database

我在使用表单验证库的 Codeigniter 3 上遇到了麻烦;我必须检查用户提交到注册表单中的电子邮件地址在用户数据库中是否是唯一的。 我在我的项目中使用了两个数据库,用户一个不是默认的。 要执行电子邮件检查,我使用以下代码:

$this->form_validation->set_rules('email','Email','trim|required|valid_email|is_unique[users.email]');

我收到有关缺少用户 table 到默认数据库的错误,所以我意识到 CI 3 查看电子邮件以签入默认数据库...不正确用户数据库,即使在构造中我加载了正确的 model/database.

有没有办法使用上面的表单验证对不同的数据库执行检查?

感谢任何反馈

更新 在我用来在控​​制器中加载模型的代码下方

function __construct()
{
    parent::__construct();
    $this->load->model("admin/user_model","user");
}

下面的代码User_model

// Database
private $auth_db;

// Tables
private $table_users = 'users';

public function __construct()
{
    parent::__construct();
    $this->auth_db = $this->load->database('auth', true);
}

并且...最后...在配置文件中数据库配置

$active_group = 'default';
$query_builder = TRUE;

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'xxxxxxxxx',
    'password' => 'xxxxxxxxx',
    'database' => 'vfr_main',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_unicode_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

$db['auth'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',
    'username' => 'xxxxxxxxxxx',
    'password' => 'xxxxxxxxxxx',
    'database' => 'vfr_auth',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => TRUE,
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_unicode_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

在 CodeIgniter 3 中,模型没有直接的方法来控制它们连接到哪个数据库组。在这种情况下,我认为我们不能简单地编写自定义验证规则,因为 is_unique 是进行数据库调用的唯一规则,并且没有内置的方法来更改数据库。

在这种情况下,我认为最直接的方法是扩展表单验证 class,然后在这个扩展库中添加一个新的 is_unique_authdb 方法来检查第二个数据库。然后您将使用这个新方法代替上面显示的调用。

在 git 集线器上的 3.x 回购中,我看到这是现有方法。

public function is_unique($str, $field)
{
    sscanf($field, '%[^.].%[^.]', $table, $field);
    return isset($this->CI->db)
        ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
        : FALSE;
}

你的额外方法可能是这样的:

public function is_unique_authdb($str, $field)
{
    $db = $this->CI->load->database('auth', true);
    sscanf($field, '%[^.].%[^.]', $table, $field);
    return isset($db)
        ? ($db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
        : FALSE;
}

扩展本机库非常简单。例如,要扩展本机 Form_validation class,您将创建一个名为 application/libraries/MY_Form_validation.php 的文件,并声明您的 class:

class MY_Form_validation extends CI_Form_validation {
    public function is_unique_authdb($str, $field)
    {
        $db = $this->CI->load->database('auth', true);
        sscanf($field, '%[^.].%[^.]', $table, $field);
        return isset($db)
            ? ($db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
            : FALSE;
    }
}

然后您将正常加载库,但它会加载您的扩展库,您可以使用 authdb 方法进行此验证。

$this->form_validation->set_rules('email','Email','trim|required|valid_email|is_unique_authdb[users.email]');

CI3 docs 用于扩展本机库。

注意:使用 CodeIgniter 4 我认为这会更简单,因为 CI4 有一个内置的 属性 模型,专门允许您管理模型将连接到哪个数据库。