【问题标题】:Sending POST parameters between PHP files using AJAX calls使用 AJAX 调用在 PHP 文件之间发送 POST 参数
【发布时间】:2019-01-19 08:06:50
【问题描述】:

我有一个 PHP 文件 test.php,它有一个简单的链接,单击该链接后,会调用 AJAX 函数将数据作为 POST 参数发送到另一个文件 testPHP.php。然后第二个文件接收来自 AJAX 调用的 POST 参数,然后警告 $_POST 数组中的内容。我面临的问题是,在第二个文件中,$_POST 数组是空的(我使用 print_r($_POST) 进行了检查),所以我认为数据没有通过。 这是 2 个文件:

test.php

  <a id="link" role="button" href="testPHP.php">Test</a>

  <script type="text/javascript">

  $("#link").click(function(e) {
    e.preventDefault();
    alert('function entered');
    $.ajax({
     url: "testPHP.php",
      type: "POST",
      data: {
        parameter1: 'test', 
        parameter2: 'test2'},
      success: function(msg) {
        alert('wow' + msg);
      }

    });
    alert('function end');
    document.getElementById('#link').setAttribute('href','testPHP.php');
  });

testPHP.php

if(isset($_GET))
{
  echo "<script>alert('GET is there');</script>";
  print_r($_GET);
}
if(isset($_POST))
{
  echo "<script>alert('POST is there')</script>";
  print_r($_POST);
}
if(isset($_POST['parameter1']))
{
  echo "<script>alert('$_POST is set')</script>";
  header('Location: HomePage.php');
}
else
{
  echo "<script>alert('No post variable set')</script>";
}

到目前为止,我尝试的是在成功执行 AJAX 调用时发送 SUCCESS 消息,它确实会提醒我 Success 消息。我还检查了第二个文件中 $_POST 数组的内容,以查看我是否以 POST 请求以外的格式接收数据(例如可能必须分解才能获取内容的字符串),但是$_POST 数组为空。 这是我重定向到第二页时得到的输出: 数组()数组() $_POST 和 $_GET(用于测试目的)数组为空。

我也浏览了 AJAX 文档,但无法让这个简单的 POST 数据传输工作。有人可以帮我解决这个问题,以便我了解如何正确发送 POST 参数并将数据接收到 $_POST['parameter1'] 和 $_POST['parameter2'] 字符串中,以便我可以进一步处理数据。

注意:我已经使用了 FORM 的 POST 方法,它使用隐藏的表单元素并且效果很好,但我想尝试这种方法以更好地了解 AJAX 的工作原理。

【问题讨论】:

  • console.log(msg); 放入您的成功函数中,然后使用浏览器的控制台查看数据。它说什么?
  • console.log(msg) 显示同一文件夹中其他 PHP 文件的完整代码。这里复制太长了,但是代码开头是这样 ...... .........
  • 我认为您在查看检查器而不是控制台查找控制台选项卡
  • 恐怕是控制台显示的内容。为了确认,我还在success函数中在msg旁边打印了“Test”,并在整个代码之后显示了“Test”。
  • 听起来不太对劲……你用的是什么浏览器

标签: javascript php ajax


【解决方案1】:

上述版本略有不同,应该可以帮助您解决问题。为了便于调试,它都是一页的,但是一旦单击按钮,您就可以清楚地看到正在运行的脚本。只需在 php 代码中 echoing javascript 并希望它会执行客户端是行不通的 - 简单地回显消息或 JSON 对象会更好。

<?php

    if( $_SERVER['REQUEST_METHOD']=='POST' ){
        ob_clean();

        print_r( $_POST );

        exit();
    }

?>
<!doctype html>
<html>
    <head>
        <title>jQuery - ajax experiments</title>
        <script src='//code.jquery.com/jquery-latest.js'></script>

    </head>
    <body>
        <a id='link' role='button' href='#'>Test</a>
        <script>
            $('#link').click(function(e) {
                e.preventDefault();
                alert('function entered');
                $.ajax({
                    url: location.href,
                    type: 'POST',
                    data: {
                        parameter1: 'test', 
                        parameter2: 'test2'
                    },
                    success: function(msg) {
                        alert( 'wow' + msg );
                    }

                });
                alert('function end');
            });
        </script>
    </body>
</html>

作为 2 个单独的页面(都在同一目录中,否则将页面编辑到 ajax 目标)

<!doctype html>
<html>
    <head>
        <title>jQuery - ajax experiments</title>
        <script src='//code.jquery.com/jquery-latest.js'></script>

    </head>
    <body>
        <a id='link' role='button' href='#'>Test</a>
        <br /><br />
        <script>
            $('#link').click(function(e) {
                e.preventDefault();

                $.ajax({
                    url: 'jquery-ajax-target.php',
                    type: 'POST',
                    data: {
                        parameter1: 'test', 
                        parameter2: 'test2'
                    },
                    success: function(msg) {
                        alert( 'wow' + msg );
                    }
                });
            });
        </script>
    </body>
</html>

还有 ajax 目标,jquery-ajax-target.php

<?php

    if( $_SERVER['REQUEST_METHOD']=='POST' ){
        ob_clean();

        $parameter1=( isset( $_POST['parameter1'] ) ) ? $_POST['parameter1'] : false;
        $parameter2=( isset( $_POST['parameter2'] ) ) ? $_POST['parameter2'] : false;


        $_POST['modified']=array(
            'p1'=>sprintf('modified %s', strrev( $parameter1 ) ),
            'p2'=>sprintf('modified %s', strrev( $parameter2 ) )
        );


        $json=json_encode( $_POST );
        echo $json;

        exit();
    }

?>

【讨论】:

  • 这作为一个文件工作,你能告诉我如何让它在两个不同的文件上工作吗?我尝试将 href="#" 更改为 href="indexPHP.php",然后在 indexPHP.php 中使用 PHP 代码的第一部分,但单击链接后页面不会重定向到第二页。
  • 2 个不同的页面解决方案不起作用,可能是 href="#" 将其重定向到同一页面,所以我将其更改为第二个文件位置,但它仍然没有重定向到那里,它只是提醒 $_POST 的内容。
  • 对我来说很好用——也可以使用#e.preventDefault() 应该停止到达 # href 属性
  • 您能解释一下代码的基本作用吗?我的印象是我们将 $_POST 数据发送到另一个 PHP 文件,然后在重定向到该文件后,我们可以提取 $_POST['parameter1'] 和 $_POST['parameter2'] 并显示它,但我确定这不是这里发生的事情
  • 没有redirection 继续 - 否则在这种情况下ajax 的意义何在?通过单击#link,您是正确的,因为 POST 请求被发送到另一个页面。另一个页面处理 POST 请求,对数据进行一些修改并发送响应。然后由 ajax 回调函数处理响应...简单...
【解决方案2】:

这是我的版本。它将向您的 ajax 返回一个 JSON 响应,该响应将在您的控制台中可见,以便于调试。

您的主页:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a id="link" role="button" href="#">Test</a>

<script>


$(document).ready(function(){

  $("#link").click(function(e) {
    e.preventDefault();
    console.log('function entered');
    $.ajax({
     url: "testPHP.php",
      type: "POST",
      dataType: 'json', //This tells your ajax that you are expecting a json formatted string as a response.
      data: {
        parameter1: 'test', 
        parameter2: 'test2'
      },
      success: function(msg) {
        console.log(msg); //This will show the results as an object in your console.

      }

    });
    console.log('Function End');
    //document.getElementById('#link').setAttribute('href','testPHP.php'); //Why are you doing this. It's not needed.
  });

});


</script>

您的 testPHP.php 页面:

$results = array();

if(isset($_GET)){


  $results[] = array(

    'GET' => 'TRUE',
    'getData' => $_GET   

  ); 

}

if(isset($_POST)){

  $results[] = array(

    'POST' => 'TRUE',
    'postData' => $_POST   

  ); 

}

echo json_encode($results);

这是对正在发生的事情的解释:

您通过触发某些事件来对您的 ajax 进行初始调用。在您的情况下,它是链接的点击。

click 函数会导致实际的 ajax 调用,它只是向testPHP.php 发送一个发布请求。

testPHP.php 接收 post 请求并使用 ajax 调用提供的数据执行某种操作。

testPHP.php 然后将某种答案发回给 ajax 函数。数据将在成功函数中可用。

然后您可以决定如何使用从testPHP.php 页面传回成功函数的数据。

这一切都是在没有刷新原始页面代码的情况下完成的。

您实际上并没有将您的用户重定向到另一个页面。您只是告诉您的页面转到另一个页面并执行一些操作,然后将其报告回原始页面供您执行操作。

希望对你有帮助。

【讨论】:

  • 感谢您对这个AJAX函数如何工作的解释,我现在已经大致了解了,打算进一步探索。不幸的是,由于我是 Stack Overflow 的新手,我的点赞已被记录但无法显示。
【解决方案3】:

删除脚本标签上的类型属性后它确实有效。我在主脚本标记之前使用&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;。它在这里工作。同时关闭脚本标签。我希望我能帮上忙。 还要改

document.getElementById('#link').setAttribute('href','testPHP.php');

document.getElementById('link').setAttribute('href','testPHP.php');

【讨论】:

    【解决方案4】:

    您的代码的问题是您正在使用 javascript 来更改属性,并且在 javascript 中,一旦您使用了 getElementById,您就不再需要使用 # 符号。尝试以下,它会正常工作。

    <?php
    
    if(isset($_GET))
    {
        echo "<script>alert('GET is there');</script>";
        print_r($_GET);
    }
    if(isset($_POST))
    {
        echo "<script>alert('POST is there')</script>";
        print_r($_POST);
    }
    if(isset($_POST['parameter1']))
    {
        echo "<script>alert('$_POST is set')</script>";
        header('Location: HomePage.php');
    }
    else
    {
        echo "<script>alert('No post variable set')</script>";
    }
    ?>
    
    <!DOCTYPE html>
    <html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    </head>
    <body>
    
    <a id="link" role="button" href="index2.php">Test</a>
    
    <script type="text/javascript">
    
        $("#link").click(function(e) {
            e.preventDefault();
            alert('function entered');
            $.ajax({
                url: "testPHP.php",
                type: "POST",
                data: {
                    parameter1: 'test',
                    parameter2: 'test2'},
                success: function(msg) {
                    alert('wow' + msg);
                }
    
            });
            alert('function end');
            document.getElementById('link').setAttribute('href','testPHP.php');
    
        });
    </script>
    </body>
    </html>
    

    此外最好使用failed callback 进行请求。

     error: function (xhr, status, error) {
        alert(" Can't do because: " + error);
    },
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多