我正在构建一个使用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进行验证。
答案 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完成将对象转换为适当的数据结构以便发布到服务器的所有工作。