我正在构建一个函数,该函数使用Ajax将数据发布到我的Codeigniter控制器。问题如下:
Codeigniter需要单独的post数据(没有对象)来允许我完全验证数据。否则,我需要将验证规则用作离散方法,而有些规则,如xss_clean,不能作为离散方法使用(请参阅CI文档)。因此,我需要像这样在Ajax中发送数据。
data: {
username: username,
password: password
},
我现在有一个数组传递给post函数。
{'username': $("#username").val(), 'password': $("#password").val()};
我需要将这个数组重新构建为上面的Ajax数据。我尝试了Ajax POST函数中的循环和.each()
函数,但这不起作用。
任何人对如何解决这个问题有任何想法,并允许我将数组传递给post函数,但也允许我分离这些数据,以便用Codeigniter验证它。
要在Ajax的帮助下发布数据,只需使用JSON.stringify()方法。如下
data : JSON.stringify({username: $("#username").val(), password: $("#password").val()})
它将Javascript对象转换为JSON文本并将JSON文本存储在字符串
我设法在Stackoverflow上使用这个问题解决了这个问题。Codeigniter需要POST数据来正确验证数据。为了验证每个数据,需要将数据分开。这就是我试图用Ajax POST函数实现的。Ajax POST函数发送一个包含所有表单数据的数组,该数组为,未分隔为。对于这个数组,我无法使用Codeigniter规则验证数据。
这个问题的解决方案不是尝试在Ajax发布时分离这些数据,而是在后端获取这些POST数据时分离这些数据。POST数据由后端作为对象获得。通过在PHP中循环此POST数据,可以声明新的POST索引,就像表单本身直接发布一样。这听起来有点神秘,下面的代码可以澄清它:
login.php(view) -包含表单的页面,该表单将数据发送给名为'postajax'的函数。这是一个包含基本Ajax post请求的函数。
$(document).ready(function(){
$("#submit").click(function(){
postvalues = {username: $("#username").val(), password: $("#password").val()};
postajax('Login', postvalues);
return false;
});
});
Login.php(controller) -处理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);
}
});
}
我认为你有你需要的
{'username': $("#username").val(), 'password': $("#password").val()};
,我认为这将是AJAX调用的data:
选项的值。
该对象将出现在服务器端的$_POST
数组中。例如,如果输入值是'A Name'和'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完成将对象转换为适当的数据结构以便发布到服务器的所有工作。