问题
I am having some problem in my login form like this
I want to display an individually error beside of each field
here is the controller
function index()
{
$this->form_validation->set_rules('username','Username','trim|required|exact_length[4]|xss_clean');
$this->form_validation->set_rules('password','Password','trim|required|min_length[4]|max_length[40]|xss_clean|callback_login');
$this->form_validation->set_rules('jabatan','Jabatan','trim|required|xss_clean');
if($this->form_validation->run() == false)
{
$this->load->view('login');
}
else
{
$this->load->view('welcome_message');
}
}
function login()
{
$username = $this->input->post('username');
$password = $this->input->post('password');
$jabatan = $this->input->post('jabatan');
$value = $this->m_login->login($username,$password,$jabatan);
if($value)
{
return true;
}
else
{
$this->form_validation->set_message('login', 'password salah');
//delete redirect() and showing blank white screen
return false;
}
I made the <?php echo form_error(); ?>
beside each field
<?php echo form_open('c_login/login'); ?>
<table>
<tr>
<td>Username</td>
<td><?php $inusername=array('name' => 'username', 'class' => 'GUI'); echo form_input($inusername); ?></td>
<td class="error"><?php echo form_error('username'); ?></td>
</tr>
<tr>
<td>Password</td>
<td><?php $inpassword=array('name' => 'password', 'class' => 'GUI', 'type' =>'password'); echo form_input($inpassword); ?></td>
<td class="error"><?php echo form_error('password'); echo $this->session->flashdata('login'); ?></td>
</tr>
<tr>
<td>Jabatan</td>
<td><?php $injabatan=array('keuangan' => 'keuangan', 'admin' => 'admin', 'hd' => 'head divisi', 'direktur' => 'direktur'); echo form_dropdown('jabatan',$injabatan,'keuangan','class = "gui"'); ?></td>
<td class="error"><?php echo form_error('jabatan'); ?></td>
</tr>
<tr>
<td></td>
<td><?php $insubmit=array('name' =>'login','class' =>'button','value' => 'Login'); echo form_submit($insubmit); echo nbs(); $inreset=array('name' =>'reset','class' =>'button','value' => 'Hapus'); echo form_reset($inreset); ?></td>
<td class="error"><?php echo form_error(); ?></td>
</tr>
</table>
<?php echo form_close(); ?>
How come the form_error()
function is not echo
ing anything when I click login with the username
and password
field left blank?
回答1:
you know problem in your validation you're checking validation in index method of your class not in login method of your class and in your form you have given action to ci_login/login method which is redirecting if login is failed and its clearing form validation validate your fields on login method also and put all error message in session and display, i have made some changes in script have look here on this link Code modified
for this changes you have to use url helper
function index()
{
$this->form_validation->set_rules('username','Username','trim|required|exact_length[4]|xss_clean');
$this->form_validation->set_rules('password','Password','trim|required|min_length[4]|max_length[40]|xss_clean|callback_login');
$this->form_validation->set_rules('jabatan','Jabatan','trim|required|xss_clean');
if($this->form_validation->run() == false)
{
$this->load->view('login');
}
else
{
//to check if the validation run correctly
//$this->load->view('welcome_message');
$username = $this->input->post('username');
$password = $this->input->post('password');
$jabatan = $this->input->post('jabatan');
$value = $this->m_login->login($username,$password,$jabatan);
if($value)
{
redirect('welcome_message');
//return true;
}
else
{
$this->form_validation->set_message('login', 'password salah');
redirect('c_login',$login); //i want to pass $login into login form, then print
return false; //them as a form_error
}
}
}
<?php echo form_open(uri_string()); ?>
<table>
<tr>
<td>Username</td>
<td><?php $inusername=array('name' => 'username', 'class' => 'GUI'); echo form_input($inusername); ?></td>
<td class="error"><?php echo form_error('username'); ?></td>
</tr>
<tr>
<td>Password</td>
<td><?php $inpassword=array('name' => 'password', 'class' => 'GUI', 'type' =>'password'); echo form_input($inpassword); ?></td>
<td class="error"><?php echo form_error('password'); echo $this->session->flashdata('login'); ?></td>
</tr>
<tr>
<td>Jabatan</td>
<td><?php $injabatan=array('keuangan' => 'keuangan', 'admin' => 'admin', 'hd' => 'head divisi', 'direktur' => 'direktur'); echo form_dropdown('jabatan',$injabatan,'keuangan','class = "gui"'); ?></td>
<td class="error"><?php echo form_error('jabatan'); ?></td>
</tr>
<tr>
<td></td>
<td><?php $insubmit=array('name' =>'login','class' =>'button','value' => 'Login'); echo form_submit($insubmit); echo nbs(); $inreset=array('name' =>'reset','class' =>'button','value' => 'Hapus'); echo form_reset($inreset); ?></td>
<td class="error"><?php echo form_error(); ?></td>
</tr>
</table>
<?php echo form_close(); ?>
回答2:
index
will not execute when login
does.
If appears that maybe you think the set_rules()
functions will execute when you submit the form. They won't. The form will submit to 'c_login/login'
, which is the login()
function inside your c_login
controller.
You need to move your form validation logic into login()
, and have index()
just echo the view for the first time.
Your Controller
function index(){
$this->load->view('login');
}
function login(){
$this->form_validation->set_rules('username','Username','trim|required|exact_length[4]|xss_clean');
$this->form_validation->set_rules('password','Password','required|xss_clean|correct');
$this->form_validation->set_rules('jabatan','Jabatan','trim|required|xss_clean');
if($this->form_validation->run() == false){
//your validation messages will be taken care of.
$this->load->view('login');
}
else{
$p = $this->input->post();
if($this->m_login->login($p['username'],$p['password'],$p['jabatan'])){
//redirect() user to logged in area.
}
else{
$this->form_validation->set_message('login', 'password salah');
$this->load->view('login');
}
}
}
Also, you shouldn't be trimming passwords. The space character is a perfectly valid suffix or prefix in a password. I've removed trim
for you. I've also removed the min_length
and max_length
. This is something you'd want to enforce on a signup page, are you sure it really adds any value on a login page?
回答3:
You need to supply form_error() with the field:
<?php echo form_error('username'); ?>
See more details here
回答4:
It looks to me that you have a big misunderstanding on how these things work. First of all, you don't need that redirect()
call in login()
. The redirect()
functions will redirect the user to another page, and since neither CodeIgniter nor PHP keep an object between page requests, you'd lose everything (e.g. The form validation object and its error messages).
Also, you might want to prefix that login()
method with an underscore (_
), so that no one can access it through an HTTP request.
You should probably submit the form to the index()
method instead of login()
. Then, make sure you only run the validation on a POST
request.
function index()
{
if ($_POST)
{
// run validation here
}
// ...
}
回答5:
**Simple form validation, image upload and captcha using codeigniter libraries**
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Login extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('Loginmodel');
}
public function index()
{
$config = array(
'img_path' => 'uploadss/',
'img_url' => base_url().'uploadss/',
'font_path' => base_url().'system/fonts/texb.ttf',
'img_width' => '200',
'img_height' => 90,
'word_length' => 3,
'font_size' => 25
);
$captcha = create_captcha($config);
// Unset previous captcha and set new captcha word
$this->session->unset_userdata('captchaCode');
$this->session->set_userdata('captchaCode', $captcha['word']);
// Pass captcha image to view
$fetch['captchaImg'] = $captcha['image'];
$fetch['data'] = $this->Loginmodel->alldata();
$this->load->view('login',$fetch);
}
public function loginerror()
{
$this->form_validation->set_rules('fname','first name','required|alpha');
$this->form_validation->set_rules('lname','last name', 'required');
$this->form_validation->set_rules('mobile', 'Mobile', 'required|numeric');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('companyname', 'Companyname', 'required');
$this->form_validation->set_rules('designation', 'Designation', 'required');
$this->form_validation->set_rules('companysize', 'Companysize', 'required|numeric');
if($this->form_validation->run())
{
$inputCaptcha = $this->input->post('captcha');
$sessCaptcha = $this->session->userdata('captchaCode');
if($inputCaptcha === $sessCaptcha)
{
echo 'Captcha code matched.';
$fname = $this->input->post('fname');
$lname = $this->input->post('lname');
$mobile = $this->input->post('mobile');
$email = $this->input->post('email');
$password = $this->input->post('password');
$companyname = $this->input->post('companyname');
$designation = $this->input->post('designation');
$companysize = $this->input->post('companysize');
$checkmobile = $this->Loginmodel->checkmobile($mobile,$email);
if($checkmobile)
{
$this->session->set_flashdata("danger","Mobile Number or Email exist.....");
return redirect('Login/index');
}
else
{
$insertdata = $this->Loginmodel->insert($fname,$lname,$mobile,$email,$password,$companyname,$designation,$companysize);
$this->session->set_flashdata("success","Record Inserted");
return redirect('Home/indexhome');
}
// }
// else
// {
// $this->session->set_flashdata("danger","Please fill all the values properly");
// $this->index();
// }
}
else
{
echo 'Captcha code does not match, please try again.';
$this->index();
}
}
else
{
$this->session->set_flashdata("danger","Please fill all the values properly");
$this->index();
}
}
public function refresh(){
// Captcha configuration
$config = array(
'img_path' => 'uploadss/',
'img_url' => base_url().'uploadss/',
'font_path' => base_url().'system/fonts/texb.ttf',
'img_width' => '200',
'img_height' => 90,
'word_length' => 3,
'font_size' => 25
);
$captcha = create_captcha($config);
$this->session->unset_userdata('captchaCode');
$this->session->set_userdata('captchaCode',$captcha['word']);
echo $captcha['image'];
}
public function upload($id)
{
if(!empty($_FILES['imagename']['name']))
{
$config['upload_path'] = 'uploadss/';
$config['allowed_types'] = 'jpg|jpeg|png|gif';
$config['file_name'] = $_FILES['imagename']['name'];
$this->load->library('upload',$config);
$this->upload->initialize($config);
if($this->upload->do_upload('imagename'))
{
$uploadData = $this->upload->data();
$imagename = $uploadData['file_name'];
}
else
{
echo "not upload";
}
}
else
{
echo "error";
}
$this->load->view('uploadimage');
}
public function uploadimageerror()
{
if(!empty($_FILES['imagename']['name']))
{
$config['upload_path'] = 'uploadss/';
$config['allowed_types'] = 'jpg|jpeg|png|gif';
$config['file_name'] = $_FILES['imagename']['name'];
$this->load->library('upload',$config);
$this->upload->initialize($config);
if($this->upload->do_upload('imagename'))
{
$uploadData = $this->upload->data();
$imagename = $uploadData['file_name'];
}
else
{
echo "not upload";
}
}
else
{
echo "error";
}
}
public function deletedata($id)
{
$dele = $this->Loginmodel->delete($id);
return redirect('Login/index');
}
}
?>
来源:https://stackoverflow.com/questions/12832491/simple-codeigniter-form-validation