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

时间:2014-01-31 14:41:57

标签: database forms codeigniter post record

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

情况就是这样。

我有一个“编辑个人资料”页面。 在该页面上,您可以像名称所暗示的那样编辑个人资料信息。

这里的示例是我正在尝试做的。

数据库记录:

||-------||----------||-----------||
|| 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忽略没有数据的数组项。

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

1 个答案:

答案 0 :(得分:2)

使用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)
  3. 永远不要相信你的控制器。我在CI中使用的最好的DRY方法是在我的模型中 我使用变量

    模型/ 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-&gt; db-&gt; insert之前的每个数据库调用中;或更新;你只需使用

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

    这将验证您的所有请求;

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

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