سؤال

تحديث ، حل:بعد كل هذا اكتشفت أنني كنت أتصل بنسخة قديمة من الكود الخاص بي في تحديث AJAX. "boardcontrol.php" بدلاً من "boardupdate.php" هذه هي أنواع الأخطاء التي تجعل البرمجة ممتعة.


أنا أكتب متصفحًا جوموكو لعبه. لدي بيان Ajax الذي يسمح للاعب بلعب قطعة.

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

القيمة = موقع مربع اللوحة
عرض = معرف اللوحة

قبل إنشاء تسجيل دخول للمستخدم لتحديد المشغل ، كان لدى PHP جانب الخادم حل مؤقت. سيؤدي إلى تدوير حالة القطعة للمربعات عند النقر عليها بدلاً من معرفة اللاعب الذي يجب إنشاؤه له.

بعد إنشاء أشياء تسجيل الدخول ، قمت بتعيين متغير جلسة لمعرف اللاعب. كنت آمل أن أقرأ معرف الجلسة من PHP أثناء طلب AJAX ومعرفة اللاعب الذي هم عليه.

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 يدويًا في المتصفح ، فإنه يعدل قاعدة البيانات بشكل صحيح (حيث تلعب فقط القطع التي تنتمي إلى هذا المشغل) وتخرج النتائج الصحيحة.

يبدو لي أن الجلسة لا يتم تنفيذها عند استخدامها مع أياكس. ومع ذلك ، أخبرني عمليات البحث في Google أن الجلسات تعمل مع Ajax.


تحديث: أحاول تقديم المزيد من المعلومات.

  1. تسجيل الدخول يعمل بشكل صحيح. تم التعرف على هويتي وطباعته بجوار اللوحة للتأكد من أنني كنت أسترجعه بشكل صحيح.

  2. طلب AJAX يقوم بتحديث اللوحة. القيم التي تم تمريرها صحيحة وتأكيدها باستخدام وحدة التحكم في Firebug. ولكن بدلاً من وضع القطع فقط للاعب الذي ينتمون إليه دورات على الرغم من أن القطعة تنص (0،1،2).

  3. عند التصفح يدويًا إلى boardupdate.php ووضع نفس القيم المرسلة من Ajax ، تشير النتائج التي شوهدت في استجابة الصدى إلى أن القطعة المقابلة يتم لعبها في كل مرة كما هو مقصود.

  4. نفس النتائج على جهاز الكمبيوتر المحمول الخاص بي بعد حمولة جديدة من Firefox.

  5. التصفح يدويًا إلى boardupdate.php دون تسجيل الدخول قبل أن تترك اللوحة دون تغيير (كما هو مقصود عندما لا يوجد مستخدم في الجلسة).

  6. لقد قمت بفحص Double that Session_start () موجود على ملفات PHP وفحصت متغيرات معرف الجلسة.

آمل أن تساعد هذه المعلومات الإضافية ، فأنا نفاد الأفكار التي أخبرك بها. هل يجب علي تحميل الكود الكامل؟


تحديث 2:

بعد التحقق من استجابة Ajax في حريق ، أدركت أن طلب "اللعب" لا يحصل على نتيجة ، ولا يتم تحديث اللوحة حتى "التحديث" التالي. ما زلت أبحث في هذا لكنني سأقوم بنشره هنا لكم يا رفاق أيضًا.

boardupdate.phpالأماكن البارزة هي: تحديث لوحة (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()


?>


الرجاء المساعدة ، سأكون سعيدًا بتقديم المزيد من المعلومات إذا لزم الأمر. شكرا مقدما =)

هل كانت مفيدة؟

المحلول

من المقتطف الصغير من الكود لدينا ، من الصعب معرفة ما قد تكون مشكلتك. ما يمكنني قوله هو ذلك session_start يجب أن تكون واحدة من أول الأشياء التي تقوم بها في كل صفحة تتوقع فيها استخدام الجلسة. بعد ذلك ، أود فقط القيام على الفور var_dump من $_SESSION لترى أن البيانات موجودة هناك (ضع die بعد ذلك). من الممكن تمامًا أن تكمن مشكلتك الحقيقية في مكان آخر ، وأن الجلسة تعمل في الواقع. هل هناك مشكلة في رمز تسجيل الدخول الخاص بك ، على سبيل المثال ، مما يسبب له مسح الجلسة؟

يمكنك استخدام Firebug للنظر في النتائج الخام لمكالمات Ajax الخاصة بك ، والتي يجب أن تكون مفيدة ، حيث يبدو أن البرنامج النصي يعمل إذا قمت بزيارة الصفحة مباشرة.

الحالات التي رأيت فيها جلسات لا تعمل كما هو متوقع كانت ذلك بشكل عام session_start يتم استدعاؤه في كثير من الأحيان أو متأخر جدا. الاحتمال الآخر هو أن لديك مهلة قصيرة بجنون ، ولكن هذا يبدو غير مرجح.

أخيرًا ، يمكنك التأكد من تعيين تثبيت PHP الخاص بك لاستخدام جلسات ملفات تعريف الارتباط. من غير المحتمل جدًا في هذه المرحلة أنه لن يكون كذلك ، لكن يمكنك أن تنظر.

نصائح أخرى

إحدى المشكلات المحتملة في هذا الرمز هي استخدام $.get - تم تخزينه مؤقتًا بواسطة IE ، لذلك لا يتم تشغيل رمز الخادم الخاص بك في كل مرة. جرب استخدام $.ajax مع ضبط ذاكرة التخزين المؤقت على خطأ:

$.ajax({
  type: 'GET',
  url: 'includes/boardControl.php',
  cache: false,
  data: {play: value, bid: bid}
});
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top