Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Странное поведение $_POST
Форумы портала PHP.SU » » HTTP и PHP » Странное поведение $_POST

Страниц (1): [1]
 

1. Herr Direktor - 13 Мая, 2015 - 10:06:22 - перейти к сообщению
Здравствуйте, уважаемые.

Столкнулся с труднообъяснимой проблемой. За 3 дня победить не смог. Хочу спросить совета у бывалых (ну может, кто-то сталкивался с таким уже).

Итак, суть проблемы.

1. Имеем php код с формой (код упрощен)
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $content=   '<form name="chd" action="chd.htm" method="POST">'.
  4. 'Input:<input type="text" name="z1" size=50>'.
  5. '<input type="hidden" name="z2" value="test">'.
  6. '<input type="submit" name="submit">';
  7.  
  8. echo $content;
  9. ?>
  10.  

Все просто, да?
В этом же файле принимаем $_POST, проверяем всякими разными способами (всякие надписи - это я уже для наглядности самому себе выводил).
PHP:
скопировать код в буфер обмена
  1.  
  2. if (isset ($_POST['z1']))
  3. $content.= '1 ';
  4. else
  5. $content.= ' 0 ';
  6.  
  7. if (empty ($_POST['z1']))
  8. $content.= ' empty ';
  9. else
  10. $content.= ' not empty '
  11.  
  12.  


Все отлично, все в наличии.
Можно сделать echo $_POST['z1'], все будет показываться
var_dump выводит содержимое массива, ничего не теряется, не ломается.

Чудеса начинаются в том случае, если делается попытка записать данные из $_POST в файл или базу. Он просто записывается пустым.
Например
PHP:
скопировать код в буфер обмена
  1.  
  2. $fedit = fopen ("./tmp/123.txt", "w");
  3. fwrite ($fedit, "post:".$_POST['z1'].'post_r:'.$_REQUEST['z1'].'post_dump:'.var_dump($_POST).'len:'.strlen($_POST['z1']));
  4. fclose ($fedit);
  5.  

Записывает только слова в кавычках (post, post_r, post_dump и т.п.) Длина строки разумеется 0.
Однако, если делать вывод через echo
PHP:
скопировать код в буфер обмена
  1.  
  2. echo 'len:'.strlen($_POST['z1']);
  3.  

то длина строки выводится, причем неважно, ДО записи в файл этот код поставить или ПОСЛЕ.
Записывать значение $_POST пробовал и в переменные, навроде $a1 = $_POST['z1']; ... Объявлял их global, никакого толку. Все одно - при записи в БД или в файл пишется пустота, а в браузер выводится.

Но самое смешное не в этом. Самое смешное, что в этом же файле есть очень похожая форма, которая работает и пишет в БД, без всяких нареканий.

Вынес в отдельный файл свою форму, обработчк $_POST в другой файл - результат тот же, в браузер выводит, в файл\базу - нет.
Замечу, что этот участок кода когда-то давно работал, а вот когда прекратил... Этот момент я упустил и обнаружил случайно, когда посетители стали жаловаться на то, что их данные при обновлении через форму исчезают.

PHP обновлял последовательно с 5.2.17 до 5.3\5.3.3\5.4 - результата нет. Апач обновил с 2.1.х до 2.2 - результата нет.
OS - CentOS 6.5, в контейнере Virtuozzo.

Имеется .htacess с rewrite (заменяет расширения .php на htm). Выключение оного никаких изменений не дает.
CODE (html):
скопировать код в буфер обмена
  1.  
  2. RewriteEngine on
  3. RewriteRule ^.htaccess$ - [F]
  4.  
  5. RewriteRule ^goto/$ goto/index.php
  6. RewriteRule ^(.*).htm$ index.php
  7. RewriteRule ^(.*)/$ index.php
  8.  


Если создать новый vhost и переместить туда код целиком - глюки такие же. Если в нем сделать просто файл с формой - все пишется, все работает.

А теперь собственно, вопрос. Куда может деваться значение из $_POST исключительно при записи в файл\БД?!
2. Sail - 13 Мая, 2015 - 10:14:38 - перейти к сообщению
Herr Direktor пишет:
Куда может деваться значение из $_POST исключительно при записи в файл\БД?!

Чудес ведь не бывает.
Раскидайте по коду

Быть может, станет понятнее...
Ну и закрыть тег <form></form> не помешало-б.
3. Herr Direktor - 13 Мая, 2015 - 10:33:18 - перейти к сообщению
Чудес-то не бывает, согласен...
var_dump показывает все содержимое на протяжении всего скрипта.

Вот содержимое файла целиком (с мусором)
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. echo var_dump($_POST);
  4. $title = '123';
  5. $res = strlen ($_POST['z1']);
  6.  
  7. $content ='';
  8. if (isset ($_POST['z1']))
  9. $content.= ' not null ';
  10. else
  11. $content.= ' is null ';
  12.  
  13. if (empty ($_POST['z1']))
  14. $content.= ' empty ';
  15. else
  16. $content.= ' not empty '.$res;
  17. echo var_dump($_POST);
  18.      $fedit = fopen ("./tmp/123.txt", "w");
  19.         fwrite ($fedit, "post:".$res.'post_h:'.$_REQUEST['z1'].'post_dump:'.var_dump($_POST).'len:'.strlen($_POST['z1']).'ver:'.phpversion());
  20.      fclose ($fedit);
  21. $_SESSION ['z1'] = $_POST['z1'];
  22. //$query = mysql_query ("update users set name1 = 'sddfdfdf' where `uid`=456");
  23. $content.= 'z1='.$_SESSION ['z1'];
  24. $content.=                 '<form name="chd" action="chd.htm" method="POST">'. // action="" method=post><br>'.
  25.                                 ''.
  26.                            'Input:<input type="text" name=\'z1\' id="n1" size=50>'.
  27.                                 '<input type="hidden" name="z2" value="test">'.
  28.                                 //'<input type="image" name="submit" src="./i/ok.png" onclick="document.chd.submit();">'.
  29.                         '<input type="submit" name="submit" src="./i/ok.png"></form>'.
  30.                         'POST:'.var_dump($_POST).'->'.$_POST['z1'];
  31.  
  32. echo $content;
  33. echo var_dump($_POST);
  34. //print_r ($_POST['n1'], true);
  35. //$_POST['n2'] = "posing";
  36. ?>
  37.  


Т.е. содержимое остается в POST (REQUEST), но не пишется в файл.
Даже если сделать так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $a1 = $_POST['z1'].'test!';
  3.  
  4.  

В браузер выведется содержимое POST + test1, а в файл запишется только test1.

Мистика блин Недовольство, огорчение

ЗЫ
Вот вывод в файл:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. post:0post_h:post_dump:len:0ver:5.4.40
  3.  

Вот вывод var_dump:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. array(3) { ["z1"]=> string(12) "чясячсячсячс" ["z2"]=> string(4) "test" ["submit"]=> string(9) "Отправить" }
  3.  
4. Sail - 13 Мая, 2015 - 12:24:29 - перейти к сообщению
Herr Direktor, у меня ошибка не воспроизводится Недовольство, огорчение
Видимо, с путями к файлу что-то...
Попробуйте такой кусок кода использовать (взамен 19-21 строк из вышеприведённого):
PHP:
скопировать код в буфер обмена
  1.     $fName = "real file path"; // указать желательно полный путь к файлу.
  2.     $fedit = fopen ($fName, "w");
  3.     if($fedit === FALSE) {
  4.         exit('Ошибка открытия файла');
  5.     }
  6.     $fwResult = fwrite ($fedit, "post:".$res.'; post_h:'.$_REQUEST['z1'].'; len:'.strlen($_POST['z1']).'; ver:'.phpversion());
  7.     if($fwResult === FALSE) {
  8.         exit('Ошибка записи в файл');
  9.     }
  10.     fclose ($fedit);
  11.     $str = file_get_contents($fName);
  12.     var_dump("***", $str);
  13.  
5. Herr Direktor - 13 Мая, 2015 - 13:52:41 - перейти к сообщению
Да не... Проблема не в путях, файл-то создается и в него записывается все, кроме данных из POST.
Код выше, увы, делает все то же самое, т.е. пишет только явно указанное (т.е. строки "post:" и т.п.)

Как я уже отмечал, если снести вообще ВЕСЬ код (его много) и оставить ТОЛЬКО файл скрипта, то все работает.

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

В общем, к такому жизнь меня не готовила Недовольство, огорчение

ЗЫ
Кстати, если POST поменять на GET, то все работает. Но как-то негламурно через GET передавать логин и пароль из формы.
6. Мелкий - 13 Мая, 2015 - 13:58:15 - перейти к сообщению
- $fedit = fopen ("./tmp/123.txt", "w");
+ $fedit = fopen ("./tmp/123.txt", "a");

Подозрение на двойной вызов кода. Первый методом POST и вы видите все echo, затем дублирующий без поста, перезаписывает файл.
7. Sail - 13 Мая, 2015 - 14:02:16 - перейти к сообщению
Неужели header(location..) где-то без завершения работы скрипта?
8. Herr Direktor - 13 Мая, 2015 - 14:12:37 - перейти к сообщению
Мелкий пишет:
- $fedit = fopen ("./tmp/123.txt", "w");
+ $fedit = fopen ("./tmp/123.txt", "a");

Подозрение на двойной вызов кода. Первый методом POST и вы видите все echo, затем дублирующий без поста, перезаписывает файл.


Точно! При таком подходе в файле появляется 2 записи, одна с данными, вторая уже известная, пустая.
Спасибо, товарищ! Улыбка Осталось только отловить, где это происходит.
9. esterio - 13 Мая, 2015 - 14:25:57 - перейти к сообщению
Herr Direktor пишет:
fwrite ($fedit, "post:".$res.'post_h:'.$_REQUEST['z1'].'post_dump:'.var_dump($_POST).'len:'.strlen($_POST['z1']).'ver:'.phpversion());

var_dump
Цитата:
Эта функция не возвращает значения после выполнения.

Что записивать то собираетесь? Она только виводит на екран. А так как ничего не возвращаеться, то пустое место в строке (ибо NULL привести к стрингу будет ""). Так что никакой магии. Используйте либо

либо
PHP:
скопировать код в буфер обмена
  1. $post_dump = print_r($_POST, true);

либо
PHP:
скопировать код в буфер обмена
  1. $post_dump = var_export($_POST, true);
10. Herr Direktor - 13 Мая, 2015 - 14:40:34 - перейти к сообщению
Спасибо всем участникм, проблема решена. Как обычно она (проблема) была в кривых ручОнках (моих), неверно прописавших условие проверки POST в головном скрипте.
Особое спасибо камраду Мелкий за подсказку к решению проблемы, честно говоря не догадался использовать такое простое решение.

 

Powered by ExBB FM 1.0 RC1