将键值对作为单个数据Ajax发布

时间:2016-08-30 16:23:04

标签: javascript php jquery ajax codeigniter

我正在构建一个使用Ajax将数据发布到我的Codeigniter控制器的函数。问题如下。

Codeigniter需要单独的帖子数据(没有对象)才能让我完全验证数据。否则,我需要将验证规则用作离散方法,而某些规则(如xss_clean)不能作为离散方法使用(请参阅CI docs)。因此,我需要像这样在Ajax中发送数据。

data: {
    username: username,
    password: password
},

我现在有一个传递给post函数的数组。

{'username': $("#username").val(), 'password': $("#password").val()};

我需要将此数组重建为上面的Ajax数据方式。我在Ajax POST函数中尝试了for循环和.each()函数,但这不起作用。

任何关于如何解决此问题并允许我将数组传递给post函数的任何想法,但也允许我将这些数据分开以便使用Codeigniter进行验证。

3 个答案:

答案 0 :(得分:1)

我设法使用Stackoverflow上的this问题来解决问题。 Codeigniter需要POST数据才能正确验证数据。要验证每个数据,需要分离数据。这是我尝试用我的Ajax POST功能实现的。 Ajax POST函数发布所有表单数据的数组,未分隔。使用此数组,我无法使用Codeigniter规则验证数据。

此问题的解决方案不是在Ajax发布时尝试分离此数据,而是在后端获取此POST数据时。 POST数据由后端作为对象获取。通过在PHP中循环此POST数据,可以声明新的POST索引,就好像它们是由表单本身直接发布一样。这听起来有点神秘,这里的代码可能会澄清它:

login.php (查看) - 包含表单的页面,该表单将数据发布到名为' postajax'的函数中。这是包含基本Ajax发布请求的函数。

$(document).ready(function(){ 
    $("#submit").click(function(){
        postvalues = {username: $("#username").val(), password: $("#password").val()};
        postajax('Login', postvalues);
        return false;
    });
});

Login.php (控制器) - 控制器处理POST数据。要验证此文件中的数据,需要分离POST数据。

foreach($_POST['data'] as $key => $value){
    $_POST[$key] = $value;
}

现在,POST数据按照Codeigniter的预期分开,并且可以对数据使用正常验证。例如,如果数据数组包含键值对username => 'Testuser',则可以像普通表单一样验证它。

$this->form_validation->set_rules('username', 'Username', 'required');

非常感谢您的帮助!

这是我的post.js文件,带有POST功能。

function postajax(page, postvalues){
    $("#result").empty();
    $.ajax({
        type: "POST",
        url: page, 
        data: {
            data: postvalues
        },
        dataType: "text",  
        cache:false,
        beforeSend: function(){
            $("#loading").css({ visibility: "visible"});
        },
        success: 
        function(data){
            $("#loading").css({ visibility: "hidden"});
            $('#result').html(data);
        }
    });
 }

答案 1 :(得分:0)

要在Ajax的帮助下发布数据,请使用JSON.stringify()方法。如下

 data : JSON.stringify({username: $("#username").val(), password: $("#password").val()})

它会将Javascript对象转换为JSON文本,并将该JSON文本存储在字符串

答案 2 :(得分:0)

我认为你有你需要的东西

{'username': $("#username").val(), 'password': $("#password").val()};

我假设它是AJAX调用的data:选项的值。

该对象将出现在$_POST数组中的服务器上。例如,如果输入的值是“姓名”。和' thisisthepassword'那么var_dump($_POST);将产生

array (size=2)
  'username' => string 'A Name' (length=6)
  'password' => string 'thisisthepassword' (length=17)

使用CI方法,您可以像这样访问发布的数据

$username = $this->input->post('username');
$password = $this->input->post('password');

JQuery完成将对象转换为适当的数据结构以便发布到服务器的所有工作。