1

我正在使用 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)。我已经尝试了很多东西,但似乎无法将 new_option 转移到 php。我错过了一些明显的东西吗?提前感谢您的帮助!

4

5 回答 5

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: {new_option:'new_option'}

这将发送一个POST['new_option'] = 'new_option';. 您需要从值周围删除单引号:

data: {new_option:new_option}
于 2013-07-08T17:11:01.400 回答
0

好的,请尝试以下步骤:

1)打开google crome浏览器并转到您的应用程序链接

2) 按 Ctrl+Shift+J 将打开 crome 的调试器。选择网络选项卡。在第 4 步之前不要关闭此调试器

3)打开您的模态表单,然后单击提交。

4) Ajax 请求将显示在网络选项卡中。单击它将显示您的标题/预览/响应。在标头检查请求 URL 是否正确?如果没有,你有你的错误!

5)所以网址是正确的,我想。单击响应选项卡你看到了什么?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

我认为它会解决您的问题,或者至少您可能知道发生了什么..

于 2013-07-09T09:57:51.307 回答
0

在阅读了您的问题以及所有当前的答案和评论后,我唯一可以得出的结论是您在上面发布的所有代码都在同一个文件中。

所以$_POST['new_option']在你第一次访问页面时是未定义的,但应该在你发送请求时定义。

只需更改代码以isset()在访问之前检查要设置的值,错误就会消失。

<?php
if (isset($_POST['new_option'])) {
  // Do your stuff here
}

//编辑

一般来说,在同一个文件中包含该代码不是问题,但不要期望在使用浏览器请求页面时定义 $_POST 数据,因为没有。

当您使用浏览器打开页面时,它会向您的服务器发送一个 GET 请求,您的服务器将搜索相应的 PHP 脚本并将其连同请求中包含的所有信息一起传递给 PHP 处理器。因此,处理器将处理该脚本,执行其中的所有 PHP 代码,并将结果传递回您的 Web 服务器,该服务器会将其传送到您的浏览器。您的浏览器将收到的数据不再包含任何 PHP 代码。

现在您更改表单中的选项。这将触发您的 Javascript 代码,该代码向您的服务器发送 AJAX 请求,调用相同的 URL。但这次它是一个包含您的数据的 POST-Request。该过程几乎相同,但现在变量已设置,因此将由 PHP-Processor 评估。响应会发送到您的 Javascript 代码。

如果要保存接收到的数据,只需检查请求方法/是否设置了变量,如果保存则保存。

<?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'];else if分支中添加

  2. 用 Chrome 打开你的页面

  3. 打开开发者工具 ( https://developers.google.com/chrome-developer-tools/ )

  4. 打开网络选项卡

  5. 将过滤器设置为 XHR

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

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

  8. 点击它

现在您应该看到服务器对您的 POST 请求的响应,如果响应包含您发送的值,则您的代码有效

于 2013-07-08T18:05:42.583 回答
0

通过更改变量名称来尝试这个ajax也删除'变量周围的单引号

 var new_option_to_send = $('#add-new-text').val();

并在ajax通话中

 data: {new_option:new_option_to_send }
于 2013-07-08T17:06:45.460 回答
-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);
于 2013-07-08T17:20:15.977 回答