0

フォーム内の配列値は、CI のフォーム検証では常に問題になります。ここで、複数の値を入力する必要があり、それらの配列値は DB に格納されます。以下のリンクに示すように、ユーザーは誤っていくつかのフィールドを空白のままにしておくことができます。

入力値。

送信時の配列の値。

このチュートリアルを使用して、 +ボタンのクリック時に入力ボックスを追加しました。送信時に空白の値は切り捨てられ、null でない配列の値がデータベースに追加されます。ネイティブ PHP でサンプル プログラムを使用してこれを試しましたが、CI で実装できませんでした。

ネイティブ PHP で次のコードを使用して、null 値を切り捨てる 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 つの URL を入力すると、3 回呼び出されます。それは正常ですか?また、array_walk のコールバック関数が機能していません。別のコールバック関数内でコールバック関数を呼び出すことはできませんか?

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

プレプル関数:

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

2 に答える 2

1

あなたの質問は私には明確ではありませんが、複数のテキストボックスを検証すると述べたので. したがって、テキストボックスが次のようなものである場合

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

次に、単に使用できます

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

すべてのテキスト ボックスを null または空に対して検証します。

更新(引数をコールバックに渡すため)

$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デフォルトで使用されるため、2 番目の引数はパラメーターです。複数のレコードを挿入するには、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'));
于 2013-02-09T10:01:00.663 に答える
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);
}   
于 2013-02-09T10:19:25.800 に答える