views:

931

answers:

3

Update, Solved: After all this I found out that I was calling an old version of my code in the update ajax. 'boardControl.php' instead of 'boardUpdate.php' These are the kinds of mistakes that make programing fun.


I'm writing a browser gomoku game. I have the ajax statement that allows the player to play a piece.

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

value = board square location
bid = board ID

Before creating a user login for player identification, the server side php had a temporary solution. It would rotate the piece state for the squares when clicked instead of knowing what player to create them for.

After creating login stuff I set a session variable for the player's ID. I was hoping to read the session ID from the php during the ajax request and figure out what player they are from there.

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;

For some reason when I run the full web app, the pieces still cycle though, even after I deleted the code to make them cycle. Furthermore, after logging in If i manually load the php page in the browser, it modifies the database correctly (where it only plays pieces belonging to that player) and outputs the correct results.

It seems to me that the session is not being carried over when used with Ajax. Yet Google searches tell me that, sessions do work with Ajax.


Update: I'm trying to provide more information.

  1. Logging in works correctly. My ID is recognized and I printed it out next to the board to ensure that I was retrieving it correctly.

  2. The ajax request does update the board. The values passed are correct and confirmed with firebug's console. However instead of placing pieces only for the player they belong to it cycles though the piece states (0,1,2).

  3. When manually browsing to boardUpdate.php and putting in the same values sent from the Ajax the results seen in the echo'ed response indicates that the corresponding piece is played each time as intended.

  4. Same results on my laptop after fresh load of firefox.

  5. Manually browsing to boardUpdate.php without logging in before hand leave the board unchanged (as intended when no user is found in the session).

  6. I've double checked the that session_start() is on the php files and double checked the session ID variables.

Hope this extra information helps, i'm running out of ideas what to tell you. Should I load up the full code?


Update 2:

After checking the Ajax responce in fire-bug I realized that the 'play' request does not get a result, and the board is not updated till the next 'update'. I'm still looking into this but I'll post it here for you guys too.

boardUpdate.php Notable places are: Refresh Board(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()


?>


Please help, I'd be glad to provide more information if needed. Thanks in advance =)

+1  A: 

One potential problem in this code is the use of $.get - it is cached by IE, so your server code doesn't run every time. Try using $.ajax with cache set to false:

$.ajax({
  type: 'GET',
  url: 'includes/boardControl.php',
  cache: false,
  data: {play: value, bid: bid}
});
Kobi
cache was already set to false.jQuery.ajaxSetup({ cache: false });
Bolt_Head
+2  A: 

From the small snippet of code we have, it's difficult to tell what your problem might be. What I can say is that session_start should be one of the first things you do on each page where you're expecting to use the session. After that, I would just immediately do a var_dump of $_SESSION to see that the data is in there (put a die right after that). It is quite possible that your true problem lies somewhere else, and that the session is in fact working. Is there a problem with your login code, for example, that is causing it to wipe out the session?

You can use Firebug to look at the raw results of your AJAX calls, which should be helpful, since your script appears to work if you directly visit the page.

Cases where I've seen sessions not work as expected have generally been that session_start is being called too often or too late. The other possibility is that you have an insanely short timeout, but that sounds unlikely.

Finally, you can make sure that your PHP install is set to use cookie sessions. It's very unlikely at this point that it wouldn't be, but you could look.

notJim
I didn't realize fire-bug could do that I'll look into it some more. If i can't find out after looking into your suggestions i'll copy the full code from all the pages.
Bolt_Head
fixed it finnally, thanks
Bolt_Head
Just a quick tangential note to say that, one of the few things that you *need* to do before calling session_start is to import all of the classes that have been used to instantiate objects stored in the $_SESSION superglobal.
Rich Pollock
A: 

This is my site which is an ajax gomoku playing online. You can try it at http://www.playfive.info

wangyi