Можно ли запустить несколько AJAX таким образом? - PullRequest
0 голосов
/ 16 мая 2019

Я хочу выполнить Ajax-запрос, чтобы получить «Datum» из ответа «TesterID».Затем я хочу запустить второй Ajax с ранее полученным «Datum», чтобы обновить это значение на другой странице, записи в БД.

Вот код, который не работает.

<script>

/* Funktionen um Startzeiten für Zyklen aus DB.TesterCycleCount zu erhalten bzw. für Test und Stunden, das aktuelle Datum gerundet auf 30 Minuten */ 
$(document).ready(function(){

var TesterID = "<?php echo $_GET['TesterID']; ?>"; /* value der Tester erhalten */ 


        $.ajax({ /* AJAX aufrufen */
            url: 'ma_get-TesterID_Testende.php',
            type: 'get', /* Methode zum übertragen der Daten */
            data: {TesterID:TesterID}, /* Daten zu übermitteln */
            dataType: 'json',
            success:function(response){ /* Die zurückgegebenene Daten erhalten */


                var CID = response['CID'];
                var Datum = response['Datum'];



            },
             error: function(jqxhtt, status, exception) {
         alert('Exception:', exception)

            }
        }




        var TestaufstellungID = "<?php echo $_GET['TestaufstellungID']; ?>";
         $.ajax({ /* AJAX aufrufen */
            url: 'ma_TestendeSQL.php',
            type: 'get', /* Methode zum übertragen der Daten */
            data: {Testaufstellung:TestaufstellungID, Datum: Datum}, /* Daten zu übermitteln */
            dataType: 'json',
            success:function(data){ /* Die zurückgegebenene Daten erhalten */


                 alert('Successfully called');
     },
     error: function(jqxhr, status, exception) {
         alert('Exception:', exception)

            }
        }


        });


</script>

Это вторая страница PHP, ma_TestendeSQL.php, которая не обновляется.

<?php
    $cinfo = array(
        "Database" => $database,
        "UID" => $username,
        "PWD" => $password
    );
    $conn = sqlsrv_connect($server, $cinfo);

    $TestaufstellungID = $_GET['TestaufstellungID'];
    $Datum = $_GET['Datum'];
    $Testdatum = date('Y-d-m');

                    $stop = $conn->prepare("WITH UpdateTestende AS (
      SELECT TOP 1  * from DB.dbo.Testergebnisse 
      WHERE TestaufstellungID = $TestaufstellungID
      ORDER BY TestergebnisID DESC 
    )

    update UpdateTestende 
    set Testende = '$Datum',
    Datum = '$Testdatum'");








        header('Content-type: application/json');

    ?>

Первый Ajax отлично работает со страницей PHP ma_get-TesterID_Testende.php.Я тестировал его уже в одиночку, но когда я добавляю вторую попытку Ajax для обновления, код, который я разместил выше, не работает.

Итак, вопрос: возможно ли запустить два Ajax, как этот?

Спасибо.

Редактировать: AJAX Вызов пуст или не начинается.Дальнейшее расследование: Ajax предупреждает меня об ошибке с пустым исключением и не предупреждает меня об успешной части.Таким образом, он не переходит на страницу ma_get-TesterID_Testende.php или не возвращает обратно Datum.Может быть проблема не включена межсайтовый скриптинг?

Но на другой странице есть похожий Ajax Call, работающий нормально.

$(document).ready(function(){

var TesterID = "<?php echo $_GET['TesterID']; ?>"; /* value der Tester erhalten */ 

        $.ajax({ /* AJAX aufrufen */
            url: 'ma_get-TesterID.php',
            type: 'get', /* Methode zum übertragen der Daten */
            data: {TesterID:TesterID}, /* Daten zu übermitteln */
            dataType: 'json',
            success:function(response){ /* Die zurückgegebenene Daten erhalten */

                var len = response.length;

                $("#Teststart").empty(); /* Die erhaltenden Daten werden bei der ID angezeigt */
                for( var i = 0; i<len; i++){
                    var CID = response[i]['CID'];
                    var Datum = response[i]['Datum'];

                    $("#Teststart").append("<option value='"+Datum+"'>"+Datum+"</option>");

                }
            }
        });


    $("#TesterID").change(function(){ /* Wenn du änderst und vom Select Feld auswählst */
        var TesterID = $(this).val(); /* value der Tester erhalten */ 

        $.ajax({ /* AJAX aufrufen */
            url: 'ma_get-TesterID.php',
            type: 'get', /* Methode zum übertragen der Daten */
            data: {TesterID:TesterID}, /* Daten zu übermitteln */
            dataType: 'json',
            success:function(response){ /* Die zurückgegebenene Daten erhalten */

                var len = response.length;

                $("#Teststart").empty(); /* Die erhaltenden Daten werden bei der ID angezeigt */
                for( var i = 0; i<len; i++){
                    var CID = response[i]['CID'];
                    var Datum = response[i]['Datum'];

                    $("#Teststart").append("<option value='"+Datum+"'>"+Datum+"</option>");

                }
            }
        });
    });

});

В этом примере Ajax Call запускается, когда я изменяю значение из формы выбора Dropdown.Есть ли разница?

Как должен работать этот Ajax, я постараюсь объяснить в моем другом вопросе шаг за шагом, как должно выполняться мое приложение.

Обновите SQL-запрос с заполненными переменными из функций AJAX поверхнесколько страниц PHP

Редактировать 2: Версия JQuery: https://code.jquery.com/jquery-3.4.1.js"

Ответы [ 5 ]

1 голос
/ 20 мая 2019

Пара проблем с оригинальным кодом:

A. Первый ajax должен завершиться до начала второго ajax

Вашему второму вызову ajax необходимо значение Datum, которое возвращается первым вызовом ajax. В настоящее время второй ajax начнется сразу после отправки первого ajax, прежде чем он вернет Datum. Поэтому нам нужно подождать, пока первый ajax вернет Datum, прежде чем мы сможем использовать его как вход для второго ajax.

Простой способ сделать это с помощью функции async/await в ECMA2017 (документы здесь ). Это позволяет javascript работать асинхронно и ждать, пока что-то завершится, прежде чем мы продолжим.

Для этого нам нужно сначала объявить вмещающую функцию как async (см. // 1. Комментарии в коде ниже):

$(document).ready(async function(){

Затем мы добавляем await перед первым вызовом $.(ajax) (см. // 3. Комментарии в коде ниже):

 await $.ajax({ /* AJAX aufrufen */

Вместе движок javascript будет приостанавливать код при первом вызове ajax, пока не вернет значение Datum. Тогда это будет продолжаться как обычно.

B. Datum должен быть на верхнем уровне ограждающей функции

Как написано, переменная Datum существует только внутри анонимной функции, которая присваивается "success" при первом вызове ajax. Таким образом, он не доступен для второго вызова ajax («Данные не определены»).

Вы можете исправить это, объявив Datum глобальным (за пределами $.(ready) {}) или, что еще лучше, вы можете оставить его в пределах $.(ready) {}, объявив его в самых крайних скобках (см. // 2. Comments). в коде ниже).

Наконец, вы должны заменить var Datum = response['Datum']; на Datum = response['Datum'];. (см. // 4. Комментарий в коде ниже).

/* Funktionen um Startzeiten für Zyklen aus DB.TesterCycleCount zu erhalten bzw. für Test und Stunden, das aktuelle Datum gerundet auf 30 Minuten */ 

// 1. ADD 'ASYNC' IN FRONT OF FUNCTION

$(document).ready(async function(){

// 2. DECLARE 'DATUM' AT TOP

var Datum;
var TesterID = "<?php echo $_GET['TesterID']; ?>"; /* value der Tester erhalten */ 

        // 3. ADD AWAIT IN FRONT OF FIRST AJAX CALL

        await $.ajax({ /* AJAX aufrufen */
            url: 'ma_get-TesterID_Testende.php',
            type: 'GET', /* Methode zum übertragen der Daten */
            data: {TesterID:TesterID}, /* Daten zu übermitteln */
            dataType: 'json',
            success:function(response){ /* Die zurückgegebenene Daten erhalten */

                var CID = response['CID'];

                // 4. REMOVE VAR IN FRONT OF DATUM

                Datum = response['Datum'];

            },
             error: function(jqxhtt, status, exception) {
             console.log(exception);
         alert('Exception:', exception)

            }
        });




    var TestaufstellungID = "<?php echo $_GET['TestaufstellungID']; ?>";
    $.ajax({ /* AJAX aufrufen */
        url: 'ma_TestendeSQL.php',
        type: 'get', /* Methode zum übertragen der Daten */
        data: {Testaufstellung:TestaufstellungID, Datum: Datum}, /* Daten zu übermitteln */
        dataType: 'json',
        success:function(data){ /* Die zurückgegebenene Daten erhalten */


            alert('Successfully called Datum='.Datum);
        },
        error: function(jqxhr, status, exception) {
            alert('Exception:', exception)

        }
    });

});
0 голосов
/ 24 мая 2019

Я не знаю, чего вы должны достичь.Это единственный пример, я не запускал код, но думаю, что он будет работать правильно, как показано ниже:

$(document).ready(function() {
    $.ajaxSetup(
        {
         cache : false, 
         crossDomain: true, 
         async : false, 
         type : 'POST', 
         dataType : 'json'
        });

    function FirstAjax($url, $value){
        var def = new $.Deferred();
        var ret_data;

        $.post($url, {type : 1, value : { $value}}, function(data){
            //Do things with Data
            //or
            ret_dat=data;
        }, "json");

        return ret_data;
    }


    var abc = FirstAjax("site address", "data_values");
    var def = FirstAjax("site address", "data_values");
});
0 голосов
/ 23 мая 2019

Есть 2 способа сделать это

ПУТЬ 1: использовать 'await' для первого ajax.это позволит вашему второму ajax дождаться завершения первого ajax.

    await $.ajax({
    url: 'ma_get-TesterID_Testende.php',
    type: 'get',
    data: {TesterID:TesterID},
    dataType: 'json',
    success:function(response){ /* Die zurückgegebenene Daten erhalten */

    },
     error: function(jqxhtt, status, exception) {
    }
}
$.ajax({
    url: 'ma_TestendeSQL.php',
    type: 'get',
    data: {Testaufstellung:TestaufstellungID, Datum: Datum},
    dataType: 'json',
    success:function(data){

    },
    error: function(jqxhr, status, exception) {
    }
}

WAY 2:

вы можете поместить второй ajax в метод «complete» или «success»:первый аякс

$.ajax({
    url: 'ma_get-TesterID_Testende.php',
    type: 'get',
    data: {TesterID:TesterID},
    dataType: 'json',
    success:function(response){
        $.ajax({
            url: 'ma_TestendeSQL.php',
            type: 'get',
            data: {Testaufstellung:TestaufstellungID, Datum: Datum},
            dataType: 'json',
            success:function(data){

            },
            error: function(jqxhr, status, exception) {
            }
        }
    },
     error: function(jqxhtt, status, exception) {
    }
}
0 голосов
/ 20 мая 2019

Во-первых, вы должны знать, что вы должны отделить ваш JavaScript от ваших страниц HTML или PHP, которые генерируют HTML, чтобы JavaScript можно было кэшировать. Вы также должны сделать это с вашим CSS, чтобы он кэшировался, для более быстрой загрузки страницы. Вот как должен выглядеть ваш код:

//<![CDATA[
/* external.js */
$(function(){
var serialGet = location.search.replace(/^\?/, '').split('&');
if(serialGet.length > 1){
  for(var i=0,a,v,testerId,testaufstellungID,l=serialGet.length; i<l; i++){
    a = serialGet[i].split('='); v = a[1].trim();
    if(a[0].match(/TesterID/i) && v !== ''){
      testerId = v;
    }
    else if(a[0].match(/TestaufstellungID/i) && v !== ''){
      testaufstellungID = v;
    }
  }
  if(testerId && testaufstellungID){
    $.ajax({
      url:'ma_get-TesterID_Testende.php',
      data:{testerID:testerID},
      dataType:'json',
      success:function(response){
        var cid = response.cid, datum = response.datum;
        if(cid === undefined || datum === undefined){
          return;
        }
        // use cid now if needed
        $.ajax({
          url:'ma_TestendeSQL.php',
          data:{testaufstellung:testaufstellungID, datum:datum},
          dataType:'json',
          success:function(data){
            if(data.worked){
              console.log(data);
            }
          }
        });
      }
    });
  }  
}
}); // end load
//]]>
/* external.css */
*{
  box-sizing:border-box; padding:0; margin:0;
}
html,body{
  width:100%; height:100%;
}
body{
  background:#ccc;
}
#test{
  padding:5px 7px; text-align:center;
}
<!DOCTYPE html>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'>
  <head>
    <meta charset='UTF-8' /><meta name='viewport' content='width=device-width, height=device-height, initial-scale:1' />
    <title>Test Template</title>
    <link type='text/css' rel='stylesheet' href='external.css' />
    <script type='text/javascript' src='https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js'></script>
    <script type='text/javascript' src='external.js'></script>
  </head>
<body>
  <div id='test'>This would be the page that takes your $_GET URL</div>
</body>
</html>

Конечно, вы должны хранить отдельную и защищенную копию подключения к вашей базе данных.

limited / connect.php может выглядеть так:

<?php /* restricted/connect.php */
function https(){ // force https
  if(!isset($_SERVER['HTTPS'])){
    header("LOCATION:https://{$_SERVER['SERVER_NAME']}{$_SERVER['PHP_SELF']}"); die;
  }
}
function connect(){ // database connect - change strings as required below
  return new mysqli('host', 'username', 'password', 'database');
}
?>

Теперь ma_get-TesterID_Testende.php может выглядеть примерно так:

<?php /* ma_get-TesterID_Testende.php */
require_once 'restricted/connect.php';
// https(); - use if https
if(isset($_GET['testerID'])){
  $db = connect();
  if($db->connect_error)die;
  if($stmt = $db->prepare('SELECT cid,datum FROM some_table WHERE testerID=?')){
    $stmt->bind_param('s', $_GET['testerID']); $stmt->execute();
    $stmt->bind_result($cid, $datum); $c = new StdClass;
    if($stmt->fetch()){ // single result set no loop needed
      $c->cid = $cid; $c->datum = $datum;
    }
    $stmt->free();
    echo json_encode($c);
  }
  $db->close();
}
?>

ma_TestendeSQL.php может выглядеть так:

<?php /* ma_get-TesterID_Testende.php */
date_default_timezone_set('America/Vancouver'); require_once 'restricted/connect.php';
// https(); - use if https
if(isset($_GET['testaufstellungID'], $_GET['datum'])){
  $db = connect();
  if($db->connect_error)die;
  if($stmt = $db->prepare('UPDATE updateTestende SET testende=?, datum=? WHERE testaufstellungID=? ORDER BY testergebnisID DESC LIMIT 1')){
    $stmt->bind_param('sss', $_GET['datum'], date('Y-d-m'), $_GET['testaufstellungID']); $stmt->execute(); $c = new StdClass;
    if($db->affected_rows){
      $c->worked = true;
    }
    echo json_encode($c);
  }
  $db->close();
}
?>

Имейте в виду, что AJAX является асинхронным, поэтому, если результат зависит от другого, вы должны вкладывать свои вызовы или использовать Promise s (хотя они не работают в IE) . Кроме того, я понятия не имею, чего вы пытались достичь с помощью своего последнего вызова AJAX, поэтому я просто угадывал, показывая процесс.

0 голосов
/ 20 мая 2019

Ajax-вызовы не являются синхронными, и использование async: false также не будет предпочтительным решением, поскольку оно генерирует предупреждения.Самое простое решение - создать 2 метода.Один для получения данных и второй для обновления базы данных данными.Вызовите второй метод в случае успеха первого метода.Так было бы как

  $.ajax({ 

        url: 'ma_get-TesterID_Testende.php',
        type: 'get', 
        data: {TesterID:TesterID}, 
        dataType: 'json',
        success:function(response){ 


            var CID = response['CID'];
            var Datum = response['Datum'];

            SecondMethod(Datum);


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