Вопрос

Обновление, Решаемое: После всего этого я обнаружил, что вызывал старую версию своего кода в обновлении ajax.'boardControl.php' вместо 'boardUpdate.php ' Это ошибки такого рода, которые делают программирование увлекательным.


Я пишу браузер гомоку Игра.У меня есть оператор ajax, который позволяет игроку разыгрывать фигуру.

$(document).ready(function() {
    $("td").live('click',function(){
        var value = $(this).attr('id');
        $.get('includes/boardControl.php',{play: value, bid: bid});
    });
});

значение = расположение квадрата доски
ставка = идентификатор доски

Перед созданием логина пользователя для идентификации игрока на серверной стороне php было временное решение.Это изменило бы состояние фигуры для квадратов при нажатии вместо того, чтобы знать, для какого игрока их создавать.

После создания логина я установил переменную сеанса для идентификатора игрока.Я надеялся прочитать идентификатор сеанса из php во время запроса ajax и выяснить, какой игрок они оттуда.

session_start();

...

    $playerId = $_SESSION['char'];
    $Query=("SELECT p1, p2 FROM board WHERE bid=$bid");
    $Result=mysql_query($Query);
    $p1 = mysql_result($Result,0,"p1");
    $p2 = mysql_result($Result,0,"p2");
    $newPiece = 0; //*default no player
    if($playerId == $p1)
        $newPiece = 1;
    if($playerId == $p2)
        $newPiece = 2;

По какой-то причине, когда я запускаю полное веб-приложение, фрагменты все еще циклически работают, даже после того, как я удалил код, чтобы заставить их циклически работать.Более того, после входа в систему, если я вручную загружаю php-страницу в браузере, она корректно изменяет базу данных (где воспроизводятся только фрагменты, принадлежащие этому проигрывателю) и выдает правильные результаты.

Мне кажется, что сеанс не переносится при использовании с Ajax.Тем не менее, поисковые запросы Google говорят мне, что сеансы действительно работают с Ajax.


Обновить:Я пытаюсь предоставить больше информации.

  1. Вход в систему работает корректно.Мой Идентификатор распознан, и я распечатал его рядом с доской, чтобы убедиться, что Я извлек его правильно.

  2. Запрос ajax действительно обновляет доску.Переданные значения верны и подтверждены с помощью консоли firebug .Однако вместо того, чтобы размещать фигуры только для игрока, они принадлежат его циклам, хотя фигура заявляет (0,1,2).

  3. При ручном просмотре boardUpdate.php и вводе тех же значений, отправленных из Ajax, результаты, видимые в echo'ed ответе указывает, что соответствующая пьеса воспроизводится каждый раз так, как предполагалось.

  4. Те же результаты на моем ноутбуке после новой загрузки Firefox.

  5. Просмотр вручную boardUpdate.php без входа в систему перед раздачей оставьте доску без изменений (как и предполагалось, когда ни один пользователь не найден в сеансе).

  6. Я дважды проверил, что session_start() находится в файлах php и дважды проверил идентификатор сеанса переменные.

Надеюсь, эта дополнительная информация поможет, у меня заканчиваются идеи, что вам сказать.Должен ли я загрузить полный код?


Обновление 2:

После проверки Ajax-ответа в fire-bug я понял, что запрос 'play' не получает результата, и доска не обновляется до следующего 'update'.Я все еще изучаю это, но я опубликую это здесь и для вас, ребята.

boardUpdate.php Примечательными местами являются:Обновить доску (строка 6) Разместить фигуру (строка 20) обновить доску функций ($ turnCount) (строка 63)

<?php
session_start();
require '../../omok/dbConnect.php';

    //*** Refresh Board ***
    if(isset($_GET['update']))
    {
        $bid = $_GET['bid'];
        $Query=("SELECT turn FROM board WHERE bid=$bid");
        $Result=mysql_query($Query);
        $turnCount=mysql_result($Result,0,"turn");

        if($_GET['turnCount'] < $turnCount) //** Turn increased
        {
            boardUpdate($turnCount);
        }
    }

    //*** Place Piece ***
    if(isset($_GET['play'])) // turn order? player detect?
    {
        $squareID = $_GET['play'];
        $bid = $_GET['bid'];

        $Query=("SELECT turn, boardstate FROM board WHERE bid=$bid");
        $Result=mysql_query($Query);
        $turnCount=mysql_result($Result,0,"turn");
        $boardState=mysql_result($Result,0,"boardstate");

        $turnCount++;

        $playerId = $_SESSION['char'];
        $Query=("SELECT p1, p2 FROM board WHERE bid=$bid");
        $Result=mysql_query($Query);
        $p1 = mysql_result($Result,0,"p1");
        $p2 = mysql_result($Result,0,"p2");
        $newPiece = 0; //*default no player
        if($playerId == $p1)
            $newPiece = 1;
        if($playerId == $p2)
            $newPiece = 2;

//      if($newPiece != 0)
//      {
            $oldPiece = getBoardSpot($squareID, $bid);
            $oldLetter = $boardState{floor($squareID/3)};
            $slot = $squareID%3;

            //***function updateCode($old, $new, $current, $slot)***
            $newLetter = updateCode($oldPiece, $newPiece, $oldLetter, $slot);
            $newLetter = value2Letter($newLetter);
            $newBoard = substr_replace($boardState, $newLetter, floor($squareID/3), 1);

            //** Update Query for boardstate & turn
            $Query=("UPDATE board SET boardState = '$newBoard', turn = '$turnCount' WHERE bid = '$bid'");
            mysql_query($Query);
//      }
        boardUpdate($turnCount);


    }

    function boardUpdate($turnCount)
    {
            $json = '{"turnCount":"'.$turnCount.'",';           //** turnCount **


            $bid = $_GET['bid'];
            $Query=("SELECT boardstate FROM board WHERE bid='$bid'");
            $Result=mysql_query($Query);
            $Board=mysql_result($Result,0,"boardstate");
            $json.= '"boardState":"'.$Board.'"';            //** boardState **


            $json.= '}';
            echo $json;
    }

    function letter2Value($input)
    {
        if(ord($input) >= 48 && ord($input) <= 57)
            return ord($input) - 48;
        else
            return ord($input) - 87;
    }

    function value2Letter($input)
    {
        if($input >= 10)
            return chr($input += 87);
        else
            return chr($input += 48);
    }


    //*** UPDATE CODE *** updates an letter with a new peice change and returns result letter.
    //***** $old : peice value before update
    //***** $new : peice value after update
    //***** $current : letterValue of code before update.
    //***** $slot : which of the 3 sqaures the change needs to take place in.
    function updateCode($old, $new, $current, $slot)
    {
        if($slot == 0)
        {// echo $current,"+((",$new,"-",$old,")*9)";
            return letter2Value($current)+(($new-$old)*9);
        }
        else if($slot == 1)
        {// echo $current,"+((",$new,"-",$old,")*3)";
            return letter2Value($current)+(($new-$old)*3);
        }
        else //slot == 2
        {// echo $current,"+((",$new,"-",$old,")";
            return letter2Value($current)+($new-$old);
        }
    }//updateCode()


    //**** GETBOARDSPOT *** Returns the peice value at defined location on the board.
    //****** 0 is first sqaure increment +1 in reading order (0-254).
    function getBoardSpot($squareID, $bid)
    {
        $Query=("SELECT boardstate FROM board WHERE bid='$bid'");
        $Result=mysql_query($Query);
        $Board=mysql_result($Result,0,"boardstate");


        if($squareID %3 == 2) //**3rd spot**
        {
            if( letter2Value($Board{floor($squareID/3)} ) % 3 == 0)
                return 0;
            else if( letter2Value($Board{floor($squareID/3)} ) % 3 == 1)
                return 1;
            else
                return 2;
        }
        else if($squareID %3 == 0) //**1st spot**
        {
            if(letter2Value($Board{floor($squareID/3)} ) <= 8)
                return 0;
            else if(letter2Value($Board{floor($squareID/3)} ) >= 18)
                return 2;
            else
                return 1;
        }
        else //**2nd spot**
        {
            return floor(letter2Value($Board{floor($squareID/3)}))/3%3;
        }
    }//end getBoardSpot()


?>


Пожалуйста, помогите, я был бы рад предоставить больше информации, если это необходимо.Заранее спасибо =)

Это было полезно?

Решение

Из небольшого фрагмента кода, которым мы располагаем, трудно сказать, в чем может заключаться ваша проблема.Что я могу сказать, так это то, что session_start это должно быть одной из первых вещей, которые вы делаете на каждой странице, где вы планируете использовать сеанс.После этого я бы просто немедленно сделал var_dump из $_SESSION чтобы увидеть, что данные находятся там (поставьте die сразу после этого).Вполне возможно, что ваша истинная проблема кроется где-то в другом месте, и что сеанс действительно работает.Например, есть ли проблема с вашим кодом входа, которая приводит к удалению сеанса?

Вы можете использовать Поджигатель чтобы посмотреть необработанные результаты ваших вызовов AJAX, что должно быть полезно, поскольку ваш скрипт, похоже, работает, если вы непосредственно посещаете страницу.

Случаи, когда я видел, что сеансы работают не так, как ожидалось, как правило, заключались в том, что session_start вызывается слишком часто или слишком поздно.Другая возможность заключается в том, что у вас безумно короткий тайм-аут, но это звучит маловероятно.

Наконец, вы можете убедиться, что ваша установка PHP настроена на использование сеансов cookie.На данный момент очень маловероятно, что этого не было бы, но вы могли бы посмотреть.

Другие советы

Одной из потенциальных проблем в этом коде является использование $.get - он кэшируется IE, поэтому ваш серверный код запускается не каждый раз.Попробуйте использовать $.ajax с кэшем, установленным в false:

$.ajax({
  type: 'GET',
  url: 'includes/boardControl.php',
  cache: false,
  data: {play: value, bid: bid}
});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top