【问题标题】:Codeigniter Form Validation pass value instead field nameCodeigniter 表单验证传递值而不是字段名称
【发布时间】:2014-09-30 12:43:10
【问题描述】:

我正在使用 Codeigniter,并且我有一个动态创建的表单,其中包含很多输入字段。我正在使用 jQuery 和 AJAX 提交表单,并将表单中的所有数据作为对象传递。这是我的 jQuery 代码:

$('body').on("submit", "#app-options-form", function(evnt){
    // Show loader while AJAX is loading
    $('.response-container').html('<img class="response-loader" src="<?php echo base_url();?>/img/loader.gif" >');

    // Prevent form submission
    evnt.preventDefault();

    // Get all form inputs
    var inputs = $('#app-options-form :input[type="text"]');

    // Put them in object as name=>value
    var data = {};

    for(i=0; i<inputs.length; i++) {
        data[inputs[i]["name"]] = inputs[i]["value"];
    }

    // Generate POST request
    $.post("<?php echo site_url("admin/ajax_app_options"); ?>",
    {"edit_form_submited" : true, "data" : data},
    function (data) {
        $('.response-container').html(data.result);
    }, "json");
});

我在验证该表单时遇到了困难。如果我将字段名称作为 set_rules() 的参数,它将不起作用,因为它将查找 $_POST['field_name'] 但这不存在。该字段的值作为 $_POST['data']['field_name'] 传递,因为我将所有输入作为名为“data”的对象传递。

那么,有什么方法可以验证这个表单吗?

编辑:

我的 PHP 代码:

// Get received data, here are all the input fields as $field_name=>$field_value
$data = $this->input->post('data');

// Try no. 1 for setting the rules
foreach($data as $key=>$value)
{
    $this->form_validation->set_rules($key, 'Vrijednost', 'trim|xss_clean|max_length[5]');
}

// Try no. 2 for setting the rules
foreach($data as $key=>$value)
{
    $this->form_validation->set_rules($value, 'Vrijednost', 'trim|xss_clean|max_length[5]');
}

// Try no. 3 for setting the rules
foreach($data as $key=>$value)
{
    $this->form_validation->set_rules($this->input->post('data')['$key'], 'Vrijednost', 'trim|xss_clean|max_length[5]');
}

这些是我设置规则的尝试,但它们都不起作用

【问题讨论】:

  • 我不知道您的问题是否来自 javascript 方面,但无论如何尝试发送整个表单而不是像这样 var data = $('#app-options-form' 自己执行 foreach ).serialize();
  • 感谢您的回答。我明白你想说什么,但这不是一个选择。我必须将所有这些信息发送到一个对象或数组中。输入字段的名称是动态生成的,所以我需要将它们放在一个数组中。一旦我在 PHP 中收到这些数据,我不知道我有哪些输入字段,所以我必须使用 foreach 遍历这个数组。

标签: javascript jquery forms codeigniter


【解决方案1】:

我没有对此进行测试,但它应该可以工作!

$("body").on("submit", "#app-options-form", function() {

    // Prevent form submission
    evnt.preventDefault();

    // Show loader while AJAX is loading
    $('.response-container').html('<img class="response-loader" src="<?php echo base_url();?>/img/loader.gif" >');

    var form = $(this).serializeArray();
    var data =  {data: form};

    $.post("<?php echo site_url('admin/ajax_app_options'); ?>", data, function(response) {
        $('.response-container').html(response.result);
    }, "json");
});

当您使用$.post 发送序列化字符串时,它会在另一端以数组的形式出现:)

希望这会有所帮助!

编辑后

从上面删除var data = {data: form};

然后用php做:

foreach ($this->input->post() as $key => $value) {
    $this->form_validation->set_rules($key, 'Vrijednost', 'trim|xss_clean|max_length[5]');
}

您的代码不起作用的原因是Form_validation 将在$_POST 数组中查找键,但它需要在$_POST['data'] 内部查找。

另一个选项(这将毫无意义,但使用数据数组)将是:

$data = $this->input->post('data');

foreach ($data as $key => $value) {
    $this->form_validation->set_rules("data[$key]", 'Vrijednost', 'trim|xss_clean|max_length[5]');
}

我不能说这肯定会奏效。

【讨论】:

  • 感谢您的回答,但我认为您没有明白这里有什么问题。如果我有一个字段,例如 name="username",通过序列化它将作为 $_POST['username'] 发送。但我需要它在一个数组中,比如 $_POST['data']['username']。我的 Javascript 代码没问题,它按预期工作。但我的问题更多与如何将这些数据传递给 codeigniter 的验证表单有关。我想绕过它的 set_rules 函数来提供值而不是字段名。
  • “我想绕过它的 set_rules 函数来提供值而不是字段名”是什么意思?为什么?
  • 我的英语很差,所以我不知道如何表达自己。所以,我有很多输入,它们是动态创建的。他们的名字也是动态创建的。所以在 PHP 中,我不知道我必须处理多少个字段以及它们的名称属性,所以我必须将它放在数组中才能遍历所有字段。例如,如果我有 3 个字段并且我的名称属性是:1-3-1、2-5-3、3-5-4。如果我将它们作为 $_POST['1-3-1'] = "some_value" 等发送,我将如何在 PHP 中获取它们?我不知道这个名字“1-3-1”。所以我必须像这样在数组中发送它 $_POST['data']['1-3-1'] = "some value" ....
  • 我用我的 PHP 代码更新了我原来的问题,所以看看吧。
  • 谢谢,我不知道我可以将 foreach 与 $this->input->post() 一起使用。我会试试这个,它应该工作。
猜你喜欢
  • 2011-12-05
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2013-02-17
  • 2013-05-13
  • 1970-01-01
相关资源
最近更新 更多