【问题标题】:Codeigniter Form Validation in Model模型中的 Codeigniter 表单验证
【发布时间】:2013-12-31 17:55:38
【问题描述】:

大家好,这是我的第一个 CI 项目。

我的模型中有一个简单的表单验证功能。

function verify_login()
{

    //This method will have the credentials validation
    $this->load->library('form_validation');

    $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database');

    var_dump($this->form_validation->run());
    die;
    if ($this->form_validation->run() == FALSE) {
        //Field validation failed.  User redirected to login page
        $this->load->view('login_view');
    } else {
        //Go to private area
        redirect('home', 'refresh');
    }
}

这仅在控制器中而不在模型中时有效。当我尝试将变量从控制器传递到模型中的函数时,变量会被接收但不会处理。

有人可以启发我吗?谢谢。

【问题讨论】:

  • 你能说明你是如何调用这个函数的吗?以及如何将变量传递给模型?
  • 如果你不把“echo”或“print”放在var_dump前面,你什么都看不到

标签: php codeigniter


【解决方案1】:

在模型中进行表单验证很好。但是你想让验证返回 True 或 False 给你的控制器。不调用视图。所以喜欢

// in your Model lets call it Users
function verify_login()
{    
    $this->load->library('form_validation');

    $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|callback_check_database');

    if ($this->form_validation->run() == FALSE) {
       return FALSE ; 
    } else {
       return TRUE; 
    }
}

// Your callback function 


 // in Controller 
function verify(){

if( $this->users->verify_login() == FALSE ){  
// $this->errormessage will be available in any view that is called from this controller
$this-errormessage = "There was an error with your Log In. Please try again." ; 
$this->showLogin() ; } 

else { 
// set a session so you can confirm they are logged in on other pages
$this->setLoginSession($this->input->post('username', TRUE)) ; 
$this->showUserHome(); } 
}

另一件需要考虑的事情——人们经常知道他们的用户名,但会弄乱他们的密码。因此,如果您单独检查它们,您可以相应地调整错误消息。如果您检查用户名并且没有结果 - 您不需要检查密码并且在错误消息中您可以告诉他们没有该名称的用户。

【讨论】:

  • 比我的回答好多了。在这里我以为我知道 CI ;)
【解决方案2】:

我给你的最大建议是不要在你的模型中进行这样的验证。如果您在模型中进行验证,则需要直接针对数据库值而不是表单。

如果这能解决您的问题,请告诉我,如果没有,请发表评论,我将编辑我的答案。

更新:请忽略上面的一些内容,因为我脱离了理论而不是事实:)

我必须深入挖掘 CI 核心,才能很好地了解其中的问题所在。您的代码本身看起来不错。我唯一能看到的是您的回调可能不存在于您的模型中,而仅存在于您的控制器中。与以下内容相呼应,我认为这不是对模型的良好使用。

The docs on validations

【讨论】:

  • 是的,我可以检查模型中的数据库有效性,但是没有办法在模型中进行表单验证吗?
  • 我的表单可用于 CI 2.1.4 中的模型。对于初学者来说,这不是好的做法这一事实并不明显。我这周刚拿起CI。我将模型直接加载到控制器而不是自动加载器中。 $this->input->post('email') 无需向函数传递任何内容即可工作。
  • 表单验证和 $this->输入在 CI 模型中可用。这就是“瘦控制器”和“胖控制器”之间的区别——它只是一种风格偏好。我个人更喜欢模型中的“数据细节”,并使控制器尽可能抽象和高级。
  • @cartalot 我从未见过在模型、有效版本或任何类似的东西中使用表单验证,但我有 $this->input(遗憾的是在我自己的旧代码中)。不过,如果它有效,它就有效。我需要深入挖掘核心以弄清楚发生了什么。感谢您指出这一点!
  • 嘿,谢谢。这是另一种思考方式 - 假设您有一个联系表单,几个月后您添加了另一个表单字段。如果您在模型中进行验证 - 您的控制器根本不会改变。这就是“薄”控制器的一大优势。
【解决方案3】:
class Data_model extends CI_Model
{
public function rules()
    {
        return [
            ['field' => 'pertanyaan',
            'label' => 'pertanyaan',
            'rules' => 'required|is_unique[data.pertanyaan]'],

            ['field' => 'jawaban',
            'label' => 'jawaban',
            'rules' => 'required']
        ];
    }
}


class Datas extends CI_Controller
{
public function add()
    {
        $data = $this->data_model;
        $validation = $this->form_validation;
        $validation->set_rules($data->rules());
        if ($validation->run()) {
            $data->save();
            $this->session->set_flashdata('success', 'Berhasil disimpan');
        }

        $this->load->view("admin/data/new_form");
    }
}

【讨论】:

  • 您可能想为您的答案添加一些解释。这将显着改善您的答案。
猜你喜欢
  • 2016-10-23
  • 1970-01-01
  • 2021-05-13
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2017-02-06
相关资源
最近更新 更多