[英]Javascript scope and Ajax call doesn't work correctly
我有一些問題。
首先,我的php文件shoutbox.php,用於登錄用戶。
session_start();
if(! isset($_SESSION["loggedIn"])) {
include "login.html";
}
else {
if(isset($_POST["submit"]) && $_POST["submit"] == "Log In") {
if(! isset($_POST["username"]) || $_POST["username"] == "" || ! isset($_POST["password"]) || $_POST["password"] == "") {
$GLOBALS["logErr"] = "Please, filln all fields!";
echo json_encode(false);
}
else if(isset($_POST["username"]) && $_POST["username"] != "" && isset($_POST["password"]) && $_POST["password"] != "") {
if(isset($_POST["select"]) && $_POST["select"] != "") {
session_start();
$_SESSION["loggedIn"] = TRUE;
$_SESSION["username"] = $_POST["username"];
$_SESSION["password"] = $_POST["password"];
$_SESSION["type"] = $_POST["select"];
$_SESSION["ip"] = get_ip_address(); /* Return current ip */
$user = array(
"username" => $_SESSION["username"],
"islogged" => $_SESSION["loggedIn"],
"password" => $_SESSION["password"],
"ip" => $_SESSION["ip"],
"type" => $_SESSION["type"]
);
echo json_encode($user);
}
}
}
else if(isset($_POST["logout"]) && $_POST["logout"] == "Log Out") {
session_start();
unset($_SESSION["loggedIn"]);
unset($_SESSION["username"]);
unset($_SESSION["password"]);
unset($_SESSION["type"]);
unset($_SESSION["ip"]);
echo json_encode(false);
}
if(isset($_SESSION["loggedIn"]) && $_SESSION["loggedIn"] == TRUE) {
echo json_encode(true); /* user is logged in */
}
else {
echo json_encode(false); /* user is not logged in */
}
}
它返回false或true,如果為true,則返回用戶數組編碼。
這是Ajax調用,我必須調用2個響應,即false或true,如果響應為true,則還要調用用戶數組。
function sb_UserIsLoggedIn() {
$.ajax({
url: 'shoutbox.php',
type: 'POST',
dataType: 'json',
success: function(response, user) {
if(response) {
function user(user) {
CurrUserInfo = {
u_name: user["username"],
u_psw: user["password"],
ip: user["ip"],
typelog: user["type"],
logged: user["islogged"]
};
if(CurrUserInfo.typelog == "anonimous") {
OnlineListObj.onlineList.anonimous.push(user["username"]);
}
else if(CurrUserInfo.typelog == "visible") {
OnlineListObj.onlineList.visible.push(user["username"]);
}
OnlineListObj["onlineList"]["total"] = OnlineListObj.onlineList.anonimous.length + OnlineListObj.onlineList.visible.length;
OnlineListObj["onlineList"]["phrase"] = lang["there_are"] + OnlineListObj.onlineList.total + lang["online"] + OnlineListObj.onlineList.anonimous.length + lang["anonimous"] + OnlineListObj.onlineList.visible + lang["visibles"];
LoggedIn = true;
window.alert(LoggedIn);
window.alert(OnlineListObj["onlineList"]["total"]);
window.alert(OnlineListObj["onlineList"]["phrase"]);
window.alert(CurrUserInfo.ip);
window.alert(CurrUserInfo.typelog);
window.alert(CurrUserInfo.logged);
window.alert(CurrUserInfo.u_name);
window.alert(CurrUserInfo.u_psw);
}
}
else {
window.location.href = "shoutbox.php";
}
},
error: function(response) {
sb_Error("Unknown error, try again");
console.log(lang["ajax_error"]);
console.log(response.responseText);
LoggedIn = false;
},
});
}
警報說這些沒有定義:
window.alert(CurrUserInfo.ip);
window.alert(CurrUserInfo.typelog);
window.alert(CurrUserInfo.logged);
window.alert(CurrUserInfo.u_name);
window.alert(CurrUserInfo.u_psw);
這是因為對用戶數組的調用失敗了……但是一個調用可以正常工作,返回true或false。為什么它起作用,而另一個(對用戶數組)不起作用? 我想ajax調用true或false和用戶數組。
其他問題:
在有關sb_isUserLoggedIn()的代碼中,我定義了一個變量LoggedIn ...
但是,如果您在另一個函數中調用LoggedIn,則返回undefined:
/* Checks if the user is online */
function sb_isOn() {
sb_UserIsLoggedIn();
if(LoggedIn != false) {
return true;
}
else {
return false;
}
}
如我所寫,此代碼返回錯誤,LoggedIn未定義。
我該如何解決所有這些問題?
提前致謝。
在我看來,PHP成功執行了兩次調用以echo json_encode()
。 一種回應用戶數組,另一種回應true
。 我認為這會導致JSON無效。
我建議您編寫PHP,以便它僅使一次調用echo json_encode()
。 您可以讓它返回以下成功信息:
echo json_encode(array("success" => true, "user" => $user));
以及以下失敗信息:
echo json_encode(array("success" => false, "message" => 'Please, fill in all fields!'));
然后,在Javacript中,您可以看到以下內容:
success: function(result) {
if (result.success) {
var user = result.user;
// Do something with user here.
} else {
var message = result.message;
// Do something with message here.
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.