Pergunta

Atualização, resolvido:Depois de tudo isso descobri que estava chamando uma versão antiga do meu código no update ajax.'boardControl.php' em vez de 'boardUpdate.php' Esses são os tipos de erros que tornam a programação divertida.


Estou escrevendo um navegador gomoku jogo.Eu tenho a instrução ajax que permite ao jogador tocar uma peça.

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

valor = localização do quadrado do tabuleiro
lance = ID do conselho

Antes de criar um login de usuário para identificação do jogador, o php do lado do servidor tinha uma solução temporária.Ele giraria o estado das peças dos quadrados quando clicado, em vez de saber para qual jogador criá-los.

Depois de criar o material de login, defini uma variável de sessão para o ID do jogador.Eu esperava ler o ID da sessão do php durante a solicitação do ajax e descobrir qual jogador eles são a partir daí.

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;

Por alguma razão, quando executo o aplicativo da web completo, as peças ainda circulam, mesmo depois de excluir o código para fazê-las circular.Além disso, após o login, se eu carregar manualmente a página php no navegador, ele modifica o banco de dados corretamente (onde reproduz apenas peças pertencentes a esse player) e gera os resultados corretos.

Parece-me que a sessão não está sendo transportada quando usada com Ajax.Mesmo assim, as pesquisas do Google me dizem que as sessões funcionam com Ajax.


Atualizar:Estou tentando fornecer mais informações.

  1. O login funciona corretamente.Meu ID é reconhecido e eu imprimi ao lado da diretoria para garantir que Eu estava recuperando corretamente.

  2. A solicitação ajax atualiza o tábua.Os valores passados são Correto e confirmado com Firebug's consolar.No entanto, em vez de colocar peças apenas para o jogador eles Pertence a ele ciclos através da peça estados (0,1,2).

  3. Ao navegar manualmente para boardUpdate.php e colocando no mesmos valores enviados do Ajax o Resultados observados na resposta eco'ed indica que o correspondente peça é tocada vez como pretendido.

  4. Os mesmos resultados no meu laptop após uma nova carga de Firefox.

  5. Navegando manualmente para boardUpdate.php sem fazer login antes de sair da prancha inalterado (como pretendido quando nenhum usuário encontra-se na sessão).

  6. Eu verifiquei duas vezes que session_start () está nos arquivos PHP e verifiquei duas variáveis ​​de ID da sessão.

Espero que esta informação extra ajude, estou ficando sem ideias sobre o que dizer a você.Devo carregar o código completo?


Atualização 2:

Depois de verificar a resposta do Ajax no fire-bug, percebi que a solicitação 'play' não obtém resultado e a placa não é atualizada até a próxima 'atualização'.Ainda estou investigando isso, mas vou postar aqui para vocês também.

placaUpdate.phpLugares notáveis ​​são:Atualizar placa(line6) Lugar Peça(line20) placa de funçãoUpdate($turnCount) (line63)

<?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()


?>


Por favor me ajude, ficarei feliz em fornecer mais informações, se necessário.Desde já agradeço =)

Foi útil?

Solução

Pelo pequeno trecho de código que temos, é difícil dizer qual pode ser o seu problema.O que posso dizer é que session_start deve ser uma das primeiras coisas que você faz em cada página onde espera usar a sessão.Depois disso, eu faria imediatamente um var_dump de $_SESSION para ver se os dados estão lá (coloque um die logo depois disso).É bem possível que o seu verdadeiro problema esteja em outro lugar e que a sessão esteja de fato funcionando.Há algum problema com seu código de login, por exemplo, que está causando o encerramento da sessão?

Você pode usar Bug de fogo para ver os resultados brutos de suas chamadas AJAX, o que deve ser útil, já que seu script parece funcionar se você visitar a página diretamente.

Os casos em que vi sessões não funcionarem como esperado geralmente foram aqueles session_start está sendo chamado com muita frequência ou tarde demais.A outra possibilidade é que você tenha um tempo limite incrivelmente curto, mas isso parece improvável.

Finalmente, você pode ter certeza de que sua instalação do PHP está configurada para usar sessões de cookies.É muito improvável neste momento que não fosse, mas você poderia olhar.

Outras dicas

Um problema potencial neste código é o uso de $.get - é armazenado em cache pelo IE, portanto o código do servidor não é executado sempre.Tente usar $.ajax com cache definido como falso:

$.ajax({
  type: 'GET',
  url: 'includes/boardControl.php',
  cache: false,
  data: {play: value, bid: bid}
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top