我正在使用ajax来实现一个带有文本字段的弹出窗口,该字段允许在下拉菜单中创建新选项而无需提交表单。它不太合适。关键问题似乎是我无法将字符串new_option获取到php。为什么$ _POST数组在下面是空的?
<script type="text/javascript">
$.ajaxSetup ({
cache: false
});
$('#upload_form option[value="addnew"]').click( function() {
// Show modal window
$('#add-new').modal('show');
$('#add-new-submit').on('click', function() {
// Get new option from text field
var new_option = $('#add-new-text').val();
console.log(new_option);
$.ajax({
type: "POST",
url: "<?php echo site_url(); ?>main/upload_page",
data: {new_option:'new_option'}
}).fail(function (jqXHR, textStatus, errorThrown) {
console.error("The following error occured: " + textStatus, errorThrown);
});
$('#add-new').modal('toggle');
});
});
</script>
<?php
$new_option = $_POST['new_option']; # <----- Gives Undefined index error
//var_dump($new_option);
// When I get this working this is how I'll get $new_option
if(isset($new_option))
{
$new_option = $_POST['new_option'];
$species = array($new_option => $new_option) + $species;
//print_r($new_option);
//print_r($species);
var_dump($new_option);
}
?>
在控制台中我看到输入的字符串(new_option),但是php在$ new_option = $ _POST ['new_option']中给出了错误(未定义的索引:new_option)。我已经尝试了很多东西,似乎无法将新的选项转移到php。我错过了一些明显的东西吗在此先感谢您的帮助!
答案 0 :(得分:3)
我的AJAX请求有几个问题:
1,网址
目前正在使用:
url: "<?php echo site_url(); ?>main/upload_page",
您需要确保URL正确,如果您查看源代码,它看起来是否正确,如果将其粘贴到浏览器中,您可以转到该URL。我假设您正在使用WordPress'site_url()
,它不会在域后添加斜杠。可能的解决方案:
url: "<?php echo site_url('/'); ?>main/upload_page",
2,DATA
目前您正在使用:
data: {new_option:'new_option'}
这将发送POST['new_option'] = 'new_option';
。您需要从值周围删除单引号:
data: {new_option:new_option}
答案 1 :(得分:0)
通过更改ajax
变量名称来尝试这一项,同时删除变量
'
var new_option_to_send = $('#add-new-text').val();
并在ajax
致电
data: {new_option:new_option_to_send }
答案 2 :(得分:0)
在阅读了您的问题以及所有当前的答案和评论后,我可以得出的唯一结论是您上面发布的所有代码都在同一个文件中。
首次访问页面时,$_POST['new_option']
将不会被定义,但应在发送请求时定义。
只需更改代码即可使用isset()
检查在访问之前要设置的值,错误应该消失。
<?php
if (isset($_POST['new_option'])) {
// Do your stuff here
}
// EDIT
一般来说,将代码放在同一个文件中并不是问题,但是在使用浏览器请求页面时不要指望定义$ _POST数据,因为没有。
当您使用浏览器打开页面时,它会向您的服务器发送GET请求,您的服务器将搜索相应的PHP脚本并将其传递给PHP处理器,以及请求中包含的所有信息。 因此,处理器将处理执行其中所有PHP代码的脚本,并将结果传回Web服务器,然后将其传送到您的浏览器。 您的浏览器将收到的数据不再包含任何PHP代码。
现在您更改表单中的选项。这会触发你的Javascript代码,它会向你的服务器发送一个AJAX-Request,调用相同的URL。但这次是包含您数据的POST请求。该过程几乎相同,但现在变量已设置,因此将由PHP处理器进行评估。并且响应将发送到您的Javascript代码。
如果要保存接收的数据,只需检查Request方法/是否设置了变量,如果已保存则保存。
<?php
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
?>
// your html/javascript stuff here
<?php
} else if (isset($_POST['new_value']) {
// do whatever you want with the received data
} else { // Not a valid request for this Script, send according HTTP-Status
http_response_code(400); // or header(' ', true, 400); if you're using a PHP-Version < 5.4.0
}
如果你想根据他选择的选项在用户浏览器中查看文档中的任何内容,则需要使用JavaScript进行更改。 PHP仅在服务器端运行,因此对客户端PC上的任何内容都没有影响。
要检查您的POST请求是否按预期进行,请尝试:
在echo $_POST['new_option'];
分支
else if
使用Chrome打开您的页面
打开开发人员工具(https://developers.google.com/chrome-developer-tools/)
打开“网络”标签
将过滤器设置为XHR
通过更改选项来触发您的请求
现在应该在该列表中弹出一个新请求
点击它
现在您应该看到服务器对POST请求的响应,如果响应中包含您发送的值,则代码可以正常工作
答案 3 :(得分:0)
确定尝试以下步骤:
1)打开google crome浏览器并转到您的应用链接
2)按Ctrl + Shift + J将打开crome的调试器。选择网络选项卡。不要关闭这个debuger直到步骤#4
3)打开你的模态表格,然后点击提交。
4)Ajax请求将显示在网络选项卡中。点击它将显示你的标题/预览/ respnse。在标题检查请求URL是否正确?如果没有,你得到了你的错误!
5)所以网址是正确的,我猜想。点击Response选项卡你看到了什么? var_dump($ _ POST)给出一个空数组,var_dump($ new_option)给出bool(false)?
6)打开你的控制器(主)方法(上传)并在上传方法中写下面的代码:
if($this->input->post()){
$new_option=$this->input->post("new_option");
//do what u want to do with it.
}else{
//no posting at all? lets see what u got
var_dump($_REQUEST);
}
7)从步骤#1到步骤#5重新开始
我认为它会解决你的问题,或者至少你可能知道发生了什么......
答案 4 :(得分:-1)
首先修改数据变量,如:
data: "new_option="+new_option, // like url encoding
其次,它是codeigniter代码吗?
<?php echo site_url(); ?>
然后在控制器“main / upload_page”中尝试:
$new_option = $this->input->post('new_option'); // only for codeigniter no other framework
另外,对于调试js + php ajax调用使用crome浏览器。它将在网络(Ctrl + Shift + J)选项卡中显示请求和响应。在PHP端尝试以下代码,以便您可以在网络选项卡中看到输出
var_dump($_POST);