Database Codeigniter忽略更新数据库记录上的空数组项

Database Codeigniter忽略更新数据库记录上的空数组项,database,forms,codeigniter,post,record,Database,Forms,Codeigniter,Post,Record,嘿,伙计们,我已经为此工作了几天,但我似乎无法让它工作:( 情况是这样的 我有一个“编辑个人资料”页面。 在该页面上,您可以(顾名思义)编辑配置文件信息 这里的例子就是我要做的 数据库记录: ||-------||----------||-----------|| || name || surname || email || ||-------||----------||-----------|| || Amy || Nuts || an@no.com || ||----

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

情况是这样的

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

这里的例子就是我要做的

数据库记录:

||-------||----------||-----------||
|| name  ||  surname ||   email   ||
||-------||----------||-----------||
||  Amy  ||   Nuts   || an@no.com ||
||-------||----------||-----------||
我有一个表单,允许用户输入自己的数据并更改某些字段

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

<input name="name" ......
<input name="surname" ......
<input name="email" .....
在通过codeigniter的更新函数运行此命令之后,数据库记录如下所示

||-------||----------||-----------||
|| name  ||  surname ||   email   ||
||-------||----------||-----------||
||       ||   NEW    ||           ||
||-------||----------||-----------||
我想知道的是,是否有可能让codeigniter忽略没有数据的数组项

我希望你们能帮忙。 我在这里不知所措。

在发送到数据库之前,使用数组过滤器($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');
在所有情况下,您都应该在将数据提交到数据库之前验证数据

仅作一般说明:

我建议您始终有两层验证

  • 在控制器处验证表单(使用CI表单\ U验证)
  • 验证数据的at模型(也使用CI form_验证)
  • 永远不要只相信你的控制器。我在CI中使用的最佳干燥方法是在我的模型中 我使用变量

    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;或update;之前的每个数据库调用中,只要使用

    $this->is_valid($data,'update'); // dont set 2nd param if you are inserting and want all rules to apply;
    
    这将验证您的所有请求

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


    很抱歉,我的回答太长了,我希望我回答了您的问题。

    我使用codeigniter:)内置的表单验证,而且我的XSS筛选在codeigniter配置中始终处于启用状态。我非常同意你应该在把数据发送到数据库之前验证数据。在过去,当我不知道如何做时,我在这方面遇到了一些问题;)我从中学到:P但是谢谢你的回复。我会尽快试一试!在我的基本核心模型中使用一些代码更新了答案,以自动验证我对数据库的所有查询;很棒的编辑。我将把这个页面放在我的收藏夹中:)谢谢again@Zalaboza:我刚看过你的答案,我面临着同样的问题,我正在使用存储过程更新数据库记录。为了更新字段,我传递了字段数组。使用代码时,未执行更新查询。
    $this->is_valid($data,'update'); // dont set 2nd param if you are inserting and want all rules to apply;