2009-10-14 6 views
3

업데이트 : 해결 : 이 모든 후 나는 업데이트 아약스에서 내 코드의 이전 버전을 호출하고 있음을 알게되었습니다. 'boardUpdate.php'대신 'boardControl.php'이것들은 프로그래밍을 재미있게 만드는 종류의 실수입니다.PHP 세션이 JQuery Ajax와 작동하지 않습니까?


나는 브라우저 gomoku 게임을 쓰고 있습니다. 플레이어가 조각을 재생할 수있게 해주는 아약스 선언문이 있습니다.

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

값 = 보드 광장 위치
입찰 = 보드 ID

플레이어 식별을위한 사용자 로그인을 만들기 전에 서버 측 PHP는 임시 해결책을했다. 그것은 어떤 플레이어가 그들을 만들 것인지를 아는 대신 클릭했을 때 사각형의 조각 상태를 회전시킵니다.

로그인 항목을 만든 후 플레이어 ID에 대한 세션 변수를 설정합니다. 나는 아약스 요청을하는 동안 PHP에서 세션 ID를 읽고 거기에서 어떤 플레이어인지 알아 내려고했다. 내가 그들을주기를 만들기 위해 코드를 삭제 한 후에도

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; 

나는 전체 웹 응용 프로그램을 실행하지만 사이클 여전히 조각. 로그인 한 후 브라우저에 수동으로 PHP 페이지를로드하면 데이터베이스를 올바르게 수정 (해당 플레이어에만 속한 부분 만 재생)하고 정확한 결과를 출력합니다.

Ajax와 함께 사용하면 세션이 이월되지 않는 것 같습니다. 그러나 Google 검색은 세션이 Ajax에서 작동 함을 알려줍니다.


업데이트 : 추가 정보를 제공하려고합니다.

  1. 로깅이 올바르게 작동합니다. 내 ID가 인식되고 내가 올바르게 검색했는지 확인하기 위해 보드 옆에 을 인쇄했습니다.

  2. ajax 요청은 보드를 업데이트합니다. 전달 된 값은 이고 방화 광섬유의 콘솔로 확인되었습니다. 그러나 플레이어 대신에 조각을 넣는 대신에 조각에 속합니다. 상태 (0,1,2).

  3. 수동 boardUpdate.php를 탐색하고 echo'ed 응답 에서 본 결과 아약스로부터 송신 동일한 값으로 바꾸어 대응 조각이 의도대로 마다 재생되는 것을 나타낸다.

  4. Firefox를 새로로드 한 후 내 노트북에서와 동일한 결과가 나타납니다.

  5. 수동으로 boardUpdate로 이동합니다.PHP는 에 로그인하지 않고 수동으로 보드 을 그대로 두십시오 (사용자가 세션에서 을 찾지 못한 경우).

  6. 나는 두 번 그 으로 session_start() 체크 PHP 파일 에 두 번 세션 ID를 변수를 확인했습니다.

이 추가 정보가 도움이 되길 바랍니다. 아이디어가 부족합니다. 전체 코드를로드해야합니까?


업데이트 2 :

화재 버그에서 아약스 responce를 확인한 후 나는 '놀이'요청이 결과를 얻을하지 않습니다 실현하고, 이사회는 다음 '갱신'까지 업데이트되지 않습니다. 나는 아직도 이것을 조사하고있다. 그러나 나는 당신을 위해 그것을 여기에서도 게시 할 것이다.

boardUpdate.php 주목할만한 곳은 다음과 같습니다 새로 고침위원회 (LINE6) 장소 조각 (line20) 기능 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() 


?> 


도와주세요, 내가 ' 필요한 경우 더 많은 정보를 제공해 주어 기쁩니다. 미리 감사드립니다 =)

+0

Google이 맞습니다. – mauris

+0

Google이 정확하다고 가정했습니다. (그리스도를 위해서 google입니다). 그러나 나는 아직도 무엇이 잘못되었는지 모른다. –

+0

세션 AJAX에서 작동합니다. – mauris

답변

3

를, 당신의 문제가 무엇인지 이야기하기는 어렵습니다. 제가 말할 수있는 것은 session_start이 세션을 사용하고자하는 각 페이지에서 가장 먼저해야 할 일 중 하나가되어야한다는 것입니다. 그 후에 데이터가 있음을 확인하기 위해 var_dump$_SESSION을 즉시 수행합니다 (바로 그 후에 die 넣기). 진정한 문제가 다른 곳에서있을 가능성이 높습니다. 세션이 실제로 작동하고 있습니다. 로그인 코드에 문제가 있습니까? 예를 들어, 세션을 삭제할 수 있습니까?

Firebug을 사용하면 AJAX 호출의 원시 결과를 볼 수 있습니다. 도움이 될 것입니다. 스크립트를 직접 방문하면 스크립트가 제대로 작동하므로이 호출이 도움이 될 것입니다.

세션이 예상대로 작동하지 않는 경우는 일반적으로 session_start이 너무 자주 또는 너무 늦게 호출되고있는 경우입니다. 다른 가능성은 당신이 미친 듯이 짧은 시간 제한을 가지고 있지만 그럴 것 같지 않다는 것입니다.

마지막으로 PHP 설치가 쿠키 세션을 사용하도록 설정되어 있는지 확인할 수 있습니다. 이 시점에서는 그렇지 않을 수도 있지만, 보일 수는 있습니다.

+0

나는 화재를 알지 못 했어. 벌레가 그걸 좀 더 살펴볼거야. 귀하의 제안을 살펴본 후에도 알 수 없으면 모든 페이지에서 전체 코드를 복사합니다. –

+0

finnally 고쳤습니다. –

+0

session_start를 호출하기 전에 수행해야 할 몇 가지 사항 중 하나는 $ _SESSION에 저장된 객체를 인스턴스화하는 데 사용 된 모든 클래스를 가져 오는 것입니다. 슈퍼 글로벌. –

3

이 코드의 잠재적 인 문제점 중 하나는 $.get입니다. IE에서 캐시되므로 사용자의 서버 코드가 매번 실행되지 않습니다. false로 캐시 세트로 $.ajax를 사용해보십시오 : 우리가 코드의 작은 조각에서

$.ajax({ 
    type: 'GET', 
    url: 'includes/boardControl.php', 
    cache: false, 
    data: {play: value, bid: bid} 
}); 
+0

캐시가 이미 false로 설정되었습니다. jQuery.ajaxSetup ({cache : false}); –

관련 문제