我正在尝试通过AJAX请求向Codeigniter发布新闻稿表单。 我正在使用CSRF保护。 我有以下代码,我似乎无法获取发布的值,因此没有正确回复。 发生了几件不同的事情:
如果我将其删除,那么我将以下打印到控制台,这意味着它会转到控制器,但不会获取帖子值。 (undefined是对ajax()函数的响应
未定义
对象{状态:“错误”,消息:“请填写正确的电子邮件地址”,电子邮件:“电子邮件:”}
如果我保留name =“email”并在ajax()的顶部执行console.log(data),那么我将值作为不同的对象获取,如下所示
本发明的课题,本发明的课题
对象名称:“csrf_test_name”值:“e31943d629f0a47d449f21997c220446”
对象名称:“email”值:“my@email.com”
我正在尝试在不同的函数中使用表单和AJAX请求,以便在创建新表单时再次编写表单处理程序。
有谁可以指出我做错了什么?我相信序列化的格式有些东西我不明白。目前我只登录到控制台,因为我迷失在错误的地方。
HTML
<form role="form" id="subscriber_form">
<input id="csrf" type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>"/>
<div class="alert hidden" id="returnmessage">
</div>
<div class="form-group form-group-default input-group">
<label>Email address</label>
<input type="email" id="email" name="email" class="form-control" placeholder="name@company.com" required />
</div>
<button id="subscribe_submit" class="btn btn-success btn-block" type="button">Subscribe!</button>
</form>
Javascript(JQuery 1.11.1)
function ajaxSubmit(form,url,data){
console.log(data);
$.ajax({
type: 'POST',
url: url,
dataType: 'JSON',
data: data,
success: function (response) {
console.log(response);
}
});
}
$('#subscribe_submit').click(function(e){
e.preventDefault();
var form = '#subscriber_form';
var url = 'subscribers/save_subscriber';
var data = $(form).serializeArray();
var response = ajaxSubmit(form, url, data);
console.log(response)
});
PHP(Codeigniter 3.0)
function save_subscriber(){
$data = array(
'email' => $this->input->post('email'),
'created' => date('Y-m-d H:i:s')
);
$success_response = array(
'status' => 'success',
'message'=> 'You now subscribe to our newsletter'
);
$error_response = array(
'status' => 'error',
'message'=> 'Please fill in a correct email address',
'email' => " Email: ". $data['email']
);
$valid_email = validate_email($data['email']);
if ($data['email'] != "" && $valid_email == TRUE) {
$this->_insert($data);
$response = $success_response;
}
else{
$response = $error_response;
}
echo json_encode($response);
}
此外,我尝试使用ajaxSetup和JQuery cookie进行设置,但没有成功,因为我无法将数据导入函数。我认为这是全球性的。
$.ajaxSetup({
data: {
"csrf_test_name": $.cookie('csrf_cookie_name')
}
});
修改 我已经解决了这个问题。我打开了记录
$config['log_threshold'] = 2;
并发现我在从CI 2.0复制的模型中出错。这解决了获取帖子值的问题。
拟订一项 我也意识到我无法按照上面的AJAX请求解释,因为这会使请求不是异步的,或者在等待响应时停止浏览器。
答案 0 :(得分:1)
而不是使用:
var data = $(form).serializeArray();
使用
var data = $(form).serialize();
方法serialize()
生成由$_POST
或$_GET
serializeArray()
创建了完全不同的结构,如:
[
{
name: "email",
value: "1"
},
{
name: "password",
value: "2"
}
]
答案 1 :(得分:0)
问题已经解决了。答案与问题没有直接关系。我打开登录Codeigniter并发现其他地方的错误,但没有显示。谢谢你的帮助。