Php CodeIgniter输入和验证

Php CodeIgniter输入和验证,php,codeigniter,validation,codeigniter-2,Php,Codeigniter,Validation,Codeigniter 2,我正在使用codeIgniter 2.2.2。 在一个控制器中,我捕获了输入,以便在验证失败时将其传递回视图,这样用户就不必从一开始就填充所有字段,我通过$data数组设置以下变量 $data['fullname'] = $this->input->post('fullName'); 但是当用户最初访问表单时,它给出如下错误 A PHP Error was encountered Severity: Notice Message: Undefined variable: ful

我正在使用codeIgniter 2.2.2。 在一个控制器中,我捕获了输入,以便在验证失败时将其传递回视图,这样用户就不必从一开始就填充所有字段,我通过$data数组设置以下变量

$data['fullname'] = $this->input->post('fullName');
但是当用户最初访问表单时,它给出如下错误

A PHP Error was encountered

Severity: Notice

Message: Undefined variable: fullname
如果我使用
$this->input->post('fullName')直接在视图中,不会触发任何错误,但我想从控制器传递它

第二个问题是,我将此输入的表单验证规则设置为
$this->form_validation->set_rules('fullName','fullName','required | alpha')
验证规则
alpha
甚至不允许使用空格,在这种情况下,我需要空格,因为表单字段是全名,其中必须有空格,例如“Albert Einstein”

我可以通过设置两个不同的表单输入字段“First Name”和“Last Name”来解决这个问题,但我不喜欢这样,因为我认为框架应该让我的生活更轻松,而不是更困难


下面是一个示例要点,显示了示例代码,它将触发我所说的错误

您错过了表单成功部分的
$data['fullname']=”
,但您已将代码加倍,并尽可能精简

我会怎么做。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Contact extends CI_Controller {

  public function index() {

    $this->load->library('form_validation');
    // Double check spelling of set rules make sure matches the input on the view name="" area
    $this->form_validation->set_rules('fullname', 'Full Name', 'required'); // Removed |alpha no need I think
    $this->form_validation->set_rules('email', 'Email Address', 'required|valid_email');
    $this->form_validation->set_rules('message', 'Message', 'required');

    $fullname = $this->input->post('fullname');

    if (isset($fullname)) {
        $data['fullname'] = $fullname;
    } else {
        $data['fullname'] = "";
    }

    $data['message'] = "";

    if ($this->form_validation->run() == false) {

        $this->load->view('site_header');
        $this->load->view('site_nav');
        $this->load->view('content_contact', $data);
        $this->load->view('site_footer');

    } else {

        $data['message'] = "The email has successfully been sent!";
        $this->load->view('site_header');
        $this->load->view('site_nav');
        $this->load->view('content_contact', $data);
        $this->load->view('site_footer');
    }
  }
}
试试这个

public function contact() {
    $this->load->library("session");
    $data['message'] = $this->session->flashdata("message");
    $data['fullname'] = $this->session->flashdata("fullname");
    $this->load->view('site_header');
    $this->load->view('site_nav');
    $this->load->view('content_contact', $data);
    $this->load->view('site_footer');
} 

public function send_email() {
    $this->load->library('form_validation');
    $this->form_validation->set_rules('fullName', 'Full Name', 'required|callback_fullname_check');
    $this->form_validation->set_rules('email', 'Email Address', 'required|valid_email');
    $this->form_validation->set_rules('message', 'Message', 'required');

    if ($this->form_validation->run() == false) {
        $this->session->set_flashdata("message", validation_errors());
        $this->session->set_flashdata("fullname", $this->input->post('fullName'));
    } else {
        $this->session->set_flashdata("message", "The email has successfully been sent!");
    }
    redirect("site/contact");
}

public function fullname_check($str) {
    if (! preg_match("/^([a-z0-9 ])+$/i", $str)) {
        $this->form_validation->set_message('fullname_check', 'The %s field can only be alpha numeric');
        return FALSE;
    } else {
        return TRUE;
    }
}
请避免将视图反复加载为干燥状态(不要重复)

编辑

尝试使用自定义验证规则来实现带有空格的字母数字字符串


希望它对您有用。

经过很长一段时间,我遇到了这个问题(我自己的问题)。当我开始学习CodeIgniter时,我问了这个问题

我在问题中问了两件事,下面是对这两个问题的最好答案

  • 捕获输入值并向用户显示的最佳方法是将输入的“值”属性设置为set_value(),设置为
    value=“”
    ,以防表单未成功提交,并且您希望避免用户再次填写表单字段
  • 我试图在CodeIgniter的核心中添加一条规则来实现(全名验证)功能,但是pull请求没有合并,所以我认为获得该功能的更好方法是使用他在回答中提到的@arkar aung方法
  • 当我今天看到它时,我当时使用的代码看起来很奇怪,它违背了最佳实践。请看我在Quora上关于的回答。

    
    类安全控制器扩展CI控制器{
    /**
    *加载添加安全性页面
    */
    公共职能指数(){
    $this->load->model('securities/Security_model');
    $data['security']=$this->security\u Model->get\u new();
    $this->load->view('securites\u view/index',$data);
    }
    公共功能添加(){
    附和“添加”;
    $this->load->model('securities/Security_model');
    $data['security']=$this->security_Model->get_new();//创建空字段
    $rules=$this->Security\u Model->rules;
    $this->form\u validation->set\u rules($rules);
    如果($this->form\u validation->run()==TRUE){
    }
    $this->load->view('securites\u view/index',$data);
    }
    }
    类安全模型扩展了CI模型{
    //把你的代码放在这里
    函数_u构造(){
    父项::_构造();
    }
    //验证规则
    public$rules=array(
    “cdsaccid”=>数组(
    '字段'=>'cdsaccid',
    “标签”=>“CDS帐户”,
    “规则”=>“修剪|必需”
    ),
    “comid”=>数组(
    “字段”=>“comid”,
    “标签”=>“公司名称”,
    “规则”=>“修剪|必需”
    )
    );
    //安全标准等级
    函数get_new(){
    $Security=new stdClass();
    $Security->cdsaccid='';
    $Security->comid='';
    退还$Security;
    }
    公共函数数组\u from\u post($fields){
    $data=array();
    foreach($fields作为$field){
    $data[$field]=$this->input->post($field);
    }
    返回$data;
    }
    }
    CDS Acc
    
    你的观点是什么?如果可能,请用视图编辑您的帖子,如果可能,请提供控制器方法和视图!让我把代码放在github上,然后提供链接,请稍等。谢谢你抽出时间!我不能提供完整的代码,但我会为这个视图和表单所在的视图提供控制器。只有您的控制器方法和视图就足够了,而不是整个项目!亲爱的@ArkarAung,我添加了示例gist的链接。我知道我没有使用好的实践,但根据PHP和CodeIgniter,代码仍然有效。:)谢谢你关于如何用干法做这件事的好建议!但它仍然不起作用:(只有在我使用$this->input->post('fullName')时)直接在视图中它是有效的。你将如何解决第二个问题?表单验证规则alpha/alpha\u numeric/alpha\u dash它们都不允许空格,有允许空格的规则吗?谢谢兄弟!实际上我想看看codeIgniter内部是否有某种内置方式,而不是使用变通方法,但我认为没有内置方式不幸的是,只有三种内置方法,即字母、字母数字和字母破折号。需要创建自定义规则来实现字母空间。
    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    class Site extends CI_Controller {
    
    public function contact() {
        $data['message'] = '';
    
        $this->load->view('site_header');
        $this->load->view('site_nav');
        $this->load->view('content_contact', $data);
        $this->load->view('site_footer');
    }
    
    public function send_email() {
        $this->load->library('form_validation');
    
        $this->form_validation->set_rules('fullName', 'Full Name', 'required|alpha');
        $this->form_validation->set_rules('email', 'Email Address', 'required|valid_email');
        $this->form_validation->set_rules('message', 'Message', 'required');
    
        if ($this->form_validation->run() == false) {
            $data['message'] = '';
    
            $data['fullname'] = $this->input->post('fullName');
    
            $this->load->view('site_header');
            $this->load->view('site_nav');
            $this->load->view('content_contact', $data);
            $this->load->view('site_footer');
        } else {
            $data['fullname'] = "";
    
            $data['message'] = 'The email has successfully been sent!';
    
            $this->load->view('site_header');
            $this->load->view('site_nav');
            $this->load->view('content_contact', $data);
            $this->load->view('site_footer');
        }
    }
    
    }
    
    public function contact() {
        $this->load->library("session");
        $data['message'] = $this->session->flashdata("message");
        $data['fullname'] = $this->session->flashdata("fullname");
        $this->load->view('site_header');
        $this->load->view('site_nav');
        $this->load->view('content_contact', $data);
        $this->load->view('site_footer');
    } 
    
    public function send_email() {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('fullName', 'Full Name', 'required|callback_fullname_check');
        $this->form_validation->set_rules('email', 'Email Address', 'required|valid_email');
        $this->form_validation->set_rules('message', 'Message', 'required');
    
        if ($this->form_validation->run() == false) {
            $this->session->set_flashdata("message", validation_errors());
            $this->session->set_flashdata("fullname", $this->input->post('fullName'));
        } else {
            $this->session->set_flashdata("message", "The email has successfully been sent!");
        }
        redirect("site/contact");
    }
    
    public function fullname_check($str) {
        if (! preg_match("/^([a-z0-9 ])+$/i", $str)) {
            $this->form_validation->set_message('fullname_check', 'The %s field can only be alpha numeric');
            return FALSE;
        } else {
            return TRUE;
        }
    }