2017-07-17 72 views
0

我有一個關於通過AJAX/JSON傳遞給JavaScript的PHP變量的問題。AJAX GET在頁面加載時沒有更新Javascript變量

我希望var的ChronoID在頁面加載時更新它從AJAX獲取的值,從PHP代碼中獲取。儘管它在AJAX中工作正常,但它可以返回到undefined,並且不更新該變量以備後用。

我在做什麼錯誤,以及將PHP變量轉移到Javascript的最佳方式是什麼?

- scripts.js中

$(document).ready(function() { 
var jsonGet; 
var chronoID; 
var timeworked; 
var startAt; 

$.ajax({ 
     type: "GET", 
     url: "detectopencrono.php", 
     dataType: "json", 
     success: function (response) { 
      jsonGet = response; 
      console.log(jsonGet); // JSON Array (works) 
      var arr = $.map(jsonGet, function (el) { 
       return el; 
      }); 
      console.log(arr); // JavaScript Array (after parse, works) 
      chronoID = arr[0]; // (works) 
      $("#chrono" + chronoID + "").show(200); 
      console.log(chronoID); // Works, shows value 
     } 
    }); 

console.log(chronoID); // Undefined (doesn't work) 

}); 

- detectopencrono.php

<?php 
    include("connection.php"); 
    session_start(); 

    /*if (isset($_POST['projectname'], $_POST['startyear'], $_POST['startmonth'], $_POST['startday'], $_POST['deadyear'], $_POST['deadmonth'], $_POST['deadday'], $_POST['lider'], $_POST['hours'], $_POST['budget'])) 
    {*/ 

    $iduser = $_SESSION['ID']; 

    if(isset($_SESSION['gbsn'])) 
    { 
     $wasopenresult = mysqli_query($mysqli, "SELECT ID, IsGbsn FROM subtask WHERE Crono='Y' AND IsGbsn='Y' AND IDUser='$iduser'") 
      or die("Não foi possivel executar o pedido."); 
    } 
    else 
    { 
     $wasopenresult = mysqli_query($mysqli, "SELECT ID, IsGbsn FROM subtask WHERE Crono='Y' AND IsGbsn='N' AND IDUser='$iduser'") 
      or die("Não foi possivel executar o pedido."); 
    } 

    if(mysqli_num_rows($wasopenresult)==1) 
    { 
     $rowwasopen = mysqli_fetch_assoc($wasopenresult); 
     $result1 = $rowwasopen['ID']; 
     $result2 = $rowwasopen['IsGbsn']; 
     echo json_encode(array('userid' => $result1,'gbsn'=> $result2)); 
     header('Content-Type: application/json'); 
    } 
    ?> 
+1

[你有沒有看過瀏覽器開發工具中的AJAX請求/響應?你有沒有在項目中包含jQuery庫?是否有任何錯誤報告?你是在網絡服務器上運行的嗎?](http://jayblanchard.net/basics_of_jquery_ajax.html) –

+1

[Little Bobby](http://bobby-tables.com/)說*** [你的腳本在SQL注入攻擊的風險。](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)***瞭解[prepared](http:// en .wikipedia.org/wiki/Prepared_statement)[MySQLi]的聲明(http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)。即使[轉義字符串](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)是不安全的! –

+1

因爲'success'是AJAX完成後調用的回調函數,所以我認爲你的第二個'console.log()'實際上是在回調完成之前運行的,而'chronoID'仍然是未定義的。如果你想用'chronoID'做一些事情,那麼在你的成功功能裏面做。 – perfect5th

回答

1

在 「AJAX」 中的 「A」 代表異步。爲了簡化你在做什麼:

var chronoID; 

$.ajax({ 
    // do something asynchronously, which will happen later 
}); 

console.log(chronoID); 

也就是說,你嘗試登錄它實際上被賦予了價值chronoID之前。相反,您希望響應AJAX調用本身的值。

哪個...你已經這樣做:

success: function (response) { 
    // other code which assigns a value to chronoID 
    console.log(chronoID); 
} 

所以基本上你這裏有什麼的都工作和非工作代碼試圖做同樣的事情同時發生的例子。基本上,刪除不工作的,堅持工作的。你已經有了你需要的代碼。

+0

但是那麼如何使用chronoID後來?它總是未定義的,無論它在_success_裏面分配了什麼值... – atherir

+0

@atherir:你*可以*稍後使用它,如果「later」是指「稍後」。在AJAX調用完成之前,您在問題中顯示的「不工作」代碼行執行*。您可以在AJAX調用完成後隨時使用該值,因爲這是設置值的位置。基本上,你不能使用尚未設置的值。但是任何時候*在它被設置之後,您都可以使用它。無論什麼操作都需要在設置該值後調用該值。 – David

+0

如何調用變量_after_ AJAX調用完成但不在_success_內部? – atherir

相關問題