@sarathorn
php программист, веб-дизайнер, коллекционер

Не передаются данные методом POST, как исправить?

Доброй ночи!

Никак не могу понять суть проблемы. Есть сервер Apache+Nginx+php5.6, есть простейший скрипт:
<?php
  if ($_GET['ok']==''){
    echo "<form action='?ok=ok' method='post'>
    <input type='text' name='login' placeholder='Логин'><br>
    <input type='text' name='password' placeholder='Пароль'><br>
    <input type='submit' value='OK'><br>
    </form>";
  }else{
    echo $_POST['login'];
  }
?>


На локалке всё работает, на серваке в инете - нет.

Пробовал выключать register_globals, в волшебные кавычки лазил, не знаю зачем, но уже просто нет идей в чём проблема.

Подскажите, пожалуйста, почему у меня не передаются данные методом POST... Если выбрать метод GET, то всё работает.

UPD
Поиск показал, что массив $_POST пустой.
Через .htaccess и php.ini менял разные значения: от регистр_глобался до php_flag enable_post_data_reading On и php_value variables_order "GPCS"
phpinfo() говорит, что все настройки именно такие.

Через php://input данные видны.

var_dump($_SERVER); показывает, что REQUEST_METHOD => GET. А должен быть POST.

Удалось заставить всё работать через хак:
$postdata = file_get_contents("php://input");
$postdata=explode('&', $postdata);
foreach ($postdata as $k=>$v){
  $v=explode('=', $v);
  $_POST[$v[0]]=urldecode($v[1]);
}

Выглядит ужасно, но хотя бы работает. Очень нужно дать клиенту доступ к админке сайтом... Данные для авторизации приходят методом POST, а массив $_POST пустой, вот и извращаюсь как могу.

Получается, что проблема в связке apache+nginx, ведь так?
  • Вопрос задан
  • 3528 просмотров
Пригласить эксперта
Ответы на вопрос 3
slo_nik
@slo_nik Куратор тега PHP
Добрый вечер.
Первой строкой, всегда, во времена вечные - error_reporting(E_ALL);
Включить вывод всех ошибок, какие только можно.
И после этого приступать к написанию кода!
Укажите атрибуту action значение, если форма и обработчик в одном файле, то попробуйте просто #
В строке if ($_GET['ok']=='') или if ($_POST['ok']=='') будет предупреждение, потому, что таких массивов не существует изначально. Только после отправки формы можно что-то из них получать.
if(isset($_POST)){
   // делаем что-то
}
else{
 // выводим форму
}
Ответ написан
alsopub
@alsopub
Сделайте так:
<?php
  if ($_POST['ok']==''){
    echo "<form action='?' method='post'>
    <input type='hidden' name='ok' value='ok'>
    <input type='text' name='login' placeholder='Логин'><br>
    <input type='text' name='password' placeholder='Пароль'><br>
    <input type='submit' value='OK'><br>
    </form>";
  }else{
    echo $_POST['login'];
  }
?>

Ну или можно добавить name="ok" кнопке сабмита вместо скрытого поля.
Ответ написан
@Geeeek
if(count($_POST) > 0){

}else{

}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы