2013-10-10 6 views
0

У меня есть один файл board.php, который отображает плату на моей веб-странице. Этот файл включает в себя файл boardEngine.php, который имеет все инициализированные переменные и матрицы, а также каждую функцию, необходимую для вычисления.php include_once и метод get

Я разместил форму в своем board.php, чтобы я мог ввести свой следующий ход на доске. board.php код выглядит следующим образом:

<!doctype html> 
    <html> 
<body> 
<?php 
include_once('boardEngine.php'); 
?> 

<div id='board'> 


<?php 
if (isset($_GET['move'])) { 
    checkMove($_POST['queryMove']); // checkMove is from boardEngine.php 
} 
    printBoard(); // function from boardEngine.php 

?> 
</div> 

<form id="moveForm" action="board.php?move" method="post" > 

    <input type="text" name="queryMove" placeholder="form: 'e2f3' (e2 to f3)" required> </p> 
    <input type="submit" value=">move!<" > 


</form> 
</body> 

Проблема заключается в том, что, когда я представляю движение, board.php перезагружается с набором $_GET['move']. Так как он перезагружен, кажется, что boardEngine.php снова включается, и все позиции в матрице инициализируются.

Как я понимаю, дело до сих пор, этот шаг представляется, board.php перезагружается, boardEngine.php входит в другой раз с каждой позиции сбрасывается, то, так как переменная $_GET['move'] была установлена ​​через форму, один шаг будет вычисляться. После подачи нового шага плата будет сброшена, и последний шаг будет рассмотрен, и так далее.

Я не прав? Как я могу решить эту проблему?

Edit 1: Вот вид моего boardEngine.php кода:

<?php 

define("PAWN", 10); 
define("KNIGHT", 20); 
define("BISHOP", 30); 
define("ROOK", 40); 
define("QUEEN", 50); 
define("KING", 100); 
define("B_PAWN", -10); 
define("B_KNIGHT", -20); 
define("B_BISHOP", -30); 
define("B_ROOK", -40); 
define("B_QUEEN", -50); 
define("B_KING", -100); 

$board = array( 
    array("", 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'), 
array(1, B_ROOK, B_KNIGHT, B_BISHOP, B_QUEEN, B_KING, B_BISHOP, B_KNIGHT, B_ROOK), 
array(2, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN, B_PAWN), 
array(3, 0, 0, 0, 0, 0, 0, 0, 0), 
array(4, 0, 0, 0, 0, 0, 0, 0, 0), 
array(5, 0, 0, 0, 0, 0, 0, 0, 0), 
array(6, 0, 0, 0, 0, 0, 0, 0, 0), 
array(7, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN, PAWN), 
array(8, ROOK, KNIGHT, BISHOP, QUEEN, KING, BISHOP, KNIGHT, ROOK) 

     ); 


function checkMove($query) { 

global $board; 

if(strlen($query) != 4) { 
    return "Wrong query!"; 
} 
//... 
// Next modfy the $board positions according to rules 


} 

function printBoard() { 
    // ... 
} 
+1

кстати. зачем вам нужен дополнительный параметр $ _GET? is? f (isset ($ _ POST ['queryMove'])) 'недостаточно? – bwoebi

+0

Каждый раз, когда вы загружаете скрипт PHP, он начинается с нового. Все переменные сбрасываются, файлы перезагружаются и т. Д. Единственное, что сохраняется между прогонами, - это переменные сеанса. – Barmar

+0

bwoebi: метод почты довольно достаточно, но не решает мою проблему –

ответ

1

HTTP является протоколом без, что означает, что скрипт будет работать снова и снова для каждого запроса. При отправке формы создается новый запрос.

Вам будет нужно как-то упорствовать в состоянии вашей игры. $_SESSION - хорошая идея, как предложил Бармар.

EDIT: Так как вы вывесили ваш настольный двигатель, и просто начать работу, выполните следующие действия:

1) Добавить session_start(); в начале кода

2) Заменить $board=.... части с `

if(!isset($_SESSION['board'])) 
    $_SESSION['board']=....... 

3) Заменить все вхождения $board в коде с $_SESSION['board']

+0

Честно говоря, я новичок в php, и мыслитые php-файлы не будут загружаться каждый раз из-за include_once(). Использование $ _SESSION отлично работает :) –

1

Как BoardEngine.php взгляд?

Почему бы не сделать его классом? Что-то вроде этого:

class BoardEngine { 

//You can remove the construct function below, if you don't need it 
function __construct(argument) 
{ 
    //Constructor code here if needed 
} 

public function printBoard() 
{ 
    # function code here... 
} 
public function checkMove($var) 
{ 
    # function code here... 
} 
public function yetanotherone() 
{ 
    # function code here... 
} 

}

Вы можете поместить все ваши "двигатель" логику там.

и в вашем board.php:

<?php 
require_once('BoardEngine.php'); 

$boardEngine = New BoardEngine(); 

if (isset($_GET['move'])) { 
    $boardEngine->checkMove($_POST['queryMove']); // checkMove is from boardEngine.php 
} 
    $boardEngine->printBoard(); // function from boardEngine.php 
?> 

<div id='board'> 

</div> 

<form id="moveForm" action="board.php?move" method="post" > 

<input type="text" name="queryMove" placeholder="form: 'e2f3' (e2 to f3)" required> </p> 
<input type="submit" value=">move!<" > 


</form> 
</body> 

Для сохранения движения на каждой перезагрузки, я также хотел бы предложить, используя $_SESSION. Или в вашем BoardEngine классе:

private $lastmove; 

public function setLastMove($value) 
{ 
    $this->lastmove = $value; 
} 
public function getLastMove($value) 
{ 
    return $this->lastmove; 
} 

Теперь в вашем board.php вы можете установить последний ход с:

$boardEngine->setLastmove($var); 

получить его последний ход с:

$boardEngine->getLastmove(); 

EDIT: Чтобы выполнить следующие действия: Чтобы сохранить последний ход как $_SESSION и выполните эхо-код:

$_SESSION['lastmove'] = $boardEngine->getLastmove(); 
echo $_SESSION['lastmove']; 
+0

Дело в том, что «action =» board.php? Move «» перезагрузит мою страницу и, следовательно, снова потребует boardEngine.php и снова создаст класс boardEngine, не так ли? Что мне делать с $ _SESSION? Сохранение в нем позиции платы? –

+0

Он будет устанавливать только класс. Я обновил сообщение о том, как вы могли бы использовать класс для запоминания последнего хода. – Bolli

+0

Чтобы использовать $ _SESSION, просто поместите $ _SESSION = $ yourvalue; Или, если вам нужны дополнительные переменные $ _SESSION, используйте его так: $ _SESSION ['one'] = "one"; $ _SESSION ['two'] = "two"; И так далее – Bolli

0

Во-первых, не говорят

board.php?move в действии. Лучше указывать переменные get со значениями. Измените его на board.php?move=yes

Затем

if(isset($_GET['move'])) if($_GET['move']==="yes") include_once('boardEngine.php'); 
Смежные вопросы