Отправка параметров POST между файлами PHP с использованием вызовов AJAX - PullRequest
0 голосов
/ 19 января 2019

У меня есть PHP-файл test.php, в котором есть простая ссылка, которая после нажатия вызывает функцию AJAX для отправки данных в качестве параметров POST в другой файл testPHP.php.Затем второй файл получает параметры POST от вызова AJAX, а затем оповещает содержимое в массиве $ _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 был успешно выполнен, и он предупреждает меня об успехе.Я также проверил, чтобы увидеть содержимое массива $ _POST во 2-м файле, чтобы увидеть, получаю ли я данные в формате, отличном от запроса POST (например, строку, которую, возможно, придется взорвать, чтобы получить содержимое), ноМассив $ _POST выходит пустым.Это вывод, который я получаю, когда он перенаправляет на 2-ю страницу: Array () Array () Массивы $ _POST и $ _GET (для целей тестирования) появляются пустыми.

Я также просмотрел документацию AJAX, но не могу заставить эту простую передачу данных POST работать.Может кто-нибудь помочь мне с этой проблемой, чтобы я мог понять, как правильно отправлять параметры POST и получать данные в строки $ _POST ['parameter1'] и $ _POST ['parameter2'], чтобы я мог обрабатывать данные дальше.

Примечание : Я использовал метод POST FORM с использованием скрытых элементов формы, и он отлично работает, но я хочу попробовать этот подход, чтобы лучше понять, как работает AJAX.

Ответы [ 4 ]

0 голосов
/ 19 января 2019

Вот моя версия.Он вернет JSON-ответ на ваш ajax, который будет виден в вашей консоли для легкой отладки.

Ваша главная страница:

<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, вызвав какое-то событие.В вашем случае это щелчок по ссылке.

Функция щелчка приводит к фактическому вызову ajax, который просто отправляет запрос на сообщение testPHP.php.

testPHP.php получаетотправляет запрос и выполняет какую-то операцию с данными, предоставленными вызовом ajax.

Затем testPHP.php отправляет некоторый ответ обратно функции ajax.Данные будут доступны в функции успеха.

Затем вы решаете, как использовать данные, которые были переданы обратно со страницы testPHP.php в функцию успеха.

Все это происходит без обновления кода вашей исходной страницы.

Вы фактически не перенаправляете своего пользователя на другую страницу. Вы просто указываете своей странице перейти на другую страницу и выполнить некоторую операцию, который затем возвращается на исходную страницу, чтобы вы могли что-то сделать.

Надеюсь, это поможет.

0 голосов
/ 19 января 2019

Немного другая версия выше, которая должна помочь вам решить вашу проблему.Для простоты отладки это все одна страница, но вы можете четко увидеть работающий скрипт, как только вы нажмете кнопку.Просто echo встраивание javascript в код php и надежда на то, что он будет выполняться на стороне клиента, не сработает - просто лучше отобразить сообщение или объект 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>

как две отдельные страницы (обе в одной директории, в противном случае редактируйте страницу для цели 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();
    }

?>
0 голосов
/ 19 января 2019

Проблема с вашим кодом в том, что вы используете 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);
},
0 голосов
/ 19 января 2019

Работает после удаления атрибута типа в теге скрипта. Я использую <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> перед основным тегом скрипта. Это работает здесь. Также закройте тег script. Я надеюсь, что смогу помочь. Также измените

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

до

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...