0

我正在创建 Flash 游戏。这是计时器,它计算玩家玩了多长时间。当“游戏结束”计数器停止。我需要把这个时间写到数据库中。我的计数器格式是 MM:SS,所以我不知道该怎么做。

这是我将数据从游戏发送到 php 的代码:

var urlReq:URLRequest = new URLRequest ("band.php");

// Set the method to POST
urlReq.method = URLRequestMethod.POST;

// Define the variables to post    
var urlVars:URLVariables = new URLVariables();
urlVars.time = timer.currentCount;
urlVars.userName = "myUserName";

// Add the variables to the URLRequest
urlReq.data = urlVars;  

// Add the URLRequest data to a new Loader
var loader:URLLoader = new URLLoader (urlReq);

// Set a listener function to run when completed
loader.addEventListener(Event.COMPLETE, onLoginComplete);

// Set the loader format to variables and post to the PHP
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.load(urlReq);

所以我将我的time变量发送到 php。

这是获取时间的php代码:

<?php 
$time = $_POST['time'];
$username = $_POST['userName'];

    $con=mysqli_connect("localhost","my_db","pass","my_db");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }
    mysqli_query($con,"INSERT INTO eurokos (time, userName)
    VALUES ('$time', '$username')"); 
    $query = "INSERT INTO eurokos VALUES" . "('$time', '$username')";
    echo "success=true";

?>

所以用户名成功插入数据库,这意味着向php发送变量一切都很好,但时间总是“0”值,所以这意味着定时器有问题。

我的计时器看起来像:

function showTimePassed(startTime:int):String {

  var leadingZeroMS:String = ""; //how many leading 0's to put in front of the miliseconds
  var leadingZeroS:String = ""; //how many leading 0's to put in front of the seconds
  var leadingZeroM:String = "";

  var time = getTimer() - startTime; //this gets the amount of miliseconds elapsed
  var miliseconds = (time % 1000); // modulus (%) gives you the remainder after dividing, 

  if (miliseconds < 10) { //if less than two digits, add a leading 0
    leadingZeroMS = "0";
  }

  var seconds = Math.floor((time / 1000) % 60); //this gets the amount of seconds

  if (seconds < 10) { //if seconds are less than two digits, add the leading zero
    leadingZeroS = "0";
  }

  var minutes = Math.floor((time / (60 * 1000) ) );
    if (minutes < 10) { //if seconds are less than two digits, add the leading zero
    leadingZeroM = "0";
  }
  //60 seconds times 1000 miliseocnds gets the minutes
  return leadingZeroM + minutes + ":" + leadingZeroS + seconds ;     
}

我不知道出了什么问题,为什么不插入数据库。你可以帮帮我吗?谢谢。

更新

<?php 
        $time = $_POST['time'];
    $username = $_POST['userName'];
    session_start();
$name = $_SESSION['vardas']; 
    $times = gmdate('H:m:s', $time);
    $con=mysqli_connect("localhost","padekime_db","pass","my_db");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

    $query = "INSERT INTO eurokos VALUES" . "('$times', '$username')";
    echo "success=true";
if ($stmt = $mysqli->prepare("INSERT into eurokos (time, userName) VALUE (?,?) ")) {

   $stmt->bind_param("i", $time);
   $stmt->bind_param("s", $name);
   $stmt->execute();
}
?>

更新 2

    function startMemoryGame():void
    {
        addChild(CardContainer);

            timer = new Timer(1000); //create a new timer that ticks every second.
            timer.addEventListener(TimerEvent.TIMER, tick, false, 0, true); //listen for the timer tick
            timer.addEventListener(TimerEvent.TIMER, resetTimer);
            txtTime = new TextField();



        var format:TextFormat = new TextFormat();
        format.font = "Verdana";
        format.color = "#E50041";
        format.size = 22;
        txtTime.border = true;
        txtTime.borderColor = 0xFFFFFF;
        //format.bold = true;  
        //txtTime.x = 250;
        txtTime.width/2;



        var stageCenter_x:Number = stage.stageWidth/2;
        var stageCenter_y:Number = stage.stageHeight/2;

        var textCenter_x:Number = txtTime.width/2;
        var textCenter_y:Number = txtTime.height/2;

        txtTime.x = stageCenter_x - textCenter_x;
        txtTime.y = 55;

        txtTime.autoSize = TextFieldAutoSize.CENTER;
       txtTime.defaultTextFormat = format;
       message_txt.autoSize = TextFieldAutoSize.CENTER;
       message_txt.defaultTextFormat = format;

                        txtTime.text = setNull(0);
            addChild(txtTime);
            tmpTime = getTimer();
            timer.start();
            }

private function tick(e:Event):void {
       txtTime.text = showTimePassed(tmpTime);                  


    }
    function setNull(startTime:int):String {
     return "00:00";
    }
    function showTimePassed(startTime:int):String {

      var leadingZeroMS:String = ""; //how many leading 0's to put in front of the miliseconds
      var leadingZeroS:String = ""; //how many leading 0's to put in front of the seconds
      var leadingZeroM:String = "";

      var time = getTimer() - startTime; //this gets the amount of miliseconds elapsed
      var miliseconds = (time % 1000); // modulus (%) gives you the remainder after dividing, 

      if (miliseconds < 10) { //if less than two digits, add a leading 0
        leadingZeroMS = "0";
      }

      var seconds = Math.floor((time / 1000) % 60); //this gets the amount of seconds

      if (seconds < 10) { //if seconds are less than two digits, add the leading zero
        leadingZeroS = "0";
      }

      var minutes = Math.floor((time / (60 * 1000) ) );
        if (minutes < 10) { //if seconds are less than two digits, add the leading zero
        leadingZeroM = "0";
      }
      //60 seconds times 1000 miliseocnds gets the minutes
      return leadingZeroM + minutes + ":" + leadingZeroS + seconds ;



    }

    function getTimePassed(startTime:int):Number {
     return  (getTimer() - startTime) /1000;
    }

这里将变量发送到php:

  var urlReq:URLRequest = new URLRequest ("band.php");

    // Set the method to POST
    urlReq.method = URLRequestMethod.POST;

    // Define the variables to post    
    var urlVars:URLVariables = new URLVariables();
    urlVars.userName = 'myUsername';

    urlVars.time = getTimePassed(startTime); // HERE I GET ERROR
    // Add the variables to the URLRequest
    urlReq.data = urlVars;  

    // Add the URLRequest data to a new Loader
    var loader:URLLoader = new URLLoader (urlReq);

    // Set a listener function to run when completed
    loader.addEventListener(Event.COMPLETE, onLoginComplete);

    // Set the loader format to variables and post to the PHP
    loader.dataFormat = URLLoaderDataFormat.VARIABLES;
    loader.load(urlReq);
}
4

1 回答 1

0

mysql 中时间的值始终为 0,因为 MySql 以字符串“MM:SS”接收时间,并且字段时间的数据类型为 INT。

您有 2 个解决方案:在插入查询之前将 MM:SS 转换为 PHP 端的秒数,或者从 Flash 端发送总秒数(从我的 pov 中更好)。

更新:直接从计时器实例中获取经过的时间

[...]

urlVars.time = timer.currentCount; // time elapsed in seconds

在 PHP 端,使用准备好的语句:

更新:在数据库中节省时间/用户名的完整脚本 [...]

$time = $_POST['time'];
$username = $_POST['userName'];

$mysqli = new mysqli("localhost","padekime_db","pass","my_db");

if ($stmt = $mysqli->prepare("INSERT into eurokos (time, userName) VALUES (?,?) ")) {

   $stmt->bind_param('is',$time,$username);

   $stmt->execute();

   if ($stmt->error != '') {
       echo ' error:'.$stmt->error;
   } else {
       echo 'success';
   }
   $stmt->close();
} else {
   echo 'error:'.$mysqli->error;
}

如果你在处理程序中trace的值,你应该看到“成功”或“错误:错误描述”loader.dataonLoginComplete

http://www.php.net/manual/en/mysqli-stmt.prepare.php

于 2013-05-09T14:03:13.430 回答