【问题标题】:PHP overriding AJAX post requestPHP 覆盖 AJAX 发布请求
【发布时间】:2012-08-02 04:31:25
【问题描述】:

在我的代码中我有这个回调

 $('#tagList').tagit({
            //Every new dag will be pushed in the list array
            tagsChanged: function(tagValue,action,element){
                list.push(tagValue);
                $.ajax({
                    url: "dostuff.php",
                    type: "POST",
                    data:{ items:list.join("::")},
                    success: function(data){
                        $('#wrap').append(data);
                    }
                });
            }
         });

每次我添加标签时,新添加的标签都会被推送到数组中,然后它会发出 AJAX 发布请求。

然后我在这里有这些字段

<form method = "POST" action = "demo3.php">
News Title <input id = "news_title" type = "text" name = "news_title" /><br>
    <label>Insert Some tags </label>
    <ul id="tagList" data-name="demo2">
    </ul>
        <input type = "submit" name = "submit" id = "submit" value = "Post News" />
</div>
</form>

当我单击提交(它基本上重新加载页面)时,$_POST['items'](这是在每次添加新标签时根据 AJAX 请求创建的)正在 POST 全局数组中被擦除或删除。因此将我的 $_POST 全局数组留空。

无论如何我可以合并这两个吗?或者无论如何不要让 PHP 覆盖或删除 $_POST['items'] ?因为我的查询需要项目

我也在使用一个名为 tagit 的插件

如果你们有兴趣,这里是我的完整代码

<!doctype html>
<html>
<head>
  <script src="demo/js/jquery.1.7.2.min.js"></script>
  <script src="demo/js/jquery-ui.1.8.20.min.js"></script>
  <script src="js/tagit.js"></script>
  <link rel="stylesheet" type="text/css" href="css/tagit-stylish-yellow.css">
  <script>
    $(document).ready(function () {
    var list = new Array();
         $('#tagList').tagit({
            //Every new dag will be pushed in the list array
            tagsChanged: function(tagValue,action,element){
                list.push(tagValue);
                $.ajax({
                    url: "dostuff.php",
                    type: "POST",
                    data:{ items:list.join("::")},
                    success: function(data){
                        $('#wrap').append(data);
                    }
                });
            }
         });
    });
  </script>
</head>
<body>

<div id="wrap">
<div class="box">
<button class = "viewTags">View Tags</button>
<form method = "POST" action = "demo3.php">
News Title <input id = "news_title" type = "text" name = "news_title" /><br>
    <label>Insert Some tags </label>
    <ul id="tagList" data-name="demo2">
    </ul>
        <input type = "submit" name = "submit" id = "submit" value = "Post News" />
</div>
</form>
</div>
</body>
</html>

这里有一些东西。 php

 <?php 

        $lis = $_POST['items'];
        $liarray = explode("::", $lis);
        print_r($liarray);
        print_r($_POST);
 ?>

【问题讨论】:

  • PHP 不会“覆盖”$_POST。您进入 $_POST 的内容就是 PHP 收到的内容。如果 $_POST 是空的,那么你没有发送任何东西,或者它的格式不正确。
  • 哦,我明白了。我将如何合并 ajax 发出的 POST 请求和 PHP 接收的 POST?因为我两个都需要。
  • 这毫无意义。您是在问“我如何将奶奶送来的礼物与我从奶奶那里收到的礼物合并”?除非您的代码被冲洗,否则您的 JS 代码将发起一个单一的 http 请求,向您的服务器端 php 脚本执行一个单一的发布。
  • 我的问题是 $_POST 表现得很奇怪。当我不点击提交时,$_POST['items'] 在那里,但是当我点击提交时。只有 $_POST['news_title'] 和 $_POST['submit'] 没有发生任何事情

标签: php javascript jquery tags tag-it


【解决方案1】:

PHP 处理请求的方式是每个请求都与其他请求完全分离,这有时被称为无共享架构。这就是&lt;form&gt;demo3.php生成的请求不知道ajax发送给dostuff.php的其他请求的原因就是这种分离。这不一定是特定于 php 的,这是因为底层的 HTTP protocol 是无状态的。

如果您想在提交&lt;form&gt; 时生成的请求中包含标签,您需要将这些值添加到表单中。为此,tagit 库有一个由两个配置选项控制的内置方式:

  1. itemName 控制参数的名称(默认为item
  2. fieldName 控制 itemName 中的字段被调用的内容(默认为 tags

如果你像这样初始化你的插件(demo 没有样式):

$('#tagList').tagit({
    itemName: 'article',
    fieldName: 'tags'
});

然后在提交时,发送到 php 的参数应该在$_POST['article']['tags'],生成的参数名称将类似于article[tags][]。查看插件的demos。 (页面源有很好的格式化 javasript 示例)。默认情况下,只需调用 $('#tagList').tagit(); 而无需所有额外的回调或配置即可。

这就是它应该如何显示在 firebug 的网络面板中(不要介意 demo4.php 不在那里)


如果您想手动执行此操作,您可以像这样连接到 &lt;form&gt;submit 事件:

$('form').on('submit', function(){
    var $form = $(this), 
        tags = $('#tagList').tagit('assignedTags'); // see the docs https://github.com/aehlke/tag-it/blob/master/README.markdown#assignedtags
    $.each(tags, function(i, tag){
        $('<input type="hidden" name="tags[]">').attr('value', tag).appendTo($form); // using jquery to create new elements
    });
});

通过使用 tagit 插件的assignedTags 方法(使用 jquery ui 调用模式),您可以获得标签名称,并且只需在提交 &lt;form&gt; 之前添加一个新的隐藏输入。如果您可以包含任何可以想象的字符串,甚至是::,那么像这样将它们连接在一起可能不是一个好主意。

在示例中,我为每个标签使用了单独的输入,因此在您的 demo3.php 中它们将作为一个数组到达(以 [] 结尾的名称使 php 这样做)。

【讨论】:

  • 哇,它确实添加了标签!但它回应了这个“数组([0] => [object HTMLUListElement])”
  • 我很困惑,这是什么反应?
  • 在我提交表单之后,我在 PHP r 上使用了 print_r。它显示了这个“数组([news_title] => [submit] => Post News [tags] => Array ([0] => [object HTMLUListElement]))”我如何显示 [0] => [对象 HTMLUListElement]
  • 我认为您在某处将tag 拼错为tags。但是,tagit 插件内置了创建隐藏输入的方法。我已经更新了。答案。
  • 我已经用你的新答案更改了我的代码。但是当我提交表单时它仍然没有阅读 $_POST['article']['tag'] 我做错了什么?这是我的代码jsfiddle.net/bFJ2q/1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 2020-10-30
  • 2019-06-21
  • 2018-07-04
相关资源
最近更新 更多