Переменные PHP $ _POST иногда пусты - PullRequest
8 голосов
/ 04 декабря 2009

Я новичок в PHP, и у меня возникает проблема с переменной POST, которая иногда пуста, когда я отправляю их. Часть, которая делает это трудным для меня, чтобы понять это то, что это происходит не каждый раз, и я обычно могу получить данные поста в моей программе PHP, просто обновив страницу. Иногда это может занять несколько раз, но как только данные пройдут один раз, они будут продолжать проходить нормально.

Другие приложения PHP (Wordpress и другие) работают нормально и никогда не выдают ошибок, поэтому я почти уверен, что с моим приложением php есть проблема.

У меня установлен PHP 4.2.9 на сервере CentOS 5.2, и KeepAliveTimeout имеет значение 1.

Код приложения, в котором я обрабатываю представленные данные:

<?php
    session_start(); 
    if (isset($_SESSION['username'])) {
        $expire = time() + (60*60*24*30);
        setcookie("username", $_SESSION['username'], $expire);
    }

    header("Cache-control: no-cache");

    if (!isset($_SESSION['username'])) {
        header('Location: ./login.php');
        die();
    }

    if(empty($_SERVER['CONTENT_TYPE'])){
        $type = "application/x-www-form-urlencoded";
        $_SERVER['CONTENT_TYPE'] = $type;
    }

    var_dump($_POST);
    echo "\n";
    var_dump($_SERVER);
?>

Буду признателен за любую помощь

Редактировать: Я нашел одно различие между рабочими запросами к почте и теми, которые терпят неудачу. Firebug говорит мне, что когда сообщение терпит неудачу, статус перенаправления 302 вместо 200 ок. Я не совсем уверен, что может вызвать это, но у меня есть контроль кэша заголовка в форме отправки, как это показано в приведенном выше фрагменте кода.

Есть идеи?

Ответы [ 4 ]

7 голосов
/ 06 февраля 2011

Вы забыли параметр name = в теге INPUT.

<input type="text" id="xyz" name="xyz" value="123"/>
0 голосов
/ 06 февраля 2011
header('Location: ./login.php');

По умолчанию это также отправит код состояния 302. Большинство браузеров запрашивают цель 302 с GET-запросом, независимо от исходного типа запроса. Если вы хотите, чтобы оба запроса содержали данные POST, вы можете попробовать 307:

header('Location: ./login.php', true, 307);

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

Кроме того, знаете ли вы, что вы читаете $_SESSION['username'], но, кажется, никогда не пишете на него?

0 голосов
/ 04 декабря 2009

Переменная $_POST заполняется механизмом PHP, а не каким-либо приложением. Итак, если он пустой, он просто пустой, и ваш код должен это учитывать, точно так же, как вы уже это делаете для переменных $_SESSION и $_SERVER.

0 голосов
/ 04 декабря 2009

Вы можете проверить переменную $ _REQUEST, которая является комбинацией массивов $ _POST и $ _GET. Если переменных нет, они не были отправлены, и проблема, вероятно, на стороне клиента.

Вы можете использовать инструменты анализа сетевого трафика, например, Вкладка Net Firebug, чтобы увидеть, что на самом деле было отправлено на сервер.

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