|
|
Когда происходит отправка данных формы PHP-скрипту, информация из
этой формы автоматически становится доступной ему. Существует
много способов получения этой информации, например:
Пример 12-8. Простая HTML-форма <form action="foo.php" method="post">
Имя: <input type="text" name="username" /><br />
Email: <input type="text" name="email" /><br />
<input type="submit" name="submit" value="Отправь меня!" />
</form> |
|
В зависимости от вашей индивидуальной установки и личных настроек
существует много способов доступа к данным из ваших HTML-форм. Вот
несколько примеров:
Пример 12-9. Доступ к данным из простой HTML POST-формы <?php
// Доступно, начиная с PHP 4.1.0
echo $_POST['username'];
echo $_REQUEST['username'];
import_request_variables('p', 'p_');
echo $p_username;
// Доступно, начиная с PHP 3. Начиная с PHP 5.0.0, эти длинные предопределенные
// переменные могут быть отключены директивой register_long_arrays.
echo $HTTP_POST_VARS['username'];
// Доступно, если директива PHP register_globals = on. Начиная
// с PHP 4.2.0, значение по умолчанию register_globals = off.
// Использование/доверие этому методу непредпочтительно.
echo $username;
?> |
|
GET-форма используется аналогично, за исключением того, что вместо
POST вам нужно будет использовать соответствующую предопределенную
переменную GET. GET относится также к QUERY_STRING (информация в
URL после '?'). Так, например,
http://www.example.com/test.php?id=3 содержит
GET-данные, доступные как $_GET['id']. Смотрите
также $_REQUEST
и import_request_variables().
Как уже говорилось, до PHP 4.2.0 значением register_globals
по умолчанию было on (включено). А в PHP 3
оно всегда было включено. Сообщество PHP рекомендует всем не
полагаться на эту директиву, поскольку предпочтительно
присвоить ей значение off и писать программы
исходя из этого.
PHP также понимает массивы в контексте переменных формы
(смотрите соответствующие ЧАВО).
К примеру, вы можете сгруппировать связанные переменные вместе
или использовать эту возможность для получения значений списка
множественного выбора select. Например, давайте отправим форму
самой себе, а после отправки отобразим данные:
Пример 12-10. Более сложные переменные формы |
<?php
if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
echo '<pre>';
print_r($_POST);
echo '<a href="'. $_SERVER['PHP_SELF'] .'">Попробуйте еще раз</a>';
echo '</pre>';
} else {
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
Имя: <input type="text" name="personal[name]" /><br />
Email: <input type="text" name="personal[email]" /><br />
Пиво: <br />
<select multiple name="beer[]">
<option value="warthog">Warthog</option>
<option value="guinness">Guinness</option>
<option value="stuttgarter">Stuttgarter Schwabenbrдu</option>
</select><br />
<input type="hidden" name="action" value="submitted" />
<input type="submit" name="submit" value="Отправь меня!" />
</form>
<?php
}
?>
|
|
В PHP 3 использование массивов в переменных формы ограничено
одномерными массивами. В PHP 4 таких ограничений нет.
При отправке формы вместо стандартной кнопки можно использовать
изображение с помощью тега такого вида:
Когда пользователь щелкнет где-нибудь на изображении,
соответствующая форма будет передана на сервер с двумя
дополнительными переменными - sub_x и sub_y. Они содержат
координаты нажатия пользователя на изображение. Опытные
программисты могут заметить, что на самом деле имена переменных,
отправленных браузером, содержат точку, а не подчеркивание, но
PHP автоматически конвертирует точку в подчеркивание.
PHP явно поддерживает HTTP cookies как определено в спецификации Netscape. Cookies - это
механизм для хранения данных в удаленном браузере и отслеживания и
идентификации таким образом вернувшихся пользователей. Вы можете
установить cookies, используя функцию setcookie().
Cookies являются частью HTTP-заголовка, поэтому функция SetCookie
должна вызываться до того, как браузеру будет отправлен какой бы то
ни было вывод. Это ограничение аналогично ограничению функции
header(). Данные, хранящиеся в cookie, доступны
в соответствующих массивах данных cookie, таких как
$_COOKIE, $HTTP_COOKIE_VARS,
а также в $_REQUEST. Подробности и примеры
смотрите на странице setcookie() руководства.
Если вы хотите присвоить множество значений одной переменной cookie,
вы можете присвоить их как массив. Например:
Это создаст две разные cookie, хотя в вашем скрипте MyCookie будет
теперь одним массивом. Если вы хотите установить именно одну cookie
со множеством значений, примите во внимание сначала применение к
значениям таких функций, как serialize() или
explode().
Обратите внимание, что cookie заменит предыдущую cookie с тем же
именем в вашем браузере, если только путь или домен не отличаются.
Так, для приложения корзины покупок вы, возможно, захотите
сохранить счетчик. То есть:
Пример 12-11. A setcookie() example |
<?php
if (isset($_COOKIE['count'])) {
$count = $_COOKIE['count'] + 1;
} else {
$count = 1;
}
setcookie("count", $count, time()+3600);
setcookie("Cart[$count]", $item, time()+3600);
?>
|
|
Как правило, PHP не меняет передаваемых скрипту имен переменных.
Однако следует отметить, что точка не является корректным
символом в имени переменной PHP. Поэтому рассмотрим такую запись:
В данном случае интерпретатор видит переменную
$varname, после которой идет оператор
конкатенации, а затем голая строка (то есть, не заключенная в
кавычки строка, не соответствующая ни одному из ключевых или
зарезервированных слов) 'ext'. Очевидно, что это не даст
ожидаемого результата.
По этой причине важно заметить, что PHP будет автоматически
заменять любые точки в именах приходящих переменных на символы
подчеркивания.
Поскольку PHP определяет и конвертирует типы переменных (в
большинстве случаев) как надо, не всегда очевидно, какой тип
имеет данная переменная в конкретный момент времени. PHP
содержит несколько функций, позволяющих определить тип
переменной, таких как: gettype(),
is_array(), is_float(),
is_int(), is_object() и
is_string(). Смотрите также раздел
Типы.
add a note
User Contributed Notes
Переменные вне PHP
vierubino dot r3m0oFdisB1T at gmail dot com
24-Aug-2007 09:12
When you are using checkboxes to submit multiple choices, there is no need to use the complex method further down the page where you assign a unique name to each checkbox.
Instead, just name each checkbox as the same array, e.g.:
<input type="checkbox" name="items[]" value="foo" />
<input type="checkbox" name="items[]" value="bar" />
<input type="checkbox" name="items[]" value="baz" />
This way your $_POST["items"] variable will return as an array containing all and only the checkboxes that were clicked on.
t.montg AT gmail DOT com
26-Apr-2007 05:05
For anyone else having trouble figuring out how to access values in a SELECT element from a POST or GET form, you can't set the "id" attribute to the same thing as your "name" attribute. i.e. don't do this:
<?php
<select multiple="multiple" id="selectElem" name="selectElem[]">
<option value="ham">Ham</option>
<option value="cheese">Cheese</option>
<option value="hamcheese">Ham and Cheese</option>
</select>
?>
If you do the above, the variable $_POST['selectElem'] will not be set. Instead, either change the id or name attribute so that they are dissimilar. i.e. do this:
<?php
<select multiple="multiple" id="selectElemId" name="selectElem[]">
<option value="ham">Ham</option>
<option value="cheese">Cheese</option>
<option value="hamcheese">Ham and Cheese</option>
</select>
?>
Then you can access the value(s) of the SELECT element through the array $_POST['selectElem'][] or $_GET['selectElem'][]. It took me quite some time to figure out the problem.
Hyan Christian
25-May-2006 12:51
Just to complete Murat TASARSU's post in this page.
I hope this will help anyone who is going to add it with fsockopen
<html>
<body>
<form method="post" action="">
<input name="fruit" value="banana" /><br />
<input name="color" value="yellow" /><br />
<input type="submit" value="Click It">
</form>
<br />
<b>POST</b> :
<?php
$be_var = $_POST;
foreach ( $be_var as $key => $value ) {
$be_var = $be_var."&".$key."=".$value;
}
echo str_replace( "Array&", "", $be_var ); ?>
</body>
</html>
ch1902uk at hotmail dot com
18-Mar-2006 11:47
Regarding image input buttons, above where it says:
"When the user clicks somewhere on the image, the accompanying form will be transmitted to the server with two *additional* variables, sub_x and sub_y. These contain the coordinates of the user click within the image."
This is the case with Firefox (and probably other standards browsers), however my experience with Internet Explorer is that when image inputs are clicked, they only submit the location of the click on the button and *not* the name of the input.
So if you have a form to move/delete entries like this
entry[] [delete_0] [up_0] [down_0]
entry[] [delete_1] [up_1] [down_1]
entry[] [delete_2] [up_2] [down_2]
Then submitting the form in firefox will give you post variables such as
<?php
$_POST['delete_2']; $_POST['delete_2_x']; $_POST['delete_2_y']; ?>
In IE you only get
<?php
$_POST['delete_2_x']; $_POST['delete_2_y']; ?>
So if you are checking for what button was clicked do something like this
<?php
for ($i = 0; $i < count($_POST['entry']); $i++)
{
if (isset($_POST['delete_' . $i . '_x']))
{
}
}
?>
IMarvinTPA at bigfoot dot com
20-Nov-2005 09:52
I saw a note from
jan.gacioch at motorola dot com
posted on
19-Feb-2004 11:52
"Just a correction regarding 'cscotti@ifrance' contribution: code '$first = $item_value;' should be place just BEFORE the 'else if' condition and NOT AFTER."
This is not true, if the form has things posted in an unusual order, the $first value will be from a completely different variable.
Also, nobody mentioned this, but in the PHP.ini file there is an option called "always_populate_raw_post_data". It'll fill in that variable. It took me a while to find it.
I think it is bad to consider form name fields to be case sensitive, so my version uses all uppercase form values.
I also use a Request function to pull the data out of the global variables so I don't get warnings or errors when I try to access an undefined variable. I usually just want an empty string for them. (I have the same for Session and Server.)
UCase is shorter than strtoupper and I have a lot of converted ASP code and it was easier to create alias functions than to replace them.
<?
$_ATBREQUEST = multi_post_item();
function multi_post_item() {
$rawpost = Globals('HTTP_RAW_POST_DATA');
$array_output = array();
$raw_input_items = split("&", addbit3(Server("QUERY_STRING"), $rawpost, "&"));
foreach ($raw_input_items as $input_item) {
// split this item into name/value pair
//Print $input_item . BR;
if ($input_item != "") {
$item = split("=", $input_item);
// form item name
$item_name = ucase(urldecode($item[0]));
// form item value
if (empty($item[1]))
$item_value = "";
else
$item_value = urldecode($item[1]);
if ( !isset($array_output[$item_name]) ) {
$array_output[$item_name] = $item_value;
} elseif ( !is_array($array_output[$item_name]) ) {
$first = $array_output[$item_name];
$array_output[$item_name] = array();
$array_output[$item_name][]= $first;
$array_output[$item_name][]= $item_value;
} else {
$array_output[$item_name][]= $item_value;
}
}
}
return $array_output;
}
function Request2($param){
if (empty($_REQUEST[$param])) {
return "";
}
else
return $_REQUEST[$param];
}
function Request($param){
global $_ATBREQUEST;
$uparam = ucase($param);
if (empty($_ATBREQUEST[$uparam])) {
return Request2($param);
}
else{
if (is_array($_ATBREQUEST[$uparam])){
return implode(", ", $_ATBREQUEST[$uparam]);
}
else
return $_ATBREQUEST[$uparam];
}
}
//We want the array
function RequestArray($param){
global $_ATBREQUEST;
$uparam = ucase($param);
if (empty($_ATBREQUEST[$uparam])) {
return array(Request2($param));
}
else{
return $_ATBREQUEST[$uparam];
}
}
//AddBit 1 and 2 are commas and semicolons respectively.
function AddBit3($mystr, $mynew, $mysep) {
if ($mystr . "" == "")
$mystr = $mynew;
else
$mystr .= $mysep . $mynew;
return $mystr;
}
function Server($param){
if (empty($_SERVER[$param]))
return "";
else
return $_SERVER[$param];
}
function UCase($str){
return strtoupper($str);
}
?>
aescomputer AT yahoo DOT com
27-Oct-2005 11:01
Here are two usefull functions for forms:
<?php
if(!empty($_REQUEST)){
foreach($_REQUEST as $x => $y){
$_REQUEST[$x] = str_replace('<', '<', str_replace('>', '>', $y));
}
}
if(!empty($_REQUEST)){
foreach($_REQUEST as $x => $y){
$_REQUEST[$x] = str_replace("\n", '<br>', $y);
}
}
?>
mordae at mordae dot net
17-Jul-2005 05:47
Small note to previous post; $this can not be redeclared in PHP 5.
|