【问题标题】:Form validation for multiple text input Codeigniter多文本输入 Codeigniter 的表单验证
【发布时间】:2013-01-25 01:18:10
【问题描述】:

表单中的数组值始终是 CI 中表单验证的问题。现在我必须输入多个值,这些数组值将存储在 DB 中。现在用户可能会误将某些字段留空,如下链接所示:

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);
}

预url函数:

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

【问题讨论】:

  • 您是否在添加文本框?
  • 您能展示您尝试过的CodeIgniter 代码吗?
  • @SheikhHeera 没有什么新鲜事。我刚刚创建了一个回调函数public function null_check($str) 并将 $str 作为参数提供给它。添加了多个值,但它仅在 $str 中获取单个字符串,而不是完整的数组。在回调函数中,我将添加上述代码,如本机 PHP 中的问题中一样,不包括 DB 查询。但只有当数组可用时我才能这样做。
  • 你是静态生成还是动态生成这些文本字段
  • @Venkat 在按钮点击事件上动态。

标签: php codeigniter validation


【解决方案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'));

【讨论】:

  • 我已经知道了。这不是我的问题。一些文本框可以是空白的。假设用户想要添加 3 个值,但他错误地生成了 4 个文本框,那么他无法删除额外的文本框。因此,如果她输入 3 个值并将第 4 个文本框保持空白,则数组中的空白值将被截断并存储在 DB 中,这将是回调函数的工作。
  • 在这种情况下,您可以删除required规则或使用客户端检查删除提交前的空文本框。
  • 但是如果你不进行服务器端验证,人们仍然可以破解
  • - 我删除了required,但我也不能接受空值。 -是的,我也会这样做。我正在考虑创建一个 - 按钮来删除文本框。
  • @SilentAssassin,更新了我的答案。
【解决方案2】:

这是一个简单的过程

这样设置消息

$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);
}   

【讨论】:

  • 你确定$this-&gt;input-&gt;post('txtSiteName'); 会获取完整的数组吗?
  • 如果你使用了 checkboxes 数组,这也是一样的。如果您不确定是否在回调方法中直接访问 $_POST['txtSiteName']。
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 2013-02-17
  • 2013-05-13
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多