2013-02-09 70 views
0

表單中的數組值始終是CI中表單驗證的一個問題。現在我必須輸入多個值,這些數組值將被存儲在數據庫中。現在用戶可以通過錯誤保留一些空白領域中的鏈接如下所示:多個文本輸入的表單驗證Codeigniter

Input values.

Values in the array on submission.

我以前this教程上+按鈕即可添加輸入框。提交時,空白值將被截斷,然後不會將數組值添加到數據庫中。我嘗試使用本地PHP中的示例程序,但無法在CI中實現它。

我用下面的代碼在本地PHP中插入值DB截斷空值:

<?php 
    include 'sql_connect.php'; 
    $str = array(); 
    for($i=0;$i<count($_POST["txtSiteName"]);$i++) 
    { 
     $str[] = $_POST["txtSiteName"][$i]; 
    } 
    $str = array_filter($str, function($item) {if(!is_null($item)) return $item;}); 
    foreach($str as $loop_str) 
    { 
     $arr_str[] = $loop_str; 
    } 
    for($k = 0; $k<count($arr_str);$k++) 
    { 
     mysql_query("INSERT INTO sitename (name) VALUES ('".$arr_str[$k]."')") or die(mysql_error()); 
    } 
    print_r($arr_str); 
?> 

我怎樣才能在CI實現這一目標? 我試着使用回調函數,但數組值沒有被傳遞給回調函數。

編輯:

下面的代碼顯示了我的回調函數:

在進入3個網址它被稱爲3倍。這是正常的嗎? 此外我的array_walk的回調函數不起作用。在另一個回調函數內調用回調函數是不可能的?

public function null_check() 
{ 
    $urls = $this->input->post('link_name'); 
    array_walk($urls, 'prepurl'); 
    var_dump($urls); 
} 

prepurl功能:

public function prepurl($item, $key) 
{ 
    $item = "http://".$item; 
} 
+0

你dunamically添加文本框運行此代碼或修改? – 2013-02-09 09:36:15

+0

@raheelshan是的,我是。 – SilentAssassin 2013-02-09 09:37:55

+0

你可以顯示你嘗試過的'CodeIgniter'代碼嗎? – 2013-02-09 09:54:12

回答

1

你的問題我不太清楚,但是既然你提到驗證多個文本框。所以,如果你的文本框是這樣的

<input type="text" name="txtSiteName[]" /> 
<input type="text" name="txtSiteName[]" /> 

那麼簡單,你可以使用

$this->form_validation->set_rules('txtSiteName[]', 'Site Name', 'required|xss_clean'); 

驗證所有文本框對空。

更新(在回調傳遞參數)

$this->form_validation->set_rules('txtSiteName[]', 'Site Name', 'callback_sitename_check[' . $this->input->post('txtSiteName') . ']'); 

function sitename_check($str, $sitenames) { 
    // $sitenames will be your textboxe's array 
} 

第一個參數是使用CodeIgniter默認所以第二個參數是參數。也可以看看insert_batch()來插入多條記錄。

你也可以做到這一點像

$this->form_validation->set_rules('txtSiteName[]', 'Site Name', 'callback_sitename_check'); 

function sitename_check() { 
    $sitenames = $this->input->post('txtSiteName'); 
} 

更新:(對於array_walk)

array_walk($urls, array($this, 'prepurl')); 
+0

我已經知道這一點。這不是我的問題。一些文本框可以是空白的。假設用戶想要添加3個值,但他錯誤地生成了4個文本框,那麼他不能刪除額外的文本框。因此,如果她輸入3個值並將第4個文本框保留爲空,那麼數組中的空白值將被截斷並存儲在DB中,這將是回調函數的工作。 – SilentAssassin 2013-02-09 10:07:23

+0

在這種情況下,您可以刪除'required'規則或使用客戶端檢查在提交之前刪除空的文本框。 – 2013-02-09 10:10:32

+0

但仍然有人可以破解,如果你不做服務器端驗證 – 2013-02-09 10:13:13

0

這裏是做

設置郵件這樣

的一個簡單的過程
$this->form_validation->set_rules('txtSiteName[]', 'Site Name', 'required|xss_clean|callback_check_array'); 

這裏是回調

function check_array() 
{ 
    $txtSiteName = $this->input->post('txtSiteName'); 
    $error = 0; 
    foreach($txtSiteName as $key => $value) 
    { 
     if(!empty($value)){ 
      $error = $error + 1; 
     } 
    }  
    if($error == 0){ 
     return TRUE; 
    }else{ 
     $this->form_validation->set_message('check_array', 'All fields are empty. Please provide at leaset 1'); 
     return FALSE; 
    } 
} 

當驗證全成根據您的要求

if ($this->form_validation->run() == FALSE) 
{ 
    $this->load->view('myform'); 
} 
else 
{ 
    $txtSiteName = $this->input->post('txtSiteName'); 
    foreach($txtSiteName as $key => $value) 
    { 
     if(!empty($value)){ 
      $data['name'] = $value; 
      $this->mymodel->insert($data); 
     } 
    } 
} 

模型法

function insert($data) 
{ 
    $this-db->insert('table_name',$data); 
} 
+0

你確定'$ this-> input-> post('txtSiteName');'會採用完整的數組嗎? – SilentAssassin 2013-02-09 10:45:51

+0

如果你已經使用複選框數組比這是同樣的事情。如果你不確定,直接訪問$ _POST ['txtSiteName']裏面的回調方法。 – 2013-02-09 10:51:02