2014-01-31 56 views
0

嗨,我一直在這幾天,但現在我似乎無法得到它的工作:(笨忽略更新數據庫記錄空數組項

這裏的情況。

我有一個「編輯個人資料」頁面。 在該頁面中,您可以像顧名思義,編輯個人資料信息。

對於這裏的例子是我想要做的事。

數據庫記錄:

||-------||----------||-----------|| 
|| name || surname || email || 
||-------||----------||-----------|| 
|| Amy || Nuts || [email protected] || 
||-------||----------||-----------|| 

我有一個表單,可以讓用戶輸入自己的數據並更改一些字段。

表單字段都具有與數據庫字段相關的名稱。

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

這是非常合乎邏輯和容易的。

我的問題是當我提交表單。 我使用HTML5構建我的網站,併爲表單字段使用佔位符。 我這樣做是因爲它看起來不錯,我可以用它做一些實驗。 當我只想更新姓氏時,其他字段保持空白。 默認情況下Codeigniter在空郵件項目的情況下返回「false」。

也許你可以看到我的問題。

當我將發佈數據發送到模型並更新數據庫記錄時,它將從「名稱」和「電子郵件」字段中刪除數據並更新姓氏。

數組是這樣的:

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

通過笨數據庫記錄看起來像這樣

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

什麼,我想知道的是,在更新功能運行在此之後,如果有一個可以讓codeigniter忽略沒有數據的數組項。

我希望你們能幫忙。 我在這裏不知所措。

回答

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. 在模型驗證數據(也使用CI form_validation)

永遠不會孤單相信自己的控制器來驗證表單。我在CI用最好的幹法是,在我的模型 我使用可變

型號/ 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) 

} 
現在

在使用之前,每個數據庫調用$這個 - > DB->插入;或更新;你只需使用

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

這將驗證您的所有請求;

也注意codeigniter form_validation也可以用於修改提交的值; 例如使用修剪規則,或密碼字段上的md5規則

對不起,我可能高壓延長我的答案太久,我希望我回答你的問題。

+0

我使用內置到codeigniter的表單驗證:) 另外我的XSS過濾始終在我的codeigniter配置中。 我不能同意更多,你應該總是驗證數據發送到數據庫之前。 我以前遇到過一些問題,當時我不知道該怎麼辦;)我從中得知:P 但是,謝謝你的回覆。 我會盡快嘗試! – Controvi

+0

它工作完美! 謝謝。 – Controvi

+1

更新了一些我在基本核心模型中使用的代碼來自動驗證我對數據庫的所有查詢的答案; – Zalaboza