Domanda

Aggiornamento, risolto:Dopo tutto questo ho scoperto che stavo chiamando una vecchia versione del mio codice nell'aggiornamento ajax.'boardControl.php' invece di 'boardUpdate.php' Questi sono i tipi di errori che rendono divertente la programmazione.


Sto scrivendo un browser gomoku gioco.Ho l'istruzione ajax che consente al giocatore di suonare un pezzo.

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

valore = posizione della casella del tabellone
offerta = ID scheda

Prima di creare un login utente per l'identificazione del giocatore, il php lato server aveva una soluzione temporanea.Ruoterà lo stato dei pezzi per i quadrati quando vengono cliccati invece di sapere per quale giocatore crearli.

Dopo aver creato elementi di accesso, ho impostato una variabile di sessione per l'ID del giocatore.Speravo di leggere l'ID di sessione dal php durante la richiesta Ajax e capire da lì quale giocatore provengono.

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;

Per qualche motivo, quando eseguo l'app Web completa, i pezzi continuano a scorrere, anche dopo aver eliminato il codice per farli scorrere.Inoltre, dopo aver effettuato l'accesso, se carico manualmente la pagina php nel browser, modifica correttamente il database (dove riproduce solo brani appartenenti a quel musicista) e restituisce i risultati corretti.

Mi sembra che la sessione non venga trasferita se utilizzata con Ajax.Eppure le ricerche su Google mi dicono che le sessioni funzionano con Ajax.


Aggiornamento:Sto cercando di fornire maggiori informazioni.

  1. L'accesso funziona correttamente.Il mio ID è riconosciuto e l'ho stampato accanto alla scheda per assicurarmi di recuperarlo correttamente.

  2. La richiesta AJAX aggiorna la scheda.I valori passati sono corretti e confermati con la console di Firebug.Tuttavia, invece di posizionare pezzi solo per il giocatore, gli appartengono ai cicli sebbene il pezzo afferma (0,1,2).

  3. Quando si naviga manualmente su BoardUpdate.php e si inseriscono gli stessi valori inviati dall'Ajax, i risultati visti nella risposta eco indicano che il pezzo corrispondente viene riprodotto ogni volta come previsto.

  4. Stessi risultati sul mio laptop dopo un nuovo carico di Firefox.

  5. Navigare manualmente su BoardUpdate.php senza accedere prima di lasciare la scheda invariata (come previsto quando non viene trovato alcun utente nella sessione).

  6. Ho ricontrollato il doppio che session_start () è sui file PHP e ho ricontrollato le variabili ID sessione.

Spero che queste informazioni extra siano d'aiuto, sono a corto di idee su cosa dirti.Devo caricare il codice completo?


Aggiornamento 2:

Dopo aver controllato la risposta Ajax nel fire-bug mi sono reso conto che la richiesta di "riproduzione" non ottiene un risultato e la scheda non viene aggiornata fino al successivo "aggiornamento".Lo sto ancora esaminando, ma lo pubblicherò qui anche per voi ragazzi.

boardUpdate.phpLuoghi degni di nota sono:SCHEDA AGGIORNAMENTO (Line6) Place Piece (Line20) Function BoardUpdate ($ 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()


?>


Per favore aiutatemi, sarò felice di fornire maggiori informazioni se necessario.Grazie in anticipo =)

È stato utile?

Soluzione

Dal piccolo frammento di codice in nostro possesso è difficile capire quale potrebbe essere il tuo problema.Quello che posso dire è questo session_start dovrebbe essere una delle prime cose da fare su ogni pagina in cui prevedi di utilizzare la sessione.Dopodiché, farei immediatamente a var_dump Di $_SESSION per vedere che i dati sono lì (metti a die subito dopo).È del tutto possibile che il tuo vero problema sia altrove e che la sessione stia effettivamente funzionando.C'è un problema con il tuo codice di accesso, ad esempio, che sta causando la cancellazione della sessione?

Puoi usare Firebug per guardare i risultati grezzi delle tue chiamate AJAX, il che dovrebbe essere utile, poiché il tuo script sembra funzionare se visiti direttamente la pagina.

I casi in cui ho visto che le sessioni non funzionavano come previsto sono stati generalmente questo session_start viene chiamato troppo spesso o troppo tardi.L'altra possibilità è che tu abbia un timeout incredibilmente breve, ma sembra improbabile.

Infine, puoi assicurarti che la tua installazione PHP sia impostata per utilizzare le sessioni dei cookie.A questo punto è molto improbabile che non lo sia, ma potresti dare un'occhiata.

Altri suggerimenti

Un potenziale problema in questo codice è l'uso di $.get - viene memorizzato nella cache da IE, quindi il codice del server non viene eseguito ogni volta.Prova a utilizzare $.ajax con cache impostata su false:

$.ajax({
  type: 'GET',
  url: 'includes/boardControl.php',
  cache: false,
  data: {play: value, bid: bid}
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top