Проблема переменной POST - PullRequest
0 голосов
/ 12 июня 2009

У меня действительно странная проблема с этим кодом, над которым я сейчас работаю. Это редактор карт для игры, который отправляет переменные для каждой плитки в другой файл 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])

Ответы [ 2 ]

1 голос
/ 12 июня 2009

На что потенциально можно посмотреть:

  1. Время ожидания сценария

  2. Размер почтового отправления. Существуют ограничения, см. Post_max_size в php.ini

0 голосов
/ 12 июня 2009

Первое, что я хотел бы сделать, чтобы попытаться определить проблему, это позвонить

.

print_r($_POST) до $mapName=$_POST['world'];

Тогда я бы добавил следующее во второй цикл:

if(empty($_POST[$currX.','.$currY.'-type'])) 
     die("Failed: currX={$currX} - currY={$currY} - POST DATA: {$_POST[$currX.','.$currY.'-type']}");

Кроме того, mysql_close принимает скобки () => mysql_close();

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...