嘿伙计们,我已经在这几天工作了,但我似乎无法让它工作:(
情况就是这样。
我有一个“编辑个人资料”页面。 在该页面上,您可以像名称所暗示的那样编辑个人资料信息。
这里的示例是我正在尝试做的。
数据库记录:
||-------||----------||-----------||
|| 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忽略没有数据的数组项。
我希望你们能帮帮忙。 我在这里不知所措。
答案 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层验证;
永远不要相信你的控制器。我在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规则
很抱歉,我可能会把答案延长太久,我希望我回答你的问题。