【问题标题】:Ajax Call with Post in PHP在 PHP 中使用 Post 进行 Ajax 调用
【发布时间】:2012-07-30 23:06:48
【问题描述】:
<!doctype html>
<html>
<head>
  <title>jQuery Tagit Demo Page (HTML)</title>
  <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();
    var availableTags = [];

     $('#demo2').tagit({tagSource:availableTags});


     $('#demo2GetTags').click(function () {
        showTags($('#demo2').tagit('tags'))
      });

     /*
    $('li[data-value]').each(function(){
        alert($(this).data("value"));
    });*/

    $('#demo2').click(function(){
        $.ajax({
            url: "demo3.php",
            type: "POST",
            data: { items:list.join("::") },
            success: alert("OK")
        });
    });

    function showTags(tags) {


        console.log(tags);
        var string = "";
        for (var i in tags){
          string += tags[i].value+" ";
         }
          var list = string.split(" ");
          //The last element of the array contains " "
          list.pop();   
        }
    });
  </script>
</head>
<body>

<div id="wrap">
    <?php 

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

    ?>
<div class="box">
  <div class="note">
    You can manually specify tags in your markup by adding <em>list items</em> to the unordered list!
  </div>

    <ul id="demo2" data-name="demo2">
        <li data-value="here">here</li>
        <li data-value="are">are</li>
        <li data-value="some...">some</li>
        <!-- notice that this tag is setting a different value :) -->
        <li data-value="initial">initial</li>
        <li data-value="tags">tags</li>
    </ul>

  <div class="buttons">
    <button id="demo2GetTags" value="Get Tags">Get Tags</button>
    <button id="demo2ResetTags" value="Reset Tags">Reset Tags</button>
    <button id="view-tags">View Tags on the console </button>
  </div>
</div>

</div>
<script>
</script>
</body>
</html>

此代码只会传输 dostuff.php 中的项目列表,但是当我尝试在 PHP 上打印它时,什么都不会出现。这是为什么呢?

我正在这条线上做一个ajax请求

$('#demo2').click(function(){
            $.ajax({
                url: "demo3.php",
                type: "POST",
                data: { items:list.join("::") },
                success: alert("OK")
            });
        });

和PHP中的代码

<?php 

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

    ?>

【问题讨论】:

    标签: php javascript jquery post


    【解决方案1】:

    您希望print_r 的 PHP 结果在哪里“出来”?

    尝试将您的 AJAX 调用更改为此(只有 success 的值不同):

    $.ajax({
        url: "demo3.php",
        type: "POST",
        data: { items:list.join("::") },
        success: function(data, textStatus, jqXHR){
            alert(data);
        }
    });
    

    这样,您的 PHP 模板的输出(如果您以老式方式(即使用表单和整个页面重新加载)发布到它通常会看到)将显示在警报中。

    希望对您有所帮助。

    【讨论】:

    • 尝试将要通过 AJAX 访问的 PHP 代码放在不同的 PHP 文件中,而不是放在同一个文件中。
    • 它返回了一个空数组。
    【解决方案2】:

    鉴于信息有限,这只是在黑暗中的一枪,但您似乎希望从服务器发回的数据发生某些事情..但实际上您确实做到了什么都没有。成功后,它会显示一个警报...而不是其他任何东西。

    尝试将您的成功条目更改为以下内容:

    success: function(data) {
        $("#wrap").html(data);
    }
    

    这将使用来自POST 请求的数据填充 div。它显示为空的原因...,您没有加载当前正在执行的页面,其中包含 print_r 实际回显任何内容所需的数据。

    编辑:如何将值插入数据库;

    现在的数据库交互是使用自定义包装器或 php Data Object(也称为 PDO)完成的,而不是已弃用的 mysql_* 函数。

    首先,您准备好数据库对象,类似于上述已弃用函数中的连接方式:

    $dbh = new PDO("mysql:host=hostname;dbname=database", $username, $password);
    

    然后,您可以开始交互,准备查询语句..

    $stmt = $dbh->prepare("UPDATE table_name SET column1 = :column1 WHERE id = :id");
    

    在上述语句中绑定一个参数..

    $stmt->bindParam(':column1', $column1);
    $stmt->bindParam(':id', $id);
    $id = $_POST['id'];
    

    最后执行查询:

    try {
        $stmt->execute();
    }
    catch (Exception $e) {
        echo $e;
    }
    

    PDO 自动转义之前语句中绑定的任何字符串,使其免受 SQL 注入攻击,并加快了多次执行的过程。举个例子:

    foreach ($_POST as $id) {
        $stmt->execute();
    }
    

    由于 id 参数已经绑定到$id,您只需更改$id 并执行查询即可。

    【讨论】:

    • 但是如果我想将这些项目列表插入到数据库中怎么办?
    • @KyelJmD 然后在您的 php 页面上,您使用数据库交互代码处理这些值。让我给你一个使用 PDO 的例子。
    • Soo 项目列表将被插入到数据库中?我有点困惑。 $_POST['items'] 去哪儿了?我以为这个数据:{ items:list.join("::") },会在超级全局$_POST中添加项目
    • @KyelJmD 这是一个例子。它不应该是你直接复制的东西,而是从中推断出来的。
    • 我仍然很困惑,但我会尽力理解你的答案。我想要的只是使用 PHP 打印出项目列表,然后将它们插入数据库。但无论如何谢谢:)
    【解决方案3】:

    尝试为jQuery部分添加encodeURI,

    $.ajax({
      url: "demo3.php",
      type: "POST",
      data: { items: encodeURIComponent (list.join("::")) },
      success: function(response) {
                console.log(response);
      }
    });
    

    以及 PHP 部分的 urldecode:

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

    【讨论】:

      【解决方案4】:

      三件事

      设置您的 AJAX 的 success 以显示您的 PHP 脚本中给出的回声/打印

      success: function(result)
      {
          $("#somecontainer").html(result);
      }
      

      这样,在 PHP 脚本中打印的任何内容都将被放入,即

      <div id="somecontainer">
          Result of PHPcode here
      </div>
      

      第二个,而不是

      var string = "";
      for (var i in tags)
      {
          string += tags[i].value+" ";
      }
      
      var list = string.split(" ");
      //The last element of the array contains " "
      list.pop();   
      

      使用push()。这会将值添加到数组中下一个未占用的索引处:

      var string = "";
      for (var i in tags)
      {
          list.push(tags[i].value);
      }
      

      这样您就不必弹出最后一个元素。


      第三点:将您的 PHP 代码放在一个单独的文件中(以及您的 JavaScript/jQuery)。喜欢:

      /root/index.html
      /root/script/dostuff.php
      /root/script/myscript.js
      

      然后让你的 AJAX 调用url: "/script/dostuff.php"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多