【发布时间】:2014-05-12 22:01:11
【问题描述】:
编辑:刚刚遇到了一个问题,周末我刚刚在 iPhone 上运行了这个程序,出于好奇,我同时在两部手机上运行了它,它运行正常。所以当一部手机是 iPhone (iOS 6) 而另一部是 HTC One (Android 4.3) 时,它运行得很愉快(正如我第一次预期的那样)。然而,这是在另一个人的 WIFI 上。我的家庭 WIFI 是否会成为阻止两台设备访问同一位置的一个因素? (我使用的第二部手机不工作时是三星 Galaxy Ace 2 (Android 2.3))
所以我遇到了这个问题。我正在使用 PhoneGap 并想出一个基本的测验系统来解决问题。我已经让它工作了,我玩得很开心。它本质上是通过一个 Web 控制台工作的,我可以在其中设置测验和循环问题,并通过对底层数据库的一系列不那么复杂的状态更新,我使用手机上的 Ajax 调用来读取状态并显示问题或等待下一个。
基本调用是:
$(function checkForQuestion() {
var postData = "stuff needed in called PHP";
$.ajax({
type: "POST",
data: postData,
url: "my called php",
success: function(data){
var result = JSON.parse(data);
if (result == "question") {
--Display Question
} else {
setTimeout(checkForQuestion, 1000);
return false;
}
});
return false;
});
根据我有限的经验,这似乎是 Ajax 的一般用途,如果需要等待新状态,则需要递归回调。
到目前为止,这还不是全部,而是我正在做的事情的品尝者。它与一台移动设备和一个愉快地完成测验的网络控制台配合得非常好。
当我尝试添加第二个手机(甚至还没有尝试过三个)时,会发生第二个手机在它应该调用这个 ajax 的地方静默失败。现在第二部手机可以很高兴地自行处理,所以它不应该是硬件问题。 PHP 中没有抛出任何错误,并且通过一些日志记录我找不到任何明显失败的东西。
此时我想,我的网络主机上的连接可能存在限制(我只是使用我用来测试的共享服务器网络主机),但仅限于 20 个条目使用 Cloud Linux LVE 进行处理。但是,这不应该排除两部手机大致同时调用同一个 PHP(通过 wifi)。它应该只同时运行调用,并且其中一个会比另一个返回稍快(或者这是我的理解)。
我想这可能是我正在使用的 MySQL 数据库上的一个锁,不允许多个用户/PHP 大致同时查询它,但是 PHP 的连续性应该排除这种情况,并且一些谷歌搜索向我保证呼叫将被排队。
我猜正在发生的事情是两个调用进来并且没有返回任何错误,一个与另一个默默地冲突导致失败,但我不知道如何找到失败并修复它。
有什么建议吗?
请求实际代码:
$(function () {
$(document).on("pagebeforeshow", "#page6", function () {
document.getElementById("mob_user_name2").innerHTML = window.localStorage.getItem("mob_local_login_name");
$(function checkForQuestion() {
//sort out the data to be posted
var postData = "mob_quizwait_quizcode=" . concat(window.localStorage.getItem("mob_local_quiz_code"), "&mob_quizwait_email=", window.localStorage.getItem("mob_local_login_email"), "&mob_quizwait_password=", window.localStorage.getItem("mob_local_login_password"), "&mob_quizwait_questionid=", window.localStorage.getItem("mob_question_id"));
$.ajax({
type: "POST",
data: postData,
url: "url of php",
success: function(data){
var mob_quizwait_data = JSON.parse(data);
if (mob_quizwait_data.mob_quizwait_success == "mob quizwait go") {
window.localStorage.setItem("mob_question_id", mob_quizwait_data.mob_quizwait_questionid);
window.localStorage.setItem("mob_question_score", mob_quizwait_data.mob_quizwait_score);
window.localStorage.setItem("mob_question_category", mob_quizwait_data.mob_quizwait_category);
window.localStorage.setItem("mob_question_question", mob_quizwait_data.mob_quizwait_question);
window.localStorage.setItem("mob_answer1", mob_quizwait_data.mob_quizwait_correct);
window.localStorage.setItem("mob_answer2", mob_quizwait_data.mob_quizwait_wrong1);
window.localStorage.setItem("mob_answer3", mob_quizwait_data.mob_quizwait_wrong2);
window.localStorage.setItem("mob_answer4", mob_quizwait_data.mob_quizwait_wrong3);
$.mobile.changePage("#page7", {transition:"slide", changeHash:false});
} else if (mob_quizwait_data.mob_quizwait_success == "mob quizwait stay") {
setTimeout(checkForQuestion, 1000);
return false;
} else if (mob_quizwait_data.mob_quizwait_success == "mob quizwait intermission") {
document.getElementById("mob_intermission").innerHTML = "Intermission";
$.mobile.changePage("#page6", {transition:"none", changeHash:false});
} else if (mob_quizwait_data.mob_quizwait_success == "mob quizwait finish") {
$.mobile.changePage("#page8", {transition:"slide", changeHash:false});
} else {
navigator.notification.alert("Status Check Failed. Please Try Again.", function(){}, "Alert", "OK");
}
}
});
return false;
});
});
});
还有 PHP:
<?PHP
include '../open.php';
//take in POST variables
$quizcode = $link->real_escape_string($_POST["mob_quizwait_quizcode"]);
$email = $link->real_escape_string($_POST["mob_quizwait_email"]);
$password = $link->real_escape_string($_POST["mob_quizwait_password"]);
$questionid1 = $link->real_escape_string($_POST["mob_quizwait_questionid"]);
$quizid = 0;
$status = "X";
$questionid = 0;
$sql = "SELECT QUIZ_ID FROM B_QUIZ WHERE QUIZ_CODE = '$quizcode'";
$res = $link->query($sql);
while ($row = $res->fetch_array()) {
$quizid = $row['QUIZ_ID'];
}
$sql = "SELECT USER_ID FROM A_USER WHERE USER_EMAIL = '$email' AND USER_PASSWORD = '$password'";
$res = $link->query($sql);
while ($row = $res->fetch_array()) {
$userid = $row['USER_ID'];
}
$sql = "SELECT QUIZ_STATUS, IFNULL(QUESTION_ID, 0) AS QUESTION_ID FROM B_GAME WHERE QUIZ_ID = $quizid";
$res = $link->query($sql);
while ($row = $res->fetch_array()) {
$status = $row['QUIZ_STATUS'];
$questionid = $row['QUESTION_ID'];
}
if ($questionid == $questionid1) {
$questionid = 0;
}
if ($status != "F") {
if ($quizid != 0 && $status != "X") {
//get details to be written to the profile page
if ($questionid != 0) {
$sql = "SELECT SCORE FROM B_PARTICIPANT WHERE USER_ID = $userid AND QUIZ_ID = $quizid";
$res = $link->query($sql);
while ($row = $res->fetch_array()) {
$score = $row['SCORE'];
}
$sql = "SELECT b.QUESTION_ID, c.CATEGORY, b.QUESTION, b.CORRECT_ANSWER, b.WRONG_ANSWER_1, b.WRONG_ANSWER_2, b.WRONG_ANSWER_3
FROM B_GAME a, B_QUESTION b, D_CATEGORY c
WHERE a.QUESTION_ID = b.QUESTION_ID
AND b.CATEGORY_ID = c.CATEGORY_ID
AND a.QUIZ_ID = $quizid";
$res = $link->query($sql);
while ($row = $res->fetch_array()) {
$questionid = $row['QUESTION_ID'];
$category = $row['CATEGORY'];
$question = $row['QUESTION'];
$correct = $row['CORRECT_ANSWER'];
$wrong1 = $row['WRONG_ANSWER_1'];
$wrong2 = $row['WRONG_ANSWER_2'];
$wrong3 = $row['WRONG_ANSWER_3'];
}
if ($status == "R") {
$arr = array("mob_quizwait_success" => "mob quizwait go",
"mob_quizwait_questionid" => $questionid,
"mob_quizwait_score" => $score,
"mob_quizwait_category" => $category,
"mob_quizwait_question" => $question,
"mob_quizwait_correct" => $correct,
"mob_quizwait_wrong1" => $wrong1,
"mob_quizwait_wrong2" => $wrong2,
"mob_quizwait_wrong3" => $wrong3);
echo json_encode($arr);
} else if ($status == "N") {
$arr = array("mob_quizwait_success" => "mob quizwait stay");
echo json_encode($arr);
} else if ($status == "I") {
$arr = array("mob_quizwait_success" => "mob quizwait intermission");
echo json_encode($arr);
}
} else {
$arr = array("mob_quizwait_success" => "mob quizwait stay");
echo json_encode($arr);
}
} else {
$arr = array("mob_quizwait_success" => "mob quizwait failed");
echo json_encode($arr);
}
} else {
$arr = array("mob_quizwait_success" => "mob quizwait finished");
echo json_encode($arr);
}
include '../close.php';
?>
open.php:
<?PHP
//DATABASE DETAILS//
$DB_ADDRESS = "yeah";
$DB_USER = "not";
$DB_PASS = "gonna";
$DB_NAME = "do it";
//Connect to the MySQL database
$link = new mysqli($DB_ADDRESS, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
printf("Connect Failed: %s\n", mysqli_connect_error());
exit();
}
?>
关闭.php:
<?PHP
mysqli_close($link);
?>
【问题讨论】:
-
发布您的真实代码。所有明显错误的相关部分都已删除。
-
在第二部手机上获取页面的调用是否立即失败,或者只是无限期地旋转?您还在应用程序中的任何地方使用 PHP 会话(也就是说,您是否在任何地方调用 session_start())?
-
抱歉刚刚注意到您的评论。问题是第二个电话似乎默默地失败了,所以我不知道它是失败还是无限期地旋转。没有给出 PHP 错误。看起来,没有任何东西被返回到手机,它只是坐在屏幕上,用来调用 PHP 而没有任何反应。在整个设置中的任何地方都没有使用会话。为了清楚起见 - 我认为我的问题归结为如何更好地想象我的失败,以便我可以解决它。
-
你有没有想过在你的任何查询中使用
or die($link->error);来实际查看是否存在 MySQL 错误,因为你没有我怀疑你会从中看到错误。您可以在代码中为每个阶段添加一些行(例如echo "first query\n";),这样它会告诉您如果失败,它会在失败前走了多远,并且可能会将其输出到文件而不是打印到屏幕上。此外,您可能会更好地使用 async AJAX。 -
这个应用程序的 URL 是什么?我可以摆弄一下,看看这些请求是如何进行的。此外,您可能想要做的事情是覆盖主机正在执行的所有错误处理,并在调试此问题时直接输出给用户。为此:error_reporting(E_ALL); ini_set('display_errors', 1);