大家好,我已经为此工作了几天,但我似乎无法使它起作用:(
这是情况。
我有一个“编辑个人资料”页面。顾名思义,您可以在该页面上编辑配置文件信息。
对于这里的示例,我正在尝试做。
数据库记录:
||-------||----------||-----------||
|| name || surname || email ||
||-------||----------||-----------||
|| Amy || Nuts || [email protected] ||
||-------||----------||-----------||
我有一个表格,可以使用户输入自己的数据并更改某些字段。
表单字段均具有与数据库字段对应的名称。
<input name="name" ......
<input name="surname" ......
<input name="email" .....
这都是非常合乎逻辑且容易的。
我遇到的问题是提交表单时。我使用HTML5构建我的网站,并在表单字段中使用占位符。我这样做是因为imo看起来不错,我可以尝试一下。当我只想更新姓氏时,其他字段保持为空。默认情况下,Codeigniter在发帖项目为空的情况下返回“ false”。
也许您可以看到我的问题。
当我将发布数据发送到模型并更新数据库记录时,它将从“名称”和“电子邮件”字段中删除数据并更新姓氏。
该数组如下所示:
array(
"name" =>
"surname" => NEW
"email" =>
)
通过codeigniter的更新功能运行此命令后,数据库记录如下所示
||-------||----------||-----------||
|| name || surname || email ||
||-------||----------||-----------||
|| || NEW || ||
||-------||----------||-----------||
我想知道的是,是否存在让Codeigniter忽略没有数据的数组项的可能性。
我希望你们能帮忙。我在这里茫然。
在将其发送到数据库之前,请使用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方法是在模型中使用变量
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规则
很抱歉,我可能会延长我的回答时间太长,希望我回答了您的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句