Php 使用CodeIgniter和x2B进行表单验证;MySql不工作
我似乎无法使用Codeigniter进行表单验证。我尝试通过创建My_Form_validation.php来扩展Form_验证类,但没有成功。我现在正在尝试回调方法。有一段时间我发现了一些错误,但是它们是不正确的 这是位于我的控制器中的代码:Php 使用CodeIgniter和x2B进行表单验证;MySql不工作,php,codeigniter,validation,Php,Codeigniter,Validation,我似乎无法使用Codeigniter进行表单验证。我尝试通过创建My_Form_validation.php来扩展Form_验证类,但没有成功。我现在正在尝试回调方法。有一段时间我发现了一些错误,但是它们是不正确的 这是位于我的控制器中的代码: function create_user() { $this->load->library('form_validation'); $validate = array( array(
function create_user() {
$this->load->library('form_validation');
$validate = array(
array(
'field' => 'first_name',
'label' => 'First Name',
'rules' => 'trim|required|xss_clean'
),
array(
'field' => 'last_name',
'label' => 'Last Name',
'rules' => 'trim|required|xss_clean'
),
array(
'field' => 'username',
'label' => 'Username',
'rules' => 'trim|required|xss_clean|callback_user_exists'
),
array(
'field' => 'email_address',
'label' => 'Email Address',
'rules' => 'trim|required|valid_email|callback_email_exists'
),
array(
'field' => 'password',
'label' => 'Password',
'rules' => 'trim|required|min_length[5]|max_length[32]'
),
array(
'field' => 'password2',
'label' => 'Confirm Password',
'rules' => 'trim|required|matches[password]'
)
);
$this->form_validation->set_rules($validate);
if($this->form_validation->run() == FALSE) {
$this->load->view('user/user-signup');
} else {
$this->load->model('user_model');
if($query = $this->user_model->create_user()) {
$this->load->view('user/user-login');
} else {
$this->index();
}
}
}
function user_exists($username) {
$this->load->model('user_model');
$this->user_model->user_exists($username);
$this->form_validation->set_message('user_exists', 'This username is already taken');
}
function email_exists($email) {
$this->load->model('user_model');
$this->user_model->email_exists($email);
$this->form_validation->set_message('email_exists', 'This email is already in use');
}
这是我的模型中的代码:
function create_user() {
$insert_user = array(
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'username' => $this->input->post('username'),
'email_address' => $this->input->post('email_address'),
'password' => md5($this->input->post('password'))
);
$insert = $this->db->insert('users', $insert_user);
return $insert;
}
function user_exists($username) {
$this->db->where('username', $username);
$query = $this->db->get('users');
if($query->num_rows > 0) {
return true;
} else {
return false;
}
}
function email_exists($email) {
$this->db->where('email_address', $email);
$query = $this->db->get('users');
if($query->num_rows > 0) {
return true;
} else {
return false;
}
}
我想通过检查数据库中是否已经存在用户名或电子邮件地址来进行验证,如果已经存在,用户需要进行适当的更改
有什么想法吗?你试过
是唯一的[表名.字段名]
规则吗
例如:
$this->form_validation->set_rules('username', 'Username',
'required|min_length[5]|max_length[12]|is_unique[users.username]');
$this->form_validation->set_rules('email', 'Email',
'required|valid_email|is_unique[users.email]');
更新
如果要使用回调函数,则user\u exists
函数应位于控制器中,而不是您提到的模型中。
正确的定义是——
public function username_check($str)
{
if ($str == 'test')
{
$this->form_validation->set_message('username_check', 'The %s field can not be the word "test"');
return FALSE;
}
else
{
return TRUE;
}
}
像这样重新编写函数
function user_exists($username) {
$this->load->model('user_model');
$result = $this->user_model->user_exists($username);
if($result != NULL){
$this->form_validation->set_message('user_exists', 'This username is already taken');
return FALSE;
}else{
return TRUE;
}
}
您没有返回true或false,因此它总是得到xss_-clea返回的最后一个true。您的代码很难阅读,因此我将向您展示如何改进它。:) 在控制器中,您可以使用构造函数来加载模型,而不是这两行:
$this->load->model('user_model');
像这样:
function __constructor() {
parent::__constructor();
$this->load->model('user_model');
}
将您的用户“”更改为:
function user_exists($username) {
$user_check = $this->user_model->user_exists($username);
if($user_check > 0) {
$this->form_validation->set_message('user_exists', 'This username is already taken');
return FALSE;
}
else {
return TRUE;
}
}
function email_exists($email) {
$check_email = $this->user_model->email_exists($email);
if($check_email > 0) {
$this->form_validation->set_message('email_exists', 'This email is already in use');
return FALSE;
}
else {
return TRUE;
}
}
将您的电子邮件更改为:
function user_exists($username) {
$user_check = $this->user_model->user_exists($username);
if($user_check > 0) {
$this->form_validation->set_message('user_exists', 'This username is already taken');
return FALSE;
}
else {
return TRUE;
}
}
function email_exists($email) {
$check_email = $this->user_model->email_exists($email);
if($check_email > 0) {
$this->form_validation->set_message('email_exists', 'This email is already in use');
return FALSE;
}
else {
return TRUE;
}
}
现在,回到您的模型并更改这两种模型方法:
function user_exists($username) {
$this->db->where('username', $username);
$query = $this->db->get('users');
return $query->num_rows();
}
function email_exists($email) {
$this->db->where('email_address', $email);
$query = $this->db->get('users');
return $query->num_rows();
}
现在,你做错了,因为你不明白model的意思。在models方法中,您可以编写数据库查询。。。因此,如果要创建用户,应在控制器中获取输入信息,然后将其传递给模型方法create_user,如下所示:
控制器方法创建用户:
function create_user() {
$this->load->library('form_validation');
$validate = array(
array(
'field' => 'first_name',
'label' => 'First Name',
'rules' => 'trim|required|xss_clean'
),
array(
'field' => 'last_name',
'label' => 'Last Name',
'rules' => 'trim|required|xss_clean'
),
array(
'field' => 'username',
'label' => 'Username',
'rules' => 'trim|required|xss_clean|callback_user_exists'
),
array(
'field' => 'email_address',
'label' => 'Email Address',
'rules' => 'trim|required|valid_email|callback_email_exists'
),
array(
'field' => 'password',
'label' => 'Password',
'rules' => 'trim|required|min_length[5]|max_length[32]'
),
array(
'field' => 'password2',
'label' => 'Confirm Password',
'rules' => 'trim|required|matches[password]'
)
);
$this->form_validation->set_rules($validate);
if($this->form_validation->run() == FALSE) {
$this->load->view('user/user-signup');
} else {
$user_data['first_name'] = $this->input->post("first_name");
$user_data['last_name'] = $this->input->post("last_name");
$user_data['username'] = $this->input->post("username");
$user_data['email_address'] = $this->input->post("email_address");
$user_data['password'] = $this->input->post("password");
if($query = $this->user_model->create_user($user_data)) {
$this->load->view('user/user-login');
} else {
$this->index();
}
}
}
function create_user($user_data) {
return $this->db->insert("users", $user_data);
}
模型的方法创建用户:
function create_user() {
$this->load->library('form_validation');
$validate = array(
array(
'field' => 'first_name',
'label' => 'First Name',
'rules' => 'trim|required|xss_clean'
),
array(
'field' => 'last_name',
'label' => 'Last Name',
'rules' => 'trim|required|xss_clean'
),
array(
'field' => 'username',
'label' => 'Username',
'rules' => 'trim|required|xss_clean|callback_user_exists'
),
array(
'field' => 'email_address',
'label' => 'Email Address',
'rules' => 'trim|required|valid_email|callback_email_exists'
),
array(
'field' => 'password',
'label' => 'Password',
'rules' => 'trim|required|min_length[5]|max_length[32]'
),
array(
'field' => 'password2',
'label' => 'Confirm Password',
'rules' => 'trim|required|matches[password]'
)
);
$this->form_validation->set_rules($validate);
if($this->form_validation->run() == FALSE) {
$this->load->view('user/user-signup');
} else {
$user_data['first_name'] = $this->input->post("first_name");
$user_data['last_name'] = $this->input->post("last_name");
$user_data['username'] = $this->input->post("username");
$user_data['email_address'] = $this->input->post("email_address");
$user_data['password'] = $this->input->post("password");
if($query = $this->user_model->create_user($user_data)) {
$this->load->view('user/user-login');
} else {
$this->index();
}
}
}
function create_user($user_data) {
return $this->db->insert("users", $user_data);
}
就这些,它会起作用的。祝你好运。我也有同样的问题。 回调函数的问题之一是它只能接受一个参数。 在检查表单中记录的唯一性时,需要考虑两个状态。 1) 您正在添加新记录 2) 您正在编辑现有记录 如果你正在添加一个新的记录,内置的很好用。 如果正在编辑现有记录,则“唯一”不起作用,因为它会找到正在编辑的记录,并表示表单数据不唯一 为了解决这个问题,我使用了session类,在运行验证脚本之前将其设置为case2,因此您需要知道是编辑现有记录还是添加新记录。为此,我只需在编辑表单时向表单添加一个隐藏输入,例如记录唯一id。
假设用户表中有一个唯一的用户id,例如,在运行验证之前设置它 如果($this->input->post('user_id')){$this->session->set_userdata('callback_user_id'),$this->input->post('user_id');} 然后在回调中,使用以下算法: 案例1)ie$this->session->userdata('callback\u user\u id')==FALSE 如果用户名是唯一的,请验证并返回true。 如果用户名不唯一,则返回false并显示验证消息user必须唯一 案例2)即,设置了回调用户id。 如果用户名是唯一的,请验证并返回true 如果用户名已经设置,并且该记录与user_id具有相同的id,则表示您正在更新相同的记录,并且可以进行验证。 否则,另一条记录具有用户名,验证将失败。 在这个模型中,我只有一个方法返回用户名的唯一id 运行验证后,最好取消设置callback\u user\u id会话变量。 很抱歉,我没有要粘贴的代码,但我认为此描述应该对您有所帮助 ==编辑 现在,我认为用一个新函数覆盖表单验证是一种可行的方法。 因此:具有语言包条目、表单验证行和覆盖: 这假设一个字段被发布为具有行ID的命名ID
$lang['form_validation_is_unique_not_current'] ='The {field} field must contain a unique value.';
array('field' => 'username', 'label' => 'lang:…username…', 'rules' => 'trim|required|min_length[2]|max_length[40]|is_unique_not_current[users.username]'),
class MY_Form_validation extends CI_Form_validation {
function __construct($rules = array())
{
parent::__construct($rules);
$this->_error_prefix = '<div class="alert alert-danger"><p>';
$this->_error_suffix = '</p></div>';
}
public function is_unique_not_current($str, $field)
{
sscanf($field, '%[^.].%[^.]', $table, $field);
$id = $this->CI->input->post('id');
if($this->CI->input->post('field_name'))
{
return isset($this->CI->db)
? ($this->CI->db->limit(1)->get_where($table, array(
$field => $str,
'id <> ' => $id))->num_rows() === 0)
: FALSE;
}
return FALSE;
}
}
$lang['form_validation_is_unique_not_current']='The{field}字段必须包含唯一值';
数组('field'=>'username','label'=>'lang:…username…','rules'=>'trim |必需的|最小长度[2]|最大长度[40]|是唯一的|不是当前的[users.username]),
类MY_Form_验证扩展了CI_Form_验证{
函数构造($rules=array())
{
父项::_构造($rules);
$this->_error_prefix='';
$this->_error_suffix='';
}
公共函数是唯一的,不是当前的($str,$field)
{
sscanf($field,%%[^.].%%[^.]',$table,$field);
$id=$this->CI->input->post('id');
如果($this->CI->input->post('field_name'))
{
返回isset($this->CI->db)
?($this->CI->db->limit(1)->get_where($table,array)(
$field=>$str,
'id'=>$id))->num_rows()==0)
:假;
}
返回FALSE;
}
}
这通常是正确的,但是因为我正在检查数据库,所以该函数存在于模型中,并且相同的函数名通过控制器连接到模型中。最新的CodeIgniter内置的功能是否独特?据我所知,该独特功能需要扩展Form_验证类。您使用的是什么版本?你不需要重写那里已有的内容!!不,您只需在回调中查询$_POST变量,并根据需要访问尽可能多的字段。