Frage

Update, Gelöst: Schließlich fand diese ich heraus, dass ich in dem Update-Ajax eine alte Version von meinem Code rufe. ‚BoardControl.php‘ anstelle von ‚boardUpdate.php‘ Dies sind die Arten von Fehlern, die Programmierung Spaß machen.


Ich schreibe ein Browser gomoku Spiel. Ich habe die Ajax-Anweisung, die der Spieler erlaubt, ein Stück zu spielen.

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

value = board square Lage
Gebot = board ID

Bevor eine Benutzeranmeldung für Spieler Identifikation zu schaffen, mußte die Server-Seite PHP eine temporäre Lösung. Es wäre das Stück Zustand für die Quadrate drehen, wenn denn anstatt zu wissen, was Spieler erstellen sie angeklickt wird.

Nach der Anmeldung Sachen Erstellen stellte ich ein Session-Variable für die ID des Spielers. Ich habe gehofft, dass die Session-ID aus der PHP während des Ajax-Request und herauszufinden, zu lesen, was Spieler sind sie von dort aus.

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;

Aus irgendeinem Grund, wenn ich die volle Web-Anwendung ausführen, die Stücke noch Zyklus aber auch nachdem ich den Code gelöscht sie Zyklus zu machen. Darüber hinaus Nach der Anmeldung Wenn ich manuell die PHP-Seite im Browser geladen werden, es die Datenbank modifiziert richtig (wo es nur spielt Stücke zu diesem Spieler gehören) und gibt die richtigen Ergebnisse.

Es scheint mir, dass die Sitzung nicht übertragen, wenn sie mit Ajax verwendet wird. Doch Google-Suchanfragen sagen Sie mir, dass Sitzungen Arbeit mit Ajax zu tun.


Zu Aktualisieren. Ich versuche, mehr Informationen zu liefern

  1. Protokollierung in ordnungsgemäß funktioniert. Meine ID wird erkannt und ich gedruckt es out neben dem Spielbrett, um sicherzustellen, dass Ich war es richtig abgerufen werden.

  2. Die Ajax-Anforderung bewirkt das Update Tafel. Die Werte übergeben werden korrekt und mit Firebug bestätigt Konsole. Doch statt Platzierung Teile nur für den Spieler sie gehören dazu Zyklen obwohl das Stück Staaten (0,1,2).

  3. Beim Surfen manuell boardUpdate.php und in der Umsetzung gleiche Werte gesendet aus dem Ajax der Die Ergebnisse in der echo'ed Reaktion gesehen zeigt an, dass das entsprechende Stück wird jedes Mal gespielt als vorgesehen.

  4. Die gleiche Ergebnis auf meinem Laptop nach frische Ladung von Firefox.

  5. manuell Surfens boardUpdate.php ohne sich anzumelden vor der Hand verlassen den Vorstand unverändert (wie kein Benutzer vorgesehen, wenn wird in der Sitzung gefunden).

  6. Ich habe überprüft doppelt so dass session_start () ist auf die PHP-Dateien und überprüft die doppelte Session-ID Variablen.

Hope diese zusätzliche Informationen helfen, ich bin mit der Ratlosigkeit, was Sie sagen. Soll ich den vollständigen Code laden?


Update 2:

Nach dem Ajax Antwort-Brand-bug Ich erkannte Überprüfung, dass die ‚Play‘ Anfrage kein Ergebnis erhalten, und die Platte wird nicht bis zum nächsten ‚update‘ aktualisiert. Ich bin immer noch in diese suchen, aber ich werde es hier posten für euch auch.

boardUpdate.php Bemerkenswerte Orte sind: Aktualisieren Board (line6) Platz Stück (line20) Funktion 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()


?>


Bitte helfen Sie, ich würde mich freuen, mehr Informationen zu liefern, wenn nötig. Vielen Dank im Voraus =)

War es hilfreich?

Lösung

Von dem kleinen Code-Schnipsel wir haben, ist es schwierig zu sagen, was das Problem sein könnte. Was ich sagen kann ist, dass session_start eines der ersten Dinge, die Sie sollten auf jeder Seite zu tun, wo Sie erwarten, um die Sitzung zu verwenden. Danach würde ich nur sofort eine var_dump von $_SESSION, um zu sehen, dass die Daten in ihm (ein die gleich danach setzen). Es ist durchaus möglich, dass Ihr wahres Problem liegt woanders, und dass die Sitzung in der Tat funktioniert. Gibt es ein Problem mit Ihrem Login-Code, zum Beispiel, dass es auszulöschen die Sitzung verursacht?

Sie können mit Firebug an den rohen Ergebnisse Ihrer AJAX Anrufe suchen, die hilfreich sein sollte, da das Skript wenn Sie direkt angezeigt zu arbeiten, um die Seite besuchen.

Fälle, in denen ich Sitzungen gesehen habe nicht wie erwartet im Allgemeinen gewesen, dass session_start zu oft oder zu spät genannt wird. Die andere Möglichkeit ist, dass Sie eine wahnsinnig kurze Auszeit, aber das klingt unwahrscheinlich.

Schließlich können Sie sicherstellen, dass Ihre PHP zu verwenden Cookie-Sitzungen gesetzt installieren. Es ist sehr unwahrscheinlich, an dieser Stelle, dass es nicht wäre, aber man konnte sehen.

Andere Tipps

Ein mögliches Problem in diesem Code ist die Verwendung von $.get - es wird von IE zwischengespeichert, so dass Ihr Server-Code nicht jedes Mal ausgeführt werden. Versuchen Sie es mit $.ajax mit Cache-Satz auf false:

$.ajax({
  type: 'GET',
  url: 'includes/boardControl.php',
  cache: false,
  data: {play: value, bid: bid}
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top