为什么ajax没有发布字符串?

时间:2013-07-08 17:02:38

标签: php jquery ajax

我正在使用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。我错过了一些明显的东西吗在此先感谢您的帮助!

5 个答案:

答案 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请求是否按预期进行,请尝试:

  1. echo $_POST['new_option'];分支

  2. 中添加else if
  3. 使用Chrome打开您的页面

  4. 打开开发人员工具(https://developers.google.com/chrome-developer-tools/

  5. 打开“网络”标签

  6. 将过滤器设置为XHR

  7. 通过更改选项来触发您的请求

  8. 现在应该在该列表中弹出一个新请求

  9. 点击它

  10. 现在您应该看到服务器对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);
相关问题