【发布时间】:2021-05-15 12:17:56
【问题描述】:
我有一个问答游戏/猜谜游戏网站,我正在尝试移动记分服务器端的所有代码,以阻止人们作弊。游戏向用户显示 2 张图片,用户必须点击正确的一张。
我有 1 个带有所有图片 ID 的 PHP。其中 2 个被设置为会话变量,并通过 HTTP 请求提供给 Javascript 并放在 html 上。
所以现在当用户回答问题时,我为每个可点击的图像提供 1 个 php 文档,该文档将该图像与解决方案进行比较并返回正确或错误。它还跟踪分数。之后,使用 2 个新的 pictureIDS 调用第一个 php。
对于分数跟踪,我有会话变量。 “score”变量和“Lives”变量作为 PHP 中的 SESSION 变量,当用户正确或错误时递增和递减。 (我还有一个连续变量,它在连续三个正确之后添加一个 2x 乘数,但这不应该是相关的。)
由于某种原因,分数递增只起作用一次。对于第一个问题,分数上升 1 或生命值下降 1,但之后其他问题的分数保持不变。
我已经包含了很多我的代码,我希望这不会太过分。基本上javascript没有那么相关。您需要知道的是,我基本上是在运行第一个 php,然后是第二个,然后是第一个,以此类推。而且它只更改一次会话变量。我究竟做错了什么?我如何开始会话一定有问题吗? `
用于显示选择 2 个图像的 PHP 文档:
<?php
header('Content-Type: application/json');
?>
<?php
if (session_status() == PHP_SESSION_NONE) {
session_start();
$_SESSION["score"]=0;
$_SESSION["streak"]=0;
$_SESSION["lives"]=5;
$_SESSION["onfire"]=0;
}
$rightimages = array( "right1","right2","right3");
$wrongimages = array( "wrong1","wrong2","wrong3");
$right= mt_rand(0,count($right)-1);
$wrong= mt_rand(0,count($wrong)-1);
$coin = mt_rand(0,1);
if ($coin == 1){
$img1=$rightimages[$right];
$img2=$wrongimages[$wrong];
}else{
$img1=$wrongimages[$wrong];
$img2=$rightimages[$right];
}
$_SESSION["im1"]=$img1;
$_SESSION["im2"]=$img2;
$arr = array('im1' => $img1, 'im2' => $img2);
$myJSON = json_encode($arr);
echo $myJSON;
?>
点击img 1时的PHP文档检查解决方案。
<?php
header('Content-Type: application/json');
?>
<?php
if (session_status() == PHP_SESSION_NONE) {
session_start();
$_SESSION["score"]=0;
$_SESSION["streak"]=0;
$_SESSION["lives"]=5;
$_SESSION["onfire"]=0;
}
$wrongimages = array( "wrong1","wrong2","wrong3");
$iswrong =in_array($_SESSION["im2"], $wrongimages);
if ($iswrong){
$_SESSION["lives"]--;
$_SESSION["streak"]=0;
}
if(!$iswrong){
$_SESSION["score"]++;
$_SESSION["streak"]++;
if ($_SESSION["streak"]>2){
$_SESSION["onfire"]==0;
$_SESSION["score"]++;
}
if ($_SESSION["score"]==10){
$_SESSION["lives"]++;
}
}
$iswrongnum=(int)$iswrong;
$myarray=array('iswrong' =>$iswrong,'score' => $_SESSION["score"], 'streak' => $_SESSION["streak"], 'lives' =>$_SESSION["lives"]);
$myJSON = json_encode($myarray);
echo $myJSON;
?>
相关 JS 代码 这个函数在每个问题后重复调用。 (我已将其缩减为仅单击图像 1,因为单击图像 2 本质上是相同的,并且与问题无关。)
function play(){
var xmlhttp1 = new XMLHttpRequest();
xmlhttp1.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var myObj = JSON.parse(this.responseText);
img1 = myObj.im1;
img2 = myObj.im2;
document.getElementById("img1").src = img1;
document.getElementById("img2").src = img2;
}
};
xmlhttp1.open("GET", "arrayquestion1.php", true);
xmlhttp1.send();
document.getElementById("img1").onclick = function() {
this.onclick=null;
document.getElementById("img2").onclick =null;
var xmlhttp2 = new XMLHttpRequest();
xmlhttp2.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var myObj2 = JSON.parse(this.responseText);
isonewrong = myObj2.iswrong;
score = myObj.score;
streak =myObj.streak;
lives =myObj.lives;
}
};
xmlhttp2.open("GET", "arraynorm1.php", true);
xmlhttp2.send();
}
【问题讨论】:
-
代码 sn-ps 中的这一行
if (session_status() == PHP_SESSION_NONE)将始终计算为true。因此,您每次都重置这些值。您需要在代码开头调用session_start
标签: javascript php session