Question

Mise à jour, Résolu: Après tout cela, j'ai découvert que j'appelle une ancienne version de mon code dans la ajax mise à jour. « BoardControl.php » au lieu de « boardUpdate.php » Ce sont les types d'erreurs qui se moquent de la programmation.


J'écris un navigateur gomoku jeu. Je l'instruction ajax qui permet au joueur de jouer un morceau.

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

= valeur carte emplacement carré
= ID offre du conseil d'administration

Avant de créer un login utilisateur pour l'identification des joueurs, du côté du serveur php avait une solution temporaire. Il tournerait l'état de pièce pour les places quand on clique dessus au lieu de savoir ce que le joueur à les créer pour.

Après avoir créé des choses de connexion I définir une variable de session pour l'ID du joueur. J'espérais lire l'ID de session du php lors de la demande ajax et comprendre ce joueur qu'ils sont de là.

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;

Pour une raison quelconque quand je lance l'application Web complète, les morceaux encore que le cycle, même après avoir supprimé le code pour les rendre cycle. En outre, après la connexion Si je charger manuellement la page php dans le navigateur, il modifie la base de données correctement (où il ne joue que des pièces appartenant à ce joueur) et délivre les résultats corrects.

Il me semble que la session ne soit pas reporté lorsqu'il est utilisé avec Ajax. Pourtant, les recherches Google me disent que, sessions fonctionnent avec l'Ajax.


Mise à jour:. Je suis en train de fournir plus d'informations

  1. Exploitation forestière en fonctionne correctement. ma ID est reconnu et je l'imprimait à côté du conseil d'administration pour veiller à ce que Je récupérait correctement.

  2. La demande ajax ne met à jour la planche. Les valeurs transmises sont correct et confirmé avec Firebug de console. Cependant, au lieu de placer pièces seulement pour le joueur qu'ils lui appartiennent cycles bien que la pièce états (0,1,2).

  3. Lorsque vous naviguez manuellement boardUpdate.php et de mettre en mêmes valeurs envoyées par l'Ajax les résultats observés dans la réponse echo'ed indique que le correspondant morceau est joué chaque fois que prévu.

  4. Les mêmes résultats sur mon ordinateur portable après fraîche charge de firefox.

  5. Navigation manuelle à boardUpdate.php sans se connecter avant la main quitter le conseil d'administration inchangé (comme prévu si aucun utilisateur se trouve dans la session).

  6. Je l'ai vérifié deux fois l'que session_start () est sur les fichiers php et revérifié l'ID de session les variables.

Espérons que cette information supplémentaire aide, je suis à court d'idées quoi vous dire. Dois-je charger le code complet?


Mise à jour 2:

Après avoir vérifié l'responce Ajax dans le feu-bug j'ai réalisé que la demande « jeu » ne soit pas un résultat, et le conseil d'administration est mis à jour jusqu'à ce que le pas suivant « mise à jour ». Je suis toujours en cela, mais je vais le poster ici pour vous les gars aussi.

boardUpdate.php sont notables lieux: Actualisez Conseil (Line6) Placer la pièce (line20) fonction 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()


?>


S'il vous plaît aider, je serais heureux de vous fournir plus d'informations en cas de besoin. Merci d'avance =)

Était-ce utile?

La solution

Du petit bout de code que nous avons, il est difficile de dire ce que votre problème est peut-être. Ce que je peux dire est que session_start devrait être l'une des premières choses que vous faites sur chaque page où vous vous attendez à utiliser la session. Après cela, je voudrais juste faire une var_dump immédiatement de $_SESSION pour voir que les données sont là (mettre un die juste après). Il est tout à fait possible que votre vrai problème est ailleurs, et que la session est en travail de fait. Y at-il un problème avec votre code de connexion, par exemple, qui est à l'origine d'effacer la session?

Vous pouvez utiliser Firebug pour regarder les résultats bruts de vos appels AJAX, ce qui devrait être utile, car votre script semble fonctionner si vous visitez directement la page.

Cas où je l'ai vu séances de travail pas comme prévu ont généralement été que session_start est trop souvent appelés ou trop tard. L'autre possibilité est que vous avez un délai incroyablement court, mais cela semble peu probable.

Enfin, vous pouvez vous assurer que votre installation de PHP est configuré pour utiliser des sessions de cookies. Il est très peu probable à ce stade que ce ne serait pas, mais vous pouvez regarder.

Autres conseils

Un problème potentiel dans ce code est l'utilisation de $.get - il est mis en mémoire cache par Internet Explorer, de sorte que votre code serveur ne fonctionne pas à chaque fois. Essayez d'utiliser $.ajax avec jeu de cache false:

$.ajax({
  type: 'GET',
  url: 'includes/boardControl.php',
  cache: false,
  data: {play: value, bid: bid}
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top