2017-07-17 47 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

相关问题