Среда, 24.04.2024
Reklamchik.at.ua
Меню сайта
Категории раздела
Мои статьи [0]
Ucoz [12]
Ucoz
Простий підручник php [7]
Простий підручник php
Мини-чат
500
Наш опрос
Оцените мой сайт
Всего ответов: 2
Статистика

Онлайн усяго: 1
Гостей: 1
Пользователей: 0
Главная » Статьи » Простий підручник php

HTML-форми (GET и POST)
Існує кілька способів отримання цієї інформації, наприклад:

Приклад #1 Проста 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>

З версії PHP 5.4.0, є тільки два способи отримати доступ до даних з HTML-форм. Доступні зараз способи наведено нижче:

Приклад #2 Доступ до даних з простий HTML POST-форми

echo $_POST['username'];
echo $_REQUEST['username'];
?>

В старих версіях PHP також існувало кілька інших способів. Вони наведені нижче. Дивіться також список змін внизу сторінки.

Приклад #3 Старі способи одержання даних

// УВАГУ: ці методи більше НЕ підтримуються.

// Використання import_request_variables() - ця функція видалена в PHP 5.4.0
import_request_variables('p', 'p_');
echo $p_username;

// Ці довгі зумовлені масиви видалені PHP 5.4.0
echo $HTTP_POST_VARS['username'];

// Використання register_globals. Ця функціональність видалена в PHP 5.4.0
echo $username;
?>

GET-форма використовується аналогічно, за винятком того, що замість POST, вам потрібно буде використовувати відповідну визначену змінну GET. GET відноситься також до QUERY_STRING (інформація в URL після '?'). Так, наприклад, http://www.example.com/test.php?id=3 містить GET-дані, доступні як $_GET['id']. Дивіться також $_REQUEST.

Зауваження:
Точки і прогалини в іменах змінних перетворюється в знаки підкреслення. Наприклад, <input name="a.b" / > $_REQUEST["a_b"].

PHP також розуміє масиви в контексті змінних форми (дивіться відповідні ЧАВО). Наприклад, ви можете згрупувати зв'язані змінні разом або використовувати цю можливість для отримання значень списку множинного вибору select. Наприклад, давайте відправимо форму самій собі, а після відправки відобразимо дані:

Приклад #4 Більш складні змінні форми

if ($_POST) {
    echo '
';
    echo htmlspecialchars(print_r($_POST, true));
    echo '';
}
?>
<form action="" 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="submit" value="Отправь меня!" />
</form>

Імена змінних кнопки-зображення 

При відправці форми замість стандартної кнопки можна використовувати зображення з допомогою тега такого виду:

<input type="image" src="image.gif" name="sub" />
Коли користувач клацне де-небудь на зображенні, відповідна форма буде передана на сервер з додатковими двома змінними - sub_x і sub_y. Вони містять координати натискання користувача на зображення. Досвідчені програмісти можуть помітити, що насправді імена змінних, відправлених браузером, містять точку, а не підкреслення, але PHP автоматично конвертує крапку у підкреслення.

PHP прозоро підтримує HTTP cookies як визначено у » RFC 6265. Cookies - це механізм для зберігання даних у віддаленому браузері і відстеження та ідентифікації таким чином повернулися користувачів. Ви можете встановити cookies, використовуючи функцію setcookie(). Cookies є частиною HTTP-заголовка, тому функція SetCookie повинна спричинятися до того, як браузеру буде відправлений якої б то ні було висновок. Це обмеження аналогічно обмеження функції header(). Дані, що зберігаються у cookie, доступні у відповідних масивах даних cookie, таких як $_COOKIE і $_REQUEST. Подробиці та приклади дивіться на сторінці setcookie() керівництва.

Якщо ви хочете привласнити безліч значень однієї змінної cookie, ви можете привласнити їх як масив. Наприклад:

setcookie("MyCookie[foo]", 'Testing 1', time()+3600);
setcookie("MyCookie[bar]", 'Testing 2', time()+3600);
?>
Це створить дві різні cookie, хоча у вашому скрипті MyCookie буде тепер одним масивом. Якщо ви хочете встановити саме одну cookie з безліччю значень, прийміть до уваги спочатку застосування до значень таких функцій, як serialize() або explode().

Зверніть увагу, що cookie замінить попередню cookie з тим же ім'ям у вашому браузері, якщо тільки шлях або домен не відрізняються. Так, для програми кошика для покупок ви, можливо, захочете зберегти лічильник. Тобто:

Приклад #5 Приклад використання cookie допомогою setcookie()

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; /* невірне ім'я змінної */
?>
В даному випадку інтерпретатор бачить змінну $varname, після якої йде оператор конкатенації, а потім гола рядок (тобто, не в лапках рядок, не відповідає жодному з ключових чи зарезервованих слів) 'ext'. Очевидно, що це не дасть очікуваного результату.
З цієї причини важливо зауважити, що PHP буде автоматично замінювати будь-які точки в іменах приходять змінних на символи підкреслення.

Оскільки PHP визначає і конвертує типи змінних (у більшості випадків) як треба, не завжди очевидно, який тип має дана змінна в конкретний момент часу. PHP містить кілька функцій, що дозволяють визначити тип змінної, таких як: gettype(), is_array(), is_float(), is_int(), is_object() і is_string(). Дивіться також розділ Типи.

Цей пост стосовно обробки форм, які мають більш ніж одну кнопку "Відправити". 

Припустимо, у нас є HTML-форма з кнопкою відправки зазначено такий: 

<input type="submit" value="Delete" name="action_button"> 

Зазвичай 'значення атрибуту' тега HTML-код 'enter' (у даному випадку "видалити"), який створює кнопку "Відправити" можна отримати в PHP після посту такий: 

$_POST['action_button']; 
?> 

Ми, звичайно, використовувати "ім'я" кнопки в якості індексу масиву $_post. 
Це працює прекрасно, за винятком, коли ми хочемо передати більше інформації з натисканням цієї кнопки. 

Уявіть собі ситуацію, коли ви спілкуєтеся з керівництвом користувача в деяких адміністративного інтерфейсу. Вам буде представлений список імен користувачів запитуються з бази даних хочете додати кнопку "Видалити" і "змінити" поряд з кожним з імен в списку. Природно, "вартість" нашої кнопки в HTML-форму, яку ми хочемо відобразити буде "видалити" і "змінити", так це те, що ми хочемо виступити на лицеві панелі кнопок. 
Обидві кнопки (зміна та видалення) буде називатися "action_button", так це те, що ми хочемо, щоб індекс масиву $_post с. Іншими словами, "ім'я" кнопки разом не несуть ніякої унікальної ідентифікації інформації, якщо ми хочемо, щоб процес їх систематично після відправки. З допомогою цих кнопок буде існувати для кожного користувача в списку, нам потрібні деякі додаткові шляхи, щоб відрізнити їх, так що ми знаємо, що один користувач з кнопок була натиснута. 

Використання масивів є способом піти. Припускаючи, що ми знаємо унікальний числовий ідентифікатор кожного користувача, такі як первинний ключ з бази даних, і ми не бажаємо, щоб захистити номер від громадськості, ми можемо зробити 'action_button' в масив і використовувати користувача унікальний числовий ідентифікатор в якості ключа в масиві. 

Наш HTML-код для відображення кнопки стануть: 

<input type="submit" value="Delete" name="action_button[0000000002]"> 
<input type="submit" value="Modify" name="action_button[0000000002]"> 

У 0000000002-це, звичайно, унікальний числовий ідентифікатор для даного конкретного користувача. 

Потім, коли ми впораємося з цим форма на PHP, нам потрібно зробити наступні дії для вилучення і "значення" кнопки"видалити" або "змінити") і унікальний числовий ідентифікатор користувача, ми хочемо вплинути (0000000002 в даному випадку). Наступний буде друкувати або "змінити" або "видалити", а також унікальний номер користувача: 

$submitted_array = array_keys($_POST['action_button']); 
echo ($_POST['action_button'][$submitted_array[0]] . " " . $submitted_array[0]); 
?> 

$submitted_array[0] несе 0000000002. 
Коли ми індексуємо, що у $_post, де['action_button'], як ми робили вище, ми зможемо отримати рядок, яка була використана в якості "значення" в тегу HTML код 'введіть', яка створила цю кнопку. 

Якщо ми хочемо захистити унікальний числовий ідентифікатор, ми повинні використовувати деякі інші унікально ідентифікує атрибут кожного користувача. Можливо, цей атрибут повинен бути зашифрований при виведенні в форму для більшої безпеки. 

Насолоджуйтесь!

Повний список полів-ім'я персонажа, що PHP перетворює _ (підкреслення) полягає в наступному (не просто точка):

chr(32) ( ) (космос)
chr(46) (.) (крапка)
chr(91) ([) (відкрита квадратна дужка)
chr(128) - chr(159) (різне)
РНР необоротно змінює імена полів, що містять ці символи в спробі збереження сумісності з застарілим значенням register_globals характеристика.

З HTML 5.1 проекту:
http://www.w3.org/html/wg/drafts/html/master/forms.html#naming-form-controls:-the-name-attribute

Ім'я атрибута content містить ім'я елемента керування форми, що використовується у поданні форми та елементи у формі елемента об'єкта. Якщо вказаний атрибут, його значення не повинно бути порожнім рядком.
Будь-яке непорожнє значення ім'я дозволено.

Так що використовуйте Формат <select multiple name="beer[]">ще в стандарт HTML 5.

Наскільки я розумію, починаючи з версії PHP 4.3 можна отримати доступ до змісту запиту Post (чи інших методів) в якості вхідного потоку назва: PHP://введення, наприклад:

readfile("php://input");   
[to display it]

or

$fp = fopen("php://input", "r");    

[відкрити його, а потім роби, що хочеш]

Це дуже корисно, щоб відкрити вміст Post-запитів, які насправді є зміст (а не просто змінна-значення пари, які з'являються в $_post).

Це замінник старої змінної $HTTP_RAW_POST_DATA в деяких попередніх 4.x версій. Він доступний для завантаження інших методів відрізняється від пост теж, але вона не доступна для сполучення з multipart/дані форми типу Контенту, оскільки обробник відправки файлу вже подбав Контент, в такому випадку.

При роботі з декількома виберіть коробки name=some_name[] так що PHP буде розуміти, що це потрібно інтерпретувати як масив, не як одне значення. Якщо ви хочете отримати доступ до this в JavaScript, ви повинні привласнити атрибут ID в списку Select, а також атрибут name. Потім продовжити використовувати атрибут ID JavaScript для посилання на прапорець і назва атрибута для посилання на виберіть поле в PHP.
Приклад

<select multiple id="select_id" name="select_name[]">
....

</select>

    echo $select_name[0];
?>

<script language="javascript">
  document.forms[0].select_id.options[0].selected = true;
</script>

Попередження! заміна пробілів і точок не виникає в ключі масиву.

<input name="a. b[x. y]" value="foo" />

var_dump($_POST);
gives
array(1) {
  ["a__b"]=>
  array(1) {
    ["x. y"]=>
    string(3) "foo"
  }
}

Ось проста функція, щоб дати вам безвирусная версія $_post, де:

// Function to fix up PHP's messing up POST input containing dots, etc.
function getRealPOST() {
    $pairs = explode("&", file_get_contents("php://input"));
    $vars = array();
    foreach ($pairs as $pair) {
        $nv = explode("=", $pair);
        $name = urldecode($nv[0]);
        $value = urldecode($nv[1]);
        $vars[$name] = $value;
    }
    return $vars;
}
?>

Для обробки форм з або без [] ви можете зробити щось на зразок цього: 

    function repairPost($data) { 
        // combine rawpost and $_POST ($data) to rebuild broken arrays in $_POST 
        $rawpost = "&".file_get_contents("php://input"); 
        while(list($key,$value)= each($data)) { 
            $pos = preg_match_all("/&".$key."=([^&]*)/i",$rawpost, $regs, PREG_PATTERN_ORDER);        
            if((!is_array($value)) && ($pos > 1)) { 
                $qform[$key] = array(); 
                for($i = 0; $i < $pos; $i++) { 
                    $qform[$key][$i] = urldecode($regs[1][$i]); 
                } 
            } else { 
                $qform[$key] = $value; 
            } 
        } 
        return $qform; 
    } 

    // --- MAIN 

    $_POST = repairPost($_POST); 
?> 

Функція буде перевіряти кожне поле в $_post, де з вихідних даних і перебудовувати масиви, які заблукали.

Коли ви використовуєте прапорці подати кілька варіантів, немає необхідності в подальшому використовувати комплексний метод вниз сторінки, де можна присвоїти унікальне ім'я для кожного прапорця.

Замість цього, просто ім'я кожного прапорця, як один і той же масив, наприклад:

<input type="checkbox" name="items[]" value="foo" />
<input type="checkbox" name="items[]" value="bar" />
<input type="checkbox" name="items[]" value="baz" />

Таким чином, ваші $_POST["items"] змінної буде повертати масив, що містить всі і тільки прапорці, які натиснули.

Для когось виникли проблеми, з'ясовуючи, як отримати доступ до даних у вибраному елементі з POST або GET form Ви не можете встановити атрибут "ID", щоб те ж саме,"name" attribute.

тобто не роби цього:

  //Not so good
 
?>

Якщо робити вище, то змінна $_post, де['selectElem'] не буде встановлено. Замість цього, як змінити ідентифікатор і атрибут name, так що вони відрізняються один від одного. тобто зробити це:

  //So good (notice the new "id" value)
 
?>
Потім ви можете отримати доступ до значення(и) виберіть елемент через масив $_post['selectElem'][] або $_get['selectElem'][]. Мені потрібно якийсь час, щоб з'ясувати проблему.

Рішення в PHP, щоб перетворити рядок запиту, як:

а=2 і A=3 A=4 

в одну змінну A=4 просто strupid! 

"Чудесним" хак, що дозволяє вибір декількох значень тільки для читання при використанні:

а[]=2[]=3&А[]=4

це - на перший погляд хороша особливість, але незабаром стають болі в..!

В asp і aspx перша ситуація обробляється як:

а=2,3,4

що краще, ніж на PHP поведінку, але все одно погано (що робити, якщо ваші значення змінних містять коми?).

Мені здається, що правильним поведінкою буде:

а=2 і A=3 A=4

автоматично створює масив всіх змінних усередині. Я знаю, що це вимагатиме відповідного звернення помилку, але evevy все одно робить!

Щоб отримати кілька обраних  <select> перераховані в тезі, переконайтеся в тому, що "ім'я атрибута" доданий у фігурні дужки, ось так:

<select multiple="multiple" name="users[]">
     <option value="foo">Foo</option>
     <option value="bar">Bar</option>
</select>

При передачі на PHP-файл (припустимо, що у вас є повна форма) він буде повертати масив рядків. В іншому випадку він просто поверне останній елемент <Select> тег, який ви обрали.


Источник: http://php.net/manual/ru/language.variables.external.php
Категория: Простий підручник php | Добавил: medergrup (19.02.2017)
Просмотров: 358 | Теги: HTML-форми (GET и POST) | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт

Поиск
Блог
[27.02.2017]
Глава 14 (0)
[27.02.2017]
Глава 12 (0)
[25.06.2017]
Авторское право на REKLAMCHIK (0)
[27.02.2017]
Глава 5 (0)
[26.06.2017]
Добавления пресс релиз (0)
Новости
[24.02.2017]
Центр Сертификации Совета Безопасности (0)
[24.02.2017]
Черная дыра (сетей) (0)
[23.02.2017]
ГРИИБ (0)
[24.02.2017]
Безопасного ввода и обработки документов (0)
[24.02.2017]
DNS-спуфинг (0)
Форум
  • Batman: Arkham City Lockdown (0)
  • Рекомендации комментаторам. (0)
  • Нарушения и наказания: ответы на вопросы. (0)
  • Hotline Miami (2012) (0)
  • HITMAN (2015) (0)
  • Reklamchik.at.ua © 2024