PHP oturum JQuery Ajax ile çalışmıyor?

2 Cevap php

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

Oyuncu tanımlama için bir kullanıcı oturum oluşturmadan önce, sunucu tarafında php geçici bir çözüm vardı. Yerine onları oluşturmak için hangi oyuncu bilerek tıklandığında o kareler için parça devleti döndürmek olacaktır.

Giriş şeyler yaratmak sonra oyuncunun kimliği için bir oturum değişkeni ayarlayın. Ben ajax isteği sırasında php gelen oturum kimliği okumak ve onlar oradan ne oyuncu anlamaya umuyordum.

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.

Bu Ajax ile kullanıldığında oturum üzerinde taşınırken değil gibi geliyor bana. Oysa Google aramaları oturumları Ajax ile çalışır, söyle.


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:

Yangın-bug Ajax yanıtının kontrol ettikten sonra ben 'oyun' talebi bir sonuç almaz fark, ve yönetim kurulu bir sonraki 'update' kadar güncellenir değildir. Ben hala bu içine arıyorum ama ben de çocuklar için burada yayınlayacağız.

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 =)

2 Cevap

Elimizdeki kod küçük parçacığını bakıldığında, bu sorunun ne olabileceğini söylemek zor. Ne diyebilirim session_start siz oturumu kullanmak için bekliyoruz her sayfada yapmanız ilk şeylerden biri olmasıdır. Bundan sonra, ben sadece hemen bir var_dump (a die hemen sonra koymak) $_SESSION veri orada olduğunu görmek için bir yapardı. Bu gerçek sorun başka bir yerde yatıyor, ve oturum aslında çalışma olduğunu oldukça mümkündür. Örneğin, o oturumu silip neden giriş kodu ile ilgili bir sorun var mı?

Script doğrudan sayfasını ziyaret ederseniz çalışmak için görünür beri, Firebug yardımcı olmalıdır AJAX çağrıları, ham sonuçlarına bakmak için kullanabilirsiniz.

Beklediğim gibi oturumları işe gördüm durumlarda genellikle session_start çok sık veya çok geç çağrıldığını olmuştur. Diğer olasılık delicesine kısa zaman aşımı var, ama olası sesler olduğunu.

Son olarak, PHP yüklemek çerez oturumları kullanmak için ayarlanmış olduğundan emin olun. Bu olmaz bu noktada çok muhtemel, ama sen bakmak olabilir.

Bu kodda bir potansiyel sorun $.get kullanımı - IE tarafından önbelleğe, böylece sunucu kodu her zaman çalışmaz. Ayarlamak false önbellek ile $.ajax kullanmayı deneyin:

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