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 :: Версия для печати :: select-option-multiple vs $_POST
Форумы портала PHP.SU » PHP » Программирование на PHP » select-option-multiple vs $_POST

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

1. kv4 - 12 Октября, 2010 - 12:58:20 - перейти к сообщению
Есть такая разметка
CODE (html):
скопировать код в буфер обмена
  1. <html>
  2.     <head>
  3.     </head>
  4.     <body>
  5.     <form method='post' action='test.php'>
  6.         <select size='10' multiple='' name='param'>
  7.         <option value='1'>1</option>
  8.         <option value='2'>2</option>
  9.         <option value='3'>3</option>
  10.         </select>
  11.         <input type='submit' value='send post'>
  12.     </form>
  13.     </body>
  14. </html>


Выбираю несколько значенийв селекте
Нажимаю send post - отправляется вот такой post запрос: param=1&param=2&param=3

как получить доступ ко всем элементам запроса?

В $_POST есть только param=last_value, т.е. в данном случае param=3

а где все остальные? как их получить?
2. garvey - 12 Октября, 2010 - 13:06:42 - перейти к сообщению
HTML:
CODE (html):
скопировать код в буфер обмена
  1. <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
  2. <select name="test[]" multiple="multiple">
  3.         <option value="one">one</option>
  4.         <option value="two">two</option>
  5.         <option value="three">three</option>
  6.         <option value="four">four</option>
  7.         <option value="five">five</option>
  8. </select>
  9. <input type="submit" value="Send" />
  10. </form>

PHP:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         $test=$_POST['test'];
  3.         if ($test){
  4.          foreach ($test as $t){echo 'You selected ',$t,'<br />';}
  5.         }
  6. ?>
3. kv4 - 12 Октября, 2010 - 13:15:19 - перейти к сообщению
Но этот код
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $test = $_POST['param'];
  3. foreach ($test as $t){
  4.     echo 'You selected '.$t.'<br />';
  5. }
  6. ?>


даёт вот такоую ошибку
Warning: Invalid argument supplied for foreach() in "foreach ($test as $t){"
(Добавление)
Ответ нашёл - нужно воттак именовать таг select:
CODE (html):
скопировать код в буфер обмена
  1.  
  2. <select size='10' multiple='' name='param[]'>
  3.  


[] - квадратные скобки рулят Радость
4. garvey - 12 Октября, 2010 - 13:25:59 - перейти к сообщению
Смотри внимательно мой код. Там тоже скобки стоят.
5. kv4 - 12 Октября, 2010 - 13:27:55 - перейти к сообщению
garvey пишет:
Смотри внимательно мой код. Там тоже скобки стоят.


О действительно! Не внимательно просмотрелУлыбка
Спасибо!
(Добавление)
А можно ли получить доступ к строке запроса, до того как она будет помещена в $_POST ?
6. garvey - 12 Октября, 2010 - 15:13:42 - перейти к сообщению
На стороне клиента можно получить выбранные опции select при помощи javascript.
7. kv4 - 12 Октября, 2010 - 18:39:41 - перейти к сообщению
garvey пишет:
На стороне клиента можно получить выбранные опции select при помощи javascript.


На стороне клиента не интересует (хотя и такой вариант можно рассмотреть, но он крив ИМХО). А вот на стороне сервера было бы замечательно получить что-то вроде param=1&param=2 и т.д.

Где в php можно получить строку запроса в сыром виде, до того как она будет помещена в массив $_POST?
8. Uchkuma - 12 Октября, 2010 - 18:45:56 - перейти к сообщению
$_SERVER['QUERY_STRING']
9. kv4 - 12 Октября, 2010 - 19:33:44 - перейти к сообщению
Uchkuma пишет:
$_SERVER['QUERY_STRING']

Эта строка содержит параметры GET запроса

Меня интересует POST
10. Инклуд - 12 Октября, 2010 - 19:41:32 - перейти к сообщению
Не уверен, что такая возможность существует Радость
11. kv4 - 12 Октября, 2010 - 19:50:48 - перейти к сообщению
Инклуд пишет:
Не уверен, что такая возможность существует Радость


О нет Не понял Неужели это действительно так, и не существует способа получить доступ к тому, что приходит на сервер...
(Добавление)
Нашёл вот что:
-------------------------------- ----------
Чтобы получить полное содержимое POST-запроса, нужно прочитать содержимое входного потока PHP:

$post_raw_data = @file_get_contents( "php://input" );


Этот способ не подходит для чтения данных, отправленных формой с установленным атрибутом <form enctype="multipart/form-data" ...

Цитата из мануала (http://us.php.net/manual/en/wrappers.php.php):

php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype="multipart/form-data".
-------------------------------- ----------

Всем спасибо за участие Хорошо
12. Инклуд - 12 Октября, 2010 - 20:03:47 - перейти к сообщению
kv4, Вам спасибо за новые знания ;)
13. movEAX - 12 Октября, 2010 - 20:40:51 - перейти к сообщению
kv4 пишет:
$post_raw_data = @file_get_contents( "php://input" );

Зачем так извращенствовать?)
PHP:
скопировать код в буфер обмена
  1. <form action="/test.php" method="post">
  2.     <select multiple="multiple" name="multi[]" size="4">
  3.         <option value="1"> 1 </option>
  4.         <option value="2"> 2 </option>
  5.         <option value="3"> 3 </option>
  6.         <option value="4"> 4 </option>
  7.     </select>
  8.     <input type="submit"/>
  9. </form>
  10. <?PHP
  11. print_r($_POST["multi"]);
14. Инклуд - 12 Октября, 2010 - 21:15:33 - перейти к сообщению
kv4 пишет:
Где в php можно получить строку запроса в сыром виде, до того как она будет помещена в массив $_POST?

Вот это имелось ввиду.
15. kv4 - 13 Октября, 2010 - 06:11:36 - перейти к сообщению
movEAX пишет:
Цитата:
Зачем так извращенствовать?)
Затем, что изменение имени в данном случае (с которым я столкнулся), ведёт к большому числу изменений в существующем коде. Тогда, как
Цитата:
$post_raw_data = @file_get_contents( "php://input" );
позволяет сделать всё необходимое исправив всего 4 строки кода.

Я вовсе не призываю использовать такой способ повсеместно, и если бы писал код с чистого листа, или изменения не зарагивали бы большей части существующего кода, видимо предпочёл бы name=param[] - хотя и это мне кажется извращением ИМХО.

Почему PHP сразу не помещает параметры с одним именем в массив?

 

Powered by ExBB FM 1.0 RC1