如何在PHP方法中获取用户输入?

时间:2011-02-20 05:59:12

标签: php methods form-submit

我正在使用类编写PHP游戏,而我正试图弄清楚如何在主要游戏方法的中间获取用户输入。我理解从HTML表单提交数据并让PHP脚本使用$_GET$_POST检索数据的概念,但我不知道如何在方法的中间发生这种情况(如果这是处理这个的最好方法)。这是游戏类:

class GamePlay
{
    $playerChoice="";
    $gameOver="false";

    public function play() {
        while !($this->gameOver) {
            doSomething();
            $this->playerChoice=$this->getPlayerInput();
            doSomethingElse();
        }
    }

    public function getPlayerInput() {
        echo '<form name="playerForm" "method="post">';
            echo '<input type="submit" name="submit" value="do this" />';
            echo '<input type="submit" name="submit" value="do that" />';
        echo '</form>';

        $input=$_POST['submit'];
        return $input;
    }
}

但是脚本最终执行doSomethingElse()而不等待用户提交数据,我希望用户在脚本继续之前提交。我该怎么做呢?

3 个答案:

答案 0 :(得分:3)

您对HTTP请求的工作原理存在误解。

您的脚本应独立处理表单的每次提交。我的意思是脚本应该处理请求,显示表单,并终止执行。然后,当用户点击提交时,您的脚本将再次执行。您需要使用sessionscookies之类的内容来保留用户请求之间的状态。

答案 1 :(得分:0)

通常输入来自向服务器发送请求的用户或ajax(链接或ajax对象)。你应该在一个页面上有你的功能的前半部分,在第二页面上有一个完成(通过链接或其他东西到达)。

public function play(){
  while !($this->gameOver){
   doSomething();
  }
}

public function getPlayerInput(){
  echo '<form name="playerForm" "method="post" action="action.php">';
  echo '<input type="submit" name="submit" value="do this" />';
  echo '<input type="submit" name="submit" value="do that" />';
  echo '</form>';
  $input=$_POST['submit'];
  return $input;
}

然后第二页action.php可以通过读取$ _POST变量和doSomethingElse来处理。

答案 2 :(得分:0)

你必须更好地掌握输入在php中的工作原理。

您无法让用户将数据输入到脚本中间。当php脚本开始执行时,所有用户输入已经完成,你只需要处理它。

尝试将方法拆分为两个以模拟预期的行为

class GamePlay
{
  $playerChoice="";
  $gameOver="false";

  public function pendingInput() {
    // check for input into $_GET or $_POST and return data or false
    // something like (this function maybe a lot more complicate (or splitted
    // into smaller ones): 
      if (isset($_POST['submit']) {
         // always check user input for forgeries
         // you have to write the sanitize function obviously
         $input=sanitize($_POST['submit']); 
        return $input;
      } else {
        return false;
      }
  }

  public function play(){
      if (!$this->gameOver) {
         $input =  $this->pendingInput();
         if($input) {
            $this->applyUserMove($input);
            $this->doComputerMove();
         }
         $this->getPlayerInput();
      } else {
         $this->gameEnds();
      }
  }

  public function getPlayerInput(){
      echo '<form name="playerForm" "method="post">';
      echo '<input type="submit" name="submit" value="do this" />';
      echo '<input type="submit" name="submit" value="do that" />';
      echo '</form>';
  }

  public function gameEnds() {
      echo 'The game is over. The winner is blah blah ... ';
      echo 'play another game?';
      echo 'link to start game...';
  }

}

您必须考虑在问题中设计的while循环的单次运行。使用会话(因为http是无状态的)并让服务器/客户端负责循环。

注意:这只是解决问题的方法,还有其他方法,但这与您的预期解决方案类似。

一些额外的提示:您可以将php游戏视为Finite State Automata

  • 你从外面得到输入
  • 更改您的内部状态
  • 输出通知用户您的新状态
  • 最终等待输入

您可以使用调度程序选择状态并为每个状态编写方法,或者只使用applyUserMove等厨房接收器方法并在内部操作交换机。无论哪种方式,你必须做的工作(作为程序)是相同的。