У меня действительно странная проблема с этим кодом, над которым я сейчас работаю. Это редактор карт для игры, который отправляет переменные для каждой плитки в другой файл PHP для обновления базы данных mySQL.
Пока код редактора карты отображает карту и загружает все нормально. PHP-файл обновления карты (mupdate) корректно обновляет базу данных, если заданы переменные непосредственно в коде.
Однако, когда я отправляю данные как переменную POST между файлами, файл mupdate получает их отлично в течение первых 18 раз или около того, а затем перестает читать.
Может кто-нибудь пролить немного света на то, почему это происходит?
(Заранее извиняюсь за мое неряшливое кодирование и за нелепое время загрузки редактора карт, когда он загружает всю карту, я могу изменить это на 10x10 разделов в какой-то момент, но проблема с POST var все еще актуальна. )
Редактор карт:
http://www.locktopia.netne.net/mapedit.php
<?php
//Database Connection
include('DBconnect.php');
//Map Defaults
$world="slums";
$mapInfo=mysql_fetch_assoc(
mysql_query("SELECT * FROM `mapindex` WHERE `NAME` = '".$world."'")
);
$tileSet= $mapInfo['TILESET'];
//Loads Current Location
// Splits the Database Location into the co-ordinates.
$startX=$startY = 1;
list($maxX, $maxY) = split('[,]', $mapInfo['SIZE']);
//Listing tiles in directory
$tileDir = "images/tileSets/".$tileSet."/";
$tilecount = count(glob("" . $tileDir . "*.png"));
$objDir = "images/tileSets/objects/";
$Objcount = count(glob("" . $objDir . "*.png"))-1;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Map Editor</title>
</head>
<body>
//MAP EDITOR V2
<form action="mupdate.php" method="post">
<?php
//Map and Co-Ord values
echo('<input name="world" type="hidden" id="world" value="'.$mapInfo['NAME'].'" />');
echo('<input name="size" type="hidden" id="size" value="'.$mapInfo['SIZE'].'" />');
?>
<table width="100%" border="1" cellpadding="0" cellspacing="0">
<?php
echo($mapInfo['NAME']);
echo($mapInfo['SIZE']);
while($startY<=$maxY){
echo("<tr>"); //BEGIN ROW
while($startX<=$maxX){
echo("<td>");//BEGIN CELL
///////////////////////CELL CONTENT///////////////////////
//Tile Menu
echo('Tile:<br /><select name="'.$startX.','.$startY.'-tile" id="'.$startX.','.$startY.'-tile" size="1" style="overflow:scroll;width:40px;height:20px;">');
$possibleTile=1;
while($possibleTile<=$tilecount){
echo('<option value="'.$possibleTile.'" style="width:40px; height:40px; background-image: url('.$tileDir.$possibleTile.'.png);">'.$possibleTile.'</option>');
$possibleTile++;
}
echo('</select><br />');
echo('Obj LVL1:<br /><select name="'.$startX.','.$startY.'-ob1" id="'.$startX.','.$startY.'-ob1" size="1" style="overflow:scroll;width:40px;height:20px;">');
$possibleObject=0;
while($possibleObject<=$Objcount){
echo('<option value="'.$possibleObject.'" style="width:40px; height:40px; background-image: url('.$objDir.$possibleObject.'.png);">'.$possibleObject.'</option>');
$possibleObject++;
}
echo('</select><br />');
echo('Obj LVL2:<br /><select name="'.$startX.','.$startY.'-ob2" id="'.$startX.','.$startY.'-ob2" size="1" style="overflow:scroll;width:40px; height:20px;">');
$possibleObject=0;
while($possibleObject<=$Objcount){
echo('<option value="'.$possibleObject.'" style="width:40px; height:40px; background-image: url('.$objDir.$possibleObject.'.png);">'.$possibleObject.'</option>');
$possibleObject++;
}
echo('</select>');
echo('Buildable:<br /><select name="'.$startX.','.$startY.'-build" id="'.$startX.','.$startY.'-build" size="1" style="overflow:scroll;width:40px; height:20px;">');
$possibleOption=0;
while($possibleOption<=1){
echo('<option value="'.$possibleOption.'">'.$possibleOption.'</option>');
$possibleOption++;
}
echo('</select>');
echo('Type:<br /><select name="'.$startX.','.$startY.'-type" id="'.$startX.','.$startY.'-type" size="1" style="overflow:scroll;width:40px; height:20px;">');
echo('<option value="passable">Walkable</option>');
echo('<option value="impassable">Blocked</option>');
echo('<option value="teleport">Teleport</option>');
echo('</select>');
//////////////////////////////////////////////////////////
echo("</td>");//END CELL
$startX++;
}
echo("</tr>");//END ROW
$startY++;
$startX=1;
}
?>
</table>
<input type="submit" name="submit" />
</form>
</body>
</html>
Обновление карты: [Нажав кнопку Отправить на приведенной выше странице, вы перейдете к ней)
<?php
//Database Connection
include('common/connectDB.php');
//Printing the Data in the POST array
print_r($_POST);
// A Spacer for convenience's sake
echo('<br /><hr> <br />');
//Setting the Name of the map to update
$mapName=$_POST['world'];
//Getting the Max X/Y dimensions of the map (in tiles)
list($mapX, $mapY) = split('[,]', $_POST['size']);
//Setting the start points for the loops
$currX=1;
$currY=1;
//Row (Y-Axis) Update Loop
while($currY<=$mapY){
//Column (X-Axis) Update Loop
while($currX<=$mapX){
//Checking for missing data on cell Type (Walkable/Blocking/Teleport)
if(empty($_POST[$currX.','.$currY.'-type'])) {
die("Failed on 'type': currX={$currX} - currY={$currY} - POST DATA: {$_POST[$currX.','.$currY.'-type']}");
}
//Checking for missing data on cell Tile (The base graphic, represented by a number which matches an image file)
if(empty($_POST[$currX.','.$currY.'-tile'])) {
die("Failed on 'tile': currX={$currX} - currY={$currY} - POST DATA: {$_POST[$currX.','.$currY.'-tile']}");
}
//mysql_query
echo("UPDATE `maps` SET `TYPE`='".$_POST[$currX.','.$currY.'-type']."', `TILE` = '".$_POST[$currX.','.$currY.'-tile']."', `BUILD` = '".$_POST[$currX.','.$currY.'-build']."', `OBJECTS` = '".$_POST[$currX.','.$currY.'-ob1'].",".$_POST[$currX.','.$currY.'-ob2']."' WHERE CONVERT( `maps`.`MAP` USING utf8 ) = '".$mapName."' AND CONVERT( `maps`.`XY` USING utf8 ) = '".$currX.",".$currY."'");
//A spacer for Clarity's sake
echo('<br />');
//Updating the Column (X-Axis) Value
$currX++;
}
echo("Row ".$currY." of ".$mapY." completed.<br>Sleeping 1 Second.");
//Resetting Column (X-Axis) to 1
$currX=1;
//Updating the Column (Y-Axis) Value
$currY++;
//A spacer for Clarity's sake
echo('<br />');
//Sleep for 1 Second. Stops the DB being overloaded with requests (as discovered with my map generator)
//sleep(1); //uncommented in working version
}
//Closing the DB connection
mysql_close();
?>
Просто чтобы уточнить:
Выходные данные кода не включают значения для плитки, типа и сборки после 19-й записи:
Сравните:
Нет. 19 -
UPDATE `maps` SET `TYPE`='passable', `TILE` = '1', `BUILD` = '0', `OBJECTS` = '0,0' WHERE CONVERT( `maps`.`MAP` USING utf8 ) = 'slums' AND CONVERT( `maps`.`XY` USING utf8 ) = '19,1'
Нет. 20 -
UPDATE `maps` SET `TYPE`='', `TILE` = '1', `BUILD` = '', `OBJECTS` = '0,0' WHERE CONVERT( `maps`.`MAP` USING utf8 ) = 'slums' AND CONVERT( `maps`.`XY` USING utf8 ) = '20,1'
Нет. 21 -
UPDATE `maps` SET `TYPE`='', `TILE` = '', `BUILD` = '', `OBJECTS` = ',' WHERE CONVERT( `maps`.`MAP` USING utf8 ) = 'slums' AND CONVERT( `maps`.`XY` USING utf8 ) = '21,1'
Приложение: Спасибо, Фил, за указание на ошибку mysql_close (), я добавил предложенный вами код, а также добавил проверку для другого var (хотя я не могу использовать его для проверки сборки, так как он использует один int как правда или ложь).
Интересно, что один раз printr ($ _ POST); дал мне полный объем данных, но остальная часть кода потерпела неудачу под номером 20, теперь он отображает его только до номера 20.
Мне интересно, поможет ли это, если я создаю значения записей в массивах (то есть $ _POST [20,1] [type])