У меня есть веб-сайт с викториной / угадайкой, и я пытаюсь переместить весь код для подсчета очков на сервер, чтобы люди не жульничали. Игра показывает пользователю 2 изображения, и пользователь должен нажать на правильную.

У меня есть 1 PHP со всеми идентификаторами изображений. 2 из них задаются как переменные сеанса и передаются в Javascript с помощью HTTP-запроса и помещаются в HTML.

Итак, теперь, когда пользователи отвечают на вопрос, у меня есть 1 документ php для каждого кликабельного изображения, который сравнивает это изображение с решениями и возвращает правильный или ложный. он также отслеживает счет. После этого вызывается первый php с двумя новыми pictureIDS.

Для отслеживания результатов у меня есть переменные сеанса. переменная "score" и переменная "Lives" как переменная SESSION в PHP, которые увеличиваются и уменьшаются, когда пользователь прав или неправ. (У меня также есть переменные полосы, которые добавляют множитель 2x после трех правильных подряд, но это не должно иметь значения.)

По какой-то причине увеличение очков работает только один раз. для первого вопроса оценка увеличивается на 1 или количество жизней падает на 1, но после этого для каждого другого вопроса оценка остается прежней.

Я включил много своего кода, надеюсь, это не слишком много. По сути, javascript не так уж важен. Все, что вам нужно знать, это то, что я в основном запускаю первый php, затем второй, затем снова первый и так далее в цикле. И это только изменение переменных сеанса один раз. Что я делаю не так? Должно быть что-то не так с тем, как я правильно начинаю сеанс? `

Документ 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;
?>

Решение для проверки документов PHP при нажатии img 1.

<?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();
}
1
cactus 11 Фев 2021 в 20:55

1 ответ

Я понял! Вот ответ, который может быть полезен другим.

Заменить начало:

if (session_status() == PHP_SESSION_NONE) {
    session_start();
    $_SESSION["score"]=0;
    $_SESSION["streak"]=0;
    $_SESSION["lives"]=5;
    $_SESSION["onfire"]=0;
}

С участием

session_start();
if (!isset($_SESSION['score'])) {
  $_SESSION['score'] = 0;
  $_SESSION['lives'] = 5;
  $_SESSION['streak'] = 0;
  
} 
0
cactus 11 Фев 2021 в 18:25
66160131