How to validate fields - codeigniter

I want to insert validate data into database.
My code is like below, where submit is my button name and name, email, mobile is my form fields:
if($this->input->post('submit'))
{
$name = $this->input->post('name');
$email = $this->input->post('email');
$mobile = $this->form_validation->set_rules('mobile', 'Mobile','trim|required|numeric');
$query = $this->my_model->insertdata($name, $email, $mobile);
}
How can I validate form fields if I have written code like above?

You should use Form Validation Library.
First, autoload it:
Open application/config/autoload.php and edit line 61 like below:
$autoload['libraries'] = array('form_validation');
Now, you can validate your form in your controller. Here is an example for you:
public function some_function()
{
$this->form_validation->set_rules('input_name', 'input human name', 'required');
if ($this->form_validation->run() === false)
{
//return some error here
}
else
{
// send data to your model (e.g. $this->Some_model->some_function())
}
}
Please see Form Validation Library Guide to see all references and examples. Also please follow this order for submitting forms: View -> Controller -> Model.

first, you are putting insecure data into your database.
$data = [
'name' => html_escape($this->input->post('name'),
'email' => html_escape($this->input->post('email'),
'mobile' => html_escape($this->input->post('mobile');
];
$this->form_validation->set_rules('mobile',Mobile','trim|required|numeric');
$this->form_validation->set_rules('name',name','trim|required');
$this->form_validation->set_rules('email',Email','trim|required|valid_email');
if ($this->form_validation->run() === false)
{
//print error
}else
{
$this->db->insert('TABLE', $data);
}

public function register()
{
$this->form_validation->set_rules('username', 'Usename Name', 'trim|required|min_length[3]|max_length[30]');
$this->form_validation->set_rules('email', 'Email ID', 'trim|required|valid_email|is_unique[jobseeker_registration.email]');
$this->form_validation->set_rules('mobile', 'Mobile', 'trim|required|numeric');
if ($this->form_validation->run() === false)
{ $this->load->view('register'); }
else
{
$data = array(
'name' => $this->input->post('name'),
'username' => $this->input->post('username'),
'email' => $this->input->post('email'),
'mobile' => $this->input->post('mobile'),
'password' => $this->input->post('password')
);
$this->Jobseeker_model->insertdata($data)
}
}
This code is work for me very well for form validation

Related

User not redirecting to the page after registering but registration working successfully in codeigniter

The problem here is that registration is working properly but it is not redirecting to certain page which i want.because to go to that page which is in another controller, id should be set on session .bt even after setting id to session it not working .help me out thank you..here is the code
controller
public function newregister()
{
if($this->session->userdata("passenger_id"))
return redirect("user/dashboard");
$this->load->view('userregister');
}
public function register()
{
$this->form_validation->set_rules('fname', 'Fullname', 'required|min_length[5]|max_length[42]|trim|alpha_numeric_spaces');
$this->form_validation->set_rules('uname', 'Username', 'trim|required|min_length[5]|max_length[12]|is_unique[passengers.uname]');
$this->form_validation->set_rules('dob', 'Date of birth', 'required');
$this->form_validation->set_rules('gender', 'Gender', 'required');
$this->form_validation->set_rules('mobile', 'Mobile Number', 'trim|required|max_length[10]|min_length[10]');
$this->form_validation->set_rules('city', 'City', 'required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
$this->form_validation->set_rules('pword', 'Password', 'trim|required|min_length[8]');
$this->form_validation->set_rules('confirmpword', 'Confirm Password', 'trim|required|min_length[8]|matches[pword]');
$this->form_validation->set_error_delimiters('<p class="text-danger">','</p>');
if($this->form_validation->run()){
$this->load->model('user_model');
$pdata=array(
'passenger_id'=>$this->input->post('passenger_id'),
'fname'=>$this->input->post('fname'),
'uname'=>$this->input->post('uname'),
'dob'=>$this->input->post('dob'),
'gender'=>$this->input->post('gender'),
'mobile'=>$this->input->post('mobile'),
'city'=>$this->input->post('city'),
'email'=>$this->input->post('email'),
'pword'=>sha1($this->input->post('pword')),
'confirmpword' =>sha1($this->input->post('confirmpword'))
);
if($this->user_model->user_validate($pdata))
{
$this->session->set_userdata($pdata);
$this->session->set_flashdata('message','You have successfully registered to SMS TravelBook... ');
return redirect('user/dashboard');
}
else{
$this->session->set_flashdata('message','Sorry failed to register');
return redirect('home/register');
}
}
else{
$this->newregister();
}
}
Model
public function user_validate($pdata)
{
return $this->db->insert('passengers',$pdata);
}
Your main issue seems to be that you're setting session before even saving data into the database. Also, keep in mind that you shouldn't store passwords in session, I've written the rectified code, comments are mentioned wherever necessary, you're free to tweak it according to your needs. Hope it helps you.
Controller
public function newregister()
{
if($this->session->userdata("passenger_id")){
redirect("user/dashboard");
}else{
$this->load->view('userregister');
}
}
public function register()
{
$this->form_validation->set_rules('fname', 'Fullname', 'required|min_length[5]|max_length[42]|trim|alpha_numeric_spaces');
$this->form_validation->set_rules('uname', 'Username', 'trim|required|min_length[5]|max_length[12]|is_unique[passengers.uname]');
$this->form_validation->set_rules('dob', 'Date of birth', 'required');
$this->form_validation->set_rules('gender', 'Gender', 'required');
$this->form_validation->set_rules('mobile', 'Mobile Number', 'trim|required|max_length[10]|min_length[10]');
$this->form_validation->set_rules('city', 'City', 'required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
$this->form_validation->set_rules('pword', 'Password', 'trim|required|min_length[8]');
$this->form_validation->set_rules('confirmpword', 'Confirm Password', 'trim|required|min_length[8]|matches[pword]');
$this->form_validation->set_error_delimiters('<p class="text-danger">','</p>');
if($this->form_validation->run()){
$pdata=array(
'passenger_id' => '', // empty because no value yet(value not inserted in db)
'fname' => $this->input->post('fname'),
'uname' => $this->input->post('uname'),
'dob' => $this->input->post('dob'),
'gender' => $this->input->post('gender'),
'mobile' => $this->input->post('mobile'),
'city' => $this->input->post('city'),
'email' => $this->input->post('email'),
'pword' => sha1($this->input->post('pword')),
'confirmpword' => sha1($this->input->post('confirmpword'))
);
$this->load->model('user_model');
$dbId = $this->user_model->user_validate($pdata); // get the inserted id
if($dbId) // check if query was successful
{
$pdata=array(
'passenger_id' => $dbId,
'fname' => $this->input->post('fname'), // or $pdata['fname']
'uname' => $this->input->post('uname'), // or $pdata['uname']
'dob' => $this->input->post('dob'), // ...
'gender' => $this->input->post('gender'),
'mobile' => $this->input->post('mobile'),
'city' => $this->input->post('city'),
'email' => $this->input->post('email'),
'pword' => sha1($this->input->post('pword')), // avoid storing password in session
'confirmpword' => sha1($this->input->post('confirmpword')) // avoid storing password in session
);
/* or you could just do - $pdata['passenger_id'] = $dbId;(because rest of the data is same) */
$this->session->set_userdata($pdata);
$this->session->set_flashdata('message','You have successfully registered to SMS TravelBook... ');
redirect('user/dashboard');
}
else{
$this->session->set_flashdata('message','Sorry failed to register');
redirect('home/register');
}
}
else{
$this->newregister();
}
}
Model
public function user_validate($pdata)
{
return ($this->db->insert('passengers', $pdata)) ? $this->db->insert_id() : false; // return insert_id if successful else return false
}

How can i avoid image required in edit form if image exist in laravel?

I am adding and editing a user with same function (Store), when ever i add a user it asks me image is required but whenever i edit a user which have image it also ask me image is required and i want if a image is already present it wont ask me , please see my above code i had recently changed my code according to Gurpal singh
In my controller
public function rules()
{
$child_details = Children::findOrFail($inputs['id']);
$rules = [
'child_name' => 'required',
'gender' => 'required',
'dob' => 'required',
'current_class' => 'required',
'b_group' => 'required',
'm_tongue' => 'required',
'image' => 'image',
];
if ($child_details->notHavingImageInDb()){
$rules['image'] = 'required|image';
}
return $rules;
}
public function Postchild(Request $request)
{
$data = \Input::except(array('_token')) ;
$validator = \Validator::make($data,$rules);
$inputs = $request->all();
if ($validator->fails())
{
return redirect()->back()->withInput()->withErrors($validator->messages());
}
if(!empty($inputs['id'])){
$child_details = Children::findOrFail($inputs['id']);
}else{
$child_details = new Children;
}
$child_details->parent_id = Auth::User()->id;
$child_details->child_name = $inputs['child_name'];
$child_image = $request->file('image');
if($child_image){
$tmpFilePath = 'uploads/childrens/';
$extension = $child_image->getClientOriginalExtension();
$hardPath = str_slug($inputs['child_name'], '-').'-'.md5(time());
$img = Image::make($child_image);
//$img->resize(180)->save($tmpFilePath.$hardPath.'-b.jpg');
$img->fit(250, 250)->save($tmpFilePath.$hardPath.'.'.$extension);
$child_details->image = $hardPath.'.'.$extension;
}
$child_details->save();
if(!empty($inputs['id'])){
return \Redirect()->route('child_list')->with('success', 'Child has been updated');
}else{
return \Redirect()->route('child_list')->with('success', 'Child has been added');
}
}
You can use Conditionally Adding Rules Not having image in database
Add this in model
public function notHavingImageInDb()
{
return (empty($this->image))?true:false;
}
This is the validation rule request
public function rules()
{
$user = User::find(Auth::id());
$rules = [
'name' =>'required|max:100',
'image' =>'image',
];
if ($user->notHavingImageInDb()){
$rules['image'] = 'required|image';
}
return $rules;
}
Don't forgot to import auth and user model
ie
use App\User;
use Auth;
for more detail click here
You can normally do like below :
$rule = array(
'name' => 'required',
);
if (!empty($inputs['id'])) {
$user = User::findOrFail($inputs['id']);
} else {
$rule["image"] = "required";
$user = new User;
}
It is better to separate them or simply create another function. But you can put an if statement that if the image is in the request or not.
Like this:
if(! isset($data['image'])){ //if the image is not in the request
//Your code
}
else{ //if the image is in the request
//Your code
}
If you want a code for storing, renaming, moving an image feel free to request.
You can use validation's after hook.
public function Postchild(Request $request)
{
//Define your rules
$rules = [
'child_name' => 'required',
'gender' => 'required',
'dob' => 'required',
'current_class' => 'required',
'b_group' => 'required',
'm_tongue' => 'required',
];
//Validate your data
$data = $request->except('_token');
$validator = \Validator::make($data,$rules);
$validator->after(function ($validator) {
//Check the mode of request (Create or Update)
if(!empty($data['id'])){
$child_details = Children::findOrFail($data['id']);
if($child_details->image == null){
$validator->errors()->add('image', 'Image field is required');
}
}
});
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput();
}
}
Just this few lines can solve your problems... You have to check there image have or not.
Rules in a private or protected function
private function validateRequest($request)
{
//This is for Update without required image, this will check that In DB image have or not
$child_image = Children::find($request->id);
$rules = [];
if ($child_image) :
if ($child_image->image == null):
$rules['image'] = 'required|image|max:1999';
endif;
//This is for regular validation
else :
$rules = [
'image' => 'required|image|max:1999',
];
endif;
return $rules;
}

Ion Auth - Create_User In Another Controller Does Not Work

I've taken the "auth" controller and copied it and renamed it as "site". I have renamed the references to views etc. to "site". When I go to www.mysite/index.php/site/create_user the form loads fine. However on hitting submit I get redirected to www.mysite.com/index.php/site/login and nothing is added to the database. Can anyone tell me why this does not work? My site controller is below:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Site extends CI_Controller {
//
//Authentication
//
function __construct()
{
parent::__construct();
$this->load->database();
$this->load->library(array('ion_auth','form_validation'));
$this->load->helper(array('url','language'));
$this->form_validation->set_error_delimiters($this->config->item('error_start_delimiter', 'ion_auth'), $this->config->item('error_end_delimiter', 'ion_auth'));
$this->lang->load('auth');
}
//Function to log the user in
function login()
{
$this->data['title'] = "Login";
//validate form input
$this->form_validation->set_rules('identity', 'Identity', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
if ($this->form_validation->run() == true)
{
// check to see if the user is logging in
// check for "remember me"
$remember = (bool) $this->input->post('remember');
if ($this->ion_auth->login($this->input->post('identity'), $this->input->post('password'), $remember))
{
//if the login is successful
//redirect them back to the home page
$this->session->set_flashdata('message', $this->ion_auth->messages());
redirect('/', 'refresh');
}
else
{
// if the login was un-successful
// redirect them back to the login page
$this->session->set_flashdata('message', $this->ion_auth->errors());
redirect('site/login', 'refresh'); // use redirects instead of loading views for compatibility with MY_Controller libraries
}
}
else
{
// the user is not logging in so display the login page
// set the flash data error message if there is one
$this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message');
$this->data['identity'] = array('name' => 'identity',
'id' => 'identity',
'type' => 'text',
'value' => $this->form_validation->set_value('identity'),
);
$this->data['password'] = array('name' => 'password',
'id' => 'password',
'type' => 'password',
);
$this->_render_page('site/login', $this->data);
}
}
//Function to log the user out
function logout()
{
$this->data['title'] = "Logout";
// log the user out
$logout = $this->ion_auth->logout();
// redirect them to the login page
$this->session->set_flashdata('message', $this->ion_auth->messages());
redirect('site/login', 'refresh');
}
//Function to create a user
function create_user()
{
$this->data['title'] = "Create User";
if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin())
{
//redirect('site/login', 'refresh');
}
$tables = $this->config->item('tables','ion_auth');
// validate form input
$this->form_validation->set_rules('first_name', $this->lang->line('create_user_validation_fname_label'), 'required');
$this->form_validation->set_rules('last_name', $this->lang->line('create_user_validation_lname_label'), 'required');
$this->form_validation->set_rules('email', $this->lang->line('create_user_validation_email_label'), 'required|valid_email|is_unique['.$tables['users'].'.email]');
$this->form_validation->set_rules('phone', $this->lang->line('create_user_validation_phone_label'), 'required');
$this->form_validation->set_rules('company', $this->lang->line('create_user_validation_company_label'), 'required');
$this->form_validation->set_rules('password', $this->lang->line('create_user_validation_password_label'), 'required|min_length[' . $this->config->item('min_password_length', 'ion_auth') . ']|max_length[' . $this->config->item('max_password_length', 'ion_auth') . ']|matches[password_confirm]');
$this->form_validation->set_rules('password_confirm', $this->lang->line('create_user_validation_password_confirm_label'), 'required');
if ($this->form_validation->run() == true)
{
$username = strtolower($this->input->post('first_name')) . ' ' . strtolower($this->input->post('last_name'));
$email = strtolower($this->input->post('email'));
$password = $this->input->post('password');
$additional_data = array(
'first_name' => $this->input->post('first_name'),
'last_name' => $this->input->post('last_name'),
'company' => $this->input->post('company'),
'phone' => $this->input->post('phone'),
);
}
if ($this->form_validation->run() == true && $this->ion_auth->register($username, $password, $email, $additional_data))
{
// check to see if we are creating the user
// redirect them back to the admin page
$this->session->set_flashdata('message', $this->ion_auth->messages());
redirect("site", 'refresh');
}
else
{
// display the create user form
// set the flash data error message if there is one
$this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message')));
$this->data['first_name'] = array(
'name' => 'first_name',
'id' => 'first_name',
'type' => 'text',
'value' => $this->form_validation->set_value('first_name'),
);
$this->data['last_name'] = array(
'name' => 'last_name',
'id' => 'last_name',
'type' => 'text',
'value' => $this->form_validation->set_value('last_name'),
);
$this->data['email'] = array(
'name' => 'email',
'id' => 'email',
'type' => 'text',
'value' => $this->form_validation->set_value('email'),
);
$this->data['company'] = array(
'name' => 'company',
'id' => 'company',
'type' => 'text',
'value' => $this->form_validation->set_value('company'),
);
$this->data['phone'] = array(
'name' => 'phone',
'id' => 'phone',
'type' => 'text',
'value' => $this->form_validation->set_value('phone'),
);
$this->data['password'] = array(
'name' => 'password',
'id' => 'password',
'type' => 'password',
'value' => $this->form_validation->set_value('password'),
);
$this->data['password_confirm'] = array(
'name' => 'password_confirm',
'id' => 'password_confirm',
'type' => 'password',
'value' => $this->form_validation->set_value('password_confirm'),
);
$this->_render_page('site/create_user', $this->data);
}
}
//Function to render the page
function _render_page($view, $data=null, $returnhtml=false)//I think this makes more sense
{
$this->viewdata = (empty($data)) ? $this->data: $data;
$view_html = $this->load->view($view, $this->viewdata, $returnhtml);
if ($returnhtml) return $view_html;//This will return html on 3rd argument being true
}
}
This exact code works when in the auth controller. When in the site controller I make it so you must login and you must be an admin to make a user (i.e. uncommenting out this line //redirect('site/login', 'refresh');) then it also works, but for some reason when that line is commented it works in the auth controller but not the site controller.
Any help is much appreciated. I've tried to figure it out but can't see why it works in one and not the other (and why it works in site but only as an admin when that code is uncommented and not at all when it is commented, whilst in auth it works in either case).
Thanks in advance.
The reason you get redirected is one of two reasons.
First : $this->_render_page('site/login', $this->data);
When you hit the submit button it is still pointing to the login controller.
Second : if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin())
The create user function in the Auth controller is for admins only, You will have to // out the code or you will be redirected to the login page due to not being logged and not being an admin.
try this:
//$this->_render_page('site/login', $this->data);
//if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin())
By marking out these two lines you should be able to veiw and submit your page without being redirected.
:)

Laravel validation differences on update and save

I'm using Jeffrey Way's model validation (https://github.com/JeffreyWay/Laravel-Model-Validation) to validate both on save and update. With this method, let's say you fill a update some fields on an entry, then call the save() method, the validation will run on all the fields currently set on the entry. But if the validation requires a field, say the email address, to be unique, the validation will fail because it already exists:
User.php:
protected static $rules = [
'email' => 'required|email|unique:users',
'firstname' => 'required',
'lastname' => 'required'
];
Controller.php:
// Get user from id
$user = User::find($id);
// Update user
$user->update($data);
// Validation when model is saved, via Way\Database\Model
if ($user->save())
{
return Response::json([
'data' => $user->toArray()
], 200);
}
if ($user->hasErrors())
{
return Response::json([
'errors' => $user->getErrors()
]);
}
Will return errors because the email address failed the validation. So, with this method, how do you tell the validator to ignore the unique rule for the email?
I think I use similar behaviour with different approach. Using this model, I thing you shold override the validate method to get the rules from a custom method, in witch you could set your new rules for existing models.
Something like this could work:
protected function processRules($rules = array()) {
$result = [];
if (empty($rules)) {
$rules = static::$rules;
}
// Add unique except :id
$replace = ($this->exists()) ? ',' . $this->getKey() : '';
foreach ($rules as $key => $rule) {
$result[$key] = str_replace(',:' . $this->getKeyName(), $replace, $rule);
}
return $result;
}
And override your validate method to call the proccessRules method.
public function validate() {
$v = $this->validator->make($this->attributes, $this->processRules(static::$rules), static::$messages);
if ($v->passes()) {
return true;
}
$this->setErrors($v->messages());
return false;
}
So now, you can define your email rule as required|email|unique:users:id, and when its a new User the rule should be required|email|unique:users and when you update the User with id 1234 the rule will be required|email|unique:users:1234.
I hope it works fine for you.
I've had this problem! I decided the problem on their own.
protected static $rules = [
'email' => $user->email == Input::get('email') ? 'required|email' : 'required|email|unique:users',
'firstname' => 'required',
'lastname' => 'required'
];
You cannot do it using this package, because you need to pass id for the unique rule. You could do it this way:
protected static $rules = [
'email' => 'required|email|unique:users,email,{id}',
'firstname' => 'required',
'lastname' => 'required'
];
and extend this model to add your custom validation method to replace {id} with id attribute

CodeIgniter. Update where id problem

I'm trying to update a contact and only update the contact depending on the id.
Model:
function updateContact() {
$data = array(
'title' => $this->input->post('title'),
'first_name' => $this->input->post('first_name'),
'surname' => $this->input->post('surname'),
'phone_number' => $this->input->post('phone_number'),
'fax' => $this->input->post('fax'),
'email' => $this->input->post('email')
);
$this->db->where('id', $this->uri->segment(3));
$this->db->update('contacts', $data);
}
Controller:
function update() {
$this->load->model('league/add_contact_model');
$data['rows'] = $this->add_contact_model->viewContact();
// field name, error message, validation rules
$this->form_validation->set_rules('title', 'Title', 'trim|required');
$this->form_validation->set_rules('first_name', 'First Name', 'trim|required');
$this->form_validation->set_rules('surname', 'Surname Name', 'trim|required');
$this->form_validation->set_rules('phone_number', 'Phone Number', 'trim|required');
$this->form_validation->set_rules('email', 'Email', 'trim|required');
if($this->form_validation->run() == FALSE)
{
$data['main_content'] = "league/update_contact";
$this->load->view('includes/template', $data);
}
else
{
if($query = $this->add_contact_model->updateContact())
{
$this->load->view('includes/top');
$this->load->view('includes/header');
$this->load->view('league/contact_updated');
$this->load->view('includes/footer');
}
else
{
$this->load->view('includes/top');
$this->load->view('includes/header');
$this->load->view('league/about_added');
$this->load->view('includes/footer');
}
}
}
It's updating if the where statement isn't there, but obviously it just updates everything, so just unsure of how the where statement should be written.
Thanks in advance for any help :)
function updateContact( $id ) {
....
$this->db->where('id', $id );
in your controller make sure that id (segment(3)) is valid before execute Model method
Just to add to bensius comment, you really shouldn't have $this->uri->segment(3) in the model. This should belong in your controller.

Resources