AJAX GET在页面加载时没有更新Javascript变量
问题描述:
我有一个关于通过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');
}
?>
答
在 “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);
}
所以基本上你这里有什么的都工作和非工作代码试图做同样的事情同时发生的例子。基本上,删除不工作的,坚持工作的。你已经有了你需要的代码。
[你有没有看过浏览器开发工具中的AJAX请求/响应?你有没有在项目中包含jQuery库?是否有任何错误报告?你是在网络服务器上运行的吗?](http://jayblanchard.net/basics_of_jquery_ajax.html) –
[Little Bobby](http://bobby-tables.com/)说*** [你的脚本在SQL注入攻击的风险。](http://*.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://*.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)是不安全的! –
因为'success'是AJAX完成后调用的回调函数,所以我认为你的第二个'console.log()'实际上是在回调完成之前运行的,而'chronoID'仍然是未定义的。如果你想用'chronoID'做一些事情,那么在你的成功功能里面做。 – perfect5th