【问题标题】:Codeigniter ignore empty array items on update database recordCodeigniter 忽略更新数据库记录上的空数组项
【发布时间】:2014-01-31 14:41:57
【问题描述】:

嘿,伙计们,我已经为此工作了几天,但我似乎无法让它工作:(

情况如下。

我有一个“编辑个人资料”页面。 顾名思义,您可以在该页面上编辑个人资料信息。

这里的例子是我想要做的。

数据库记录:

||-------||----------||-----------||
|| name  ||  surname ||   email   ||
||-------||----------||-----------||
||  Amy  ||   Nuts   || an@no.com ||
||-------||----------||-----------||

我有一个表单,让用户能够输入自己的数据并更改某些字段。

表单字段都有与数据库字段对应的名称。

<input name="name" ......
<input name="surname" ......
<input name="email" .....

这一切都非常合乎逻辑和容易。

我遇到的问题是提交表单时。 我用 HTML5 构建我的网站,并为表单字段使用占位符。 我这样做是因为它看起来不错,我可以用它做一些实验。 当我只想更新姓氏时,其他字段保持空白。 默认情况下,Codeigniter 在帖子为空的情况下返回“false”。

也许你能看到我的问题。

当我将帖子数据发送到模型并更新数据库记录时,它会从“姓名”和“电子邮件”字段中删除数据并更新姓氏。

数组如下所示:

array(
    "name"    =>
    "surname" => NEW
    "email"   =>
)

通过codeigniter的更新功能运行后,数据库记录如下所示

||-------||----------||-----------||
|| name  ||  surname ||   email   ||
||-------||----------||-----------||
||       ||   NEW    ||           ||
||-------||----------||-----------||

我想知道的是,是否有可能让 codeigniter 忽略没有数据的数组项。

希望大家帮忙。 我在这里不知所措。

【问题讨论】:

    标签: database forms codeigniter post record


    【解决方案1】:

    使用 array_filter($data) 删除任何空字段,然后将其发送到数据库。

    您似乎还没有验证您的数据以进行更新?

    能否请您在模型中显示代码以存储更新?

    例子

    $data['name']=$this->input->post('name');
    $data['lastname']=$this->input->post('lastname');
    
    $data=array_filter($data); //will remove empty keys
    
    Or
    
    if($this->input->post('name')) $data['name']=$this->input->post('name');
    if($this->input->post('lastname')) $data['name']=$this->input->post('lastname');
    

    在所有情况下,您都应该在将数据提交到数据库之前始终对其进行验证;

    只是一般说明:

    我建议您始终进行 2 层验证;

    1. 在控制器上验证表单(使用 CI form_validation)
    2. 在模型上验证 DATA(也使用 CI form_validation)

    永远不要只相信你的控制器。我在 CI 中使用的最佳 DRY 方法是在我的模型中 我使用变量

    models/demo_model.php

    public $validate =array(
    ['field' => 'login','label' => 'lang:user_login','rules' => 'trim|required|min_length[5]|max_length[100]|xss_clean'],
    ['field' => 'password','label' => 'lang:user_password','rules' => 'trim|required|min_length[5]|max_length[35]|xss_clean']);
    
    function is_valid($data,$mode=null){
    
    if(!$this->validate || empty($data) )return false; //nothing to validate !
    
    $config=array();
    
    //if updating then its normal that some variables will be missing
    //so lets apply rules for only data we going to update; to make sure its xss_clean, not exceed database size, trim, etc;;
    if($mode = 'update'){ 
        foreach($this->validate as $rule)if( ! empty( $data[ $rule['field'] ] )$config[]=$rule
    }else{
        $config = $this->validate
    }
    
    $this->form_validation->reset_validation();
    $this->form_validation->set_data($data); #we are not using $_post;
    $this->form_validation->set_rules($config);
    
    return ($this->form_validation->run() === TRUE)
    
    }
    

    现在在您使用 $this->db->insert 之前的每个数据库调用中;或更新;你只是使用

    $this->is_valid($data,'update'); // dont set 2nd param if you are inserting and want all rules to apply;
    

    这将验证您的所有请求;

    还要注意,codeigniter form_validation 也可以用于修改提交的值; 例如在密码字段上使用修剪规则或 md5 规则

    很抱歉,我可能会延长我的答案太长,我希望我回答了你的问题。

    【讨论】:

    • 我使用内置于 codeigniter 的表单验证 :) 此外,我的 XSS 过滤在我的 codeigniter 配置中始终处于启用状态。我非常同意您应该始终在将数据发送到数据库之前对其进行验证。过去,当我不知道该怎么做时,我遇到了一些问题;)我从中学到了:P但是谢谢您的答复。我会尽快尝试的!
    • 用我在基本核心模型中使用的一些代码更新了答案,以自动验证我对数据库的所有查询;
    • 伟大的编辑。我会把这个页面放在我的收藏夹中:) 再次感谢
    • @Zalaboza :我刚刚完成了你的回答,我遇到了同样的问题,我正在使用存储过程来更新数据库记录。对于更新字段,我正在传递字段数组。使用您的代码更新查询时未执行。
    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多