Как получить пользовательский ввод в середине метода PHP? - PullRequest
0 голосов
/ 20 февраля 2011

Я пишу игру на 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 ]

3 голосов
/ 20 февраля 2011

У вас неправильное представление об основах работы HTTP-запросов.

Ваш скрипт должен обрабатывать каждую отправку формы самостоятельно. Я имею в виду, что скрипт должен обработать запрос, отобразить форму и прекратить выполнение. Затем, когда пользователь нажмет кнопку «Отправить», ваш скрипт будет выполнен снова. Вам нужно будет использовать что-то вроде сеансов или куки , чтобы сохранить состояние между запросами пользователей.

0 голосов
/ 20 февраля 2011

Вы должны лучше понять, как работает ввод в 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...';
  }

}

Вынужно подумать об одном цикле цикла, который вы разработали в своем вопросе.Используйте сеансы (так как http не имеет состояния) и пусть сервер / клиент позаботится о цикле.

Примечание: Это просто подход к проблеме, есть другие, но это похожек вашим предполагаемым решениям.

Некоторые дополнительные подсказки: Вы можете думать о php-игре как о конечных автоматах :

  • васполучить вход извне
  • изменить свой внутренний статус
  • выход для информирования пользователя о вашем новом статусе
  • в конечном итоге дождаться ввода

Вы можете использоватьдиспетчер, чтобы выбрать состояние и написать метод для каждого состояния или просто сделать метод кухонной раковины, как applyUserMove, и управлять коммутатором внутри.В любом случае работа (как программа), которую вы должны выполнять, одинакова.

0 голосов
/ 20 февраля 2011

Обычно вводится от пользователя или 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 с ним.

...