<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.variables.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'language.variables.external.php',
    1 => 'Переменные из внешних источников',
    2 => 'Переменные из внешних источников',
  ),
  'up' => 
  array (
    0 => 'language.variables.php',
    1 => 'Переменные',
  ),
  'prev' => 
  array (
    0 => 'language.variables.variable.php',
    1 => 'Переменные переменных',
  ),
  'next' => 
  array (
    0 => 'language.constants.php',
    1 => 'Константы',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'language/variables.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.variables.external" class="sect1">
  <h2 class="title">Переменные из внешних источников</h2>

  <div class="sect2" id="language.variables.external.form">
   <h3 class="title">HTML-формы. Методы GET и POST</h3>

   <p class="simpara">
    PHP-скрипт автоматически получает доступ к данным формы
    после отправки формы скрипту.
    Данные формы получают несколькими способами, например:
   </p>

   <p class="para">
    <div class="example" id="example-1">
     <p><strong>Пример #1 Простая HTML-форма</strong></p>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form action=&quot;foo.php&quot; method=&quot;post&quot;&gt;
    Имя:  &lt;input type=&quot;text&quot; name=&quot;username&quot; /&gt;&lt;br /&gt;
    Email: &lt;input type=&quot;text&quot; name=&quot;email&quot; /&gt;&lt;br /&gt;
    &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Отправь меня!&quot; /&gt;
&lt;/form&gt;</pre>
</div>
     </div>

    </div>
   </p>

   <p class="para">
    Доступ к данным HTML-формы получают только двумя способами.
    Следующие параграфы перечисляют эти способы:
   </p>

   <p class="para">
    <div class="example" id="example-2">
     <p><strong>Пример #2 
      Доступ к данным несложной HTML-формы, которую отправили методом POST
     </strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br />echo </span><span style="color: #0000BB">$_REQUEST</span><span style="color: #007700">[</span><span style="color: #DD0000">'username'</span><span style="color: #007700">];<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>

   <p class="para">
    GET-формы обрабатывают аналогично, за исключением того, что вместо
    суперглобальной переменной POST обрабатывают предопределённую
    суперглобальную переменную GET.
    Суперглобальная переменная GET также умеет работать с элементом
    <code class="literal">QUERY_STRING</code>
    (информация в URL-адресе после знака вопроса «?»). Так, например,
    адрес <code class="literal">http://www.example.com/test.php?id=3</code> содержит
    GET-данные, к которым получают доступ через <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['id']</a></var>.
    О переменных HTTP-запроса рассказывает раздел <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var>.
   </p>

   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <p class="para">
     Точки и пробелы в именах переменных преобразовываются в знаки
     подчёркивания. Например, <code class="literal">&lt;input name=&quot;a.b&quot; /&gt;</code> станет
     <code class="literal">$_REQUEST[&quot;a_b&quot;]</code>.
    </p>
   </p></blockquote>

   <p class="simpara">
    PHP также понимает массивы в контексте переменных формы
    (смотрите раздел <a href="faq.html.php" class="link">PHP и HTML</a>).
    Связанные переменные, например, группируют по имени
    или получают значения из полей ввода с множественным выбором.
    Отправим форму сами себе и отобразим данные:
   </p>

   <p class="para">
    <div class="example" id="example-3">
     <p><strong>Пример #3 Более сложные переменные формы</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">'&lt;pre&gt;'</span><span style="color: #007700">;<br />    echo </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">));<br />    echo </span><span style="color: #DD0000">'&lt;/pre&gt;'</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;<br /></span>&lt;form action="" method="post"&gt;<br />    Имя:  &lt;input type="text" name="personal[name]" /&gt;&lt;br /&gt;<br />    Email: &lt;input type="text" name="personal[email]" /&gt;&lt;br /&gt;<br />    Пиво: &lt;br /&gt;<br />    &lt;select multiple name="beer[]"&gt;<br />        &lt;option value="warthog"&gt;Warthog&lt;/option&gt;<br />        &lt;option value="guinness"&gt;Guinness&lt;/option&gt;<br />        &lt;option value="stuttgarter"&gt;Stuttgarter Schwabenbräu&lt;/option&gt;<br />    &lt;/select&gt;&lt;br /&gt;<br />    &lt;input type="submit" value="Отправь меня!" /&gt;<br />&lt;/form&gt;</span></code></div>
     </div>

    </div>
   </p>

   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <span class="simpara">
     PHP без предупреждения проигнорирует конечные символы,
     если имя внешней переменной начинается с корректного синтаксиса массива.
     Например, <code class="literal">&lt;input name=&quot;foo[bar]baz&quot;&gt;</code>
     станет <code class="literal">$_REQUEST[&#039;foo&#039;][&#039;bar&#039;]</code>.
    </span>
   </p></blockquote>

   <div class="sect3" id="language.variables.external.form.submit">
    <h4 class="title">
     Имена переменных кнопки с картинкой для отправки формы
    </h4>

    <p class="simpara">
     Чтобы у формы вместо стандартной кнопки отправки
     появилось изображение, формируют тег наподобие такого:
    </p>

    <div class="informalexample">
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input type=&quot;image&quot; src=&quot;image.gif&quot; name=&quot;sub&quot; /&gt;</pre>
</div>
     </div>

    </div>

    <p class="simpara">
     Когда пользователь щёлкнет по изображению,
     браузер передаст форму на сервер с двумя
     дополнительными переменными — <var class="varname">sub_x</var> и <var class="varname">sub_y</var>.
     Эти переменные содержат координаты места, по которому пользователь нажал на изображении.
     Программисты с опытом, наверное, заметили, что имена переменных,
     которые отправил браузер, содержат точку, а не подчёркивание,
     но PHP автоматически преобразует точку в подчёркивание.
    </p>
   </div>

  </div>

  <div class="sect2" id="language.variables.external.cookies">
   <h3 class="title">HTTP Cookies</h3>

   <p class="simpara">
    PHP прозрачно поддерживает блоки данных cookies по HTTP-протоколу в соответствии с требованиями стандарта
    <a href="https://datatracker.ietf.org/doc/html/rfc6265" class="link external">&raquo;&nbsp;RFC 6265</a>. Cookies —
    механизм хранения данных в удалённом браузере, по которым сервер отслеживает
    или идентифицирует пользователей, которые вернулись на сайт.
    Cookies устанавливают функцией <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>.
    Cookies — часть HTTP-заголовка, поэтому функцию SetCookie
    требуется вызывать перед отправкой вывода браузеру.
    Это же ограничение касается функции <span class="function"><a href="function.header.php" class="function">header()</a></span>.
    Данные, которые хранят cookie, доступны
    в массивах данных cookie наподобие суперглобальных переменных <var class="varname"><a href="reserved.variables.cookies.php" class="classname">$_COOKIE</a></var>
    или <var class="varname"><a href="reserved.variables.request.php" class="classname">$_REQUEST</a></var>. Подробности и примеры
    даёт описание функции <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>.
   </p>

   <blockquote class="note"><p><strong class="note">Замечание</strong>: 
    <span class="simpara">
     Начиная с PHP 7.2.34, 7.3.23 и 7.4.11 по соображениям безопасности
     <em>имена</em> входящих cookie больше не декодируются
     из URL-кодированной строки.
    </span>
   </p></blockquote>

   <p class="simpara">
    Когда одной переменной cookie требуется присвоить больше одного значения,
    значения присваивают как массив. Например:
   </p>

   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MyCookie[foo]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Testing 1'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">() + </span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"MyCookie[bar]"</span><span style="color: #007700">, </span><span style="color: #DD0000">'Testing 2'</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">() + </span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

   <p class="simpara">
    Такой вызов создаст два разных блока данных cookie, хотя в скрипте
    переменная <var class="varname">MyCookie</var> теперь будет одним массивом.
    Если требуется установить только один блок данных cookie
    с несколькими значениями, сначала обдумывают
    вызов для таких значений функции наподобие <span class="function"><a href="function.serialize.php" class="function">serialize()</a></span>
    или <span class="function"><a href="function.explode.php" class="function">explode()</a></span>.
   </p>

   <p class="simpara">
    Обратите внимание, что блок данных cookie заменит в браузере предыдущий
    блок данных cookie с тем же именем, если только путь или домен не отличаются.
    Так в приложении с корзиной покупок можно сохранить количество товаров:
   </p>

   <div class="example" id="example-4">
    <p><strong>Пример #4 Пример использования функции <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span></strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">if (isset(</span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">$_COOKIE</span><span style="color: #007700">[</span><span style="color: #DD0000">'count'</span><span style="color: #007700">] + </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #0000BB">$count </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /><br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">'count'</span><span style="color: #007700">, </span><span style="color: #0000BB">$count</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">() + </span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">setcookie</span><span style="color: #007700">(</span><span style="color: #DD0000">"Cart[</span><span style="color: #0000BB">$count</span><span style="color: #DD0000">]"</span><span style="color: #007700">, </span><span style="color: #0000BB">$item</span><span style="color: #007700">, </span><span style="color: #0000BB">time</span><span style="color: #007700">() + </span><span style="color: #0000BB">3600</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>

  </div>

  <div class="sect2" id="language.variables.external.dot-in-names">
   <h3 class="title">Точки в именах входящих переменных</h3>

   <p class="para">
    PHP, как правило, не изменяет имена переменных, которые передали скрипту.
    Однако следует отметить, что точка — неправильный символ
    в имени переменной PHP. Поэтому рассмотрим такую запись:
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$varname</span><span style="color: #007700">.</span><span style="color: #0000BB">ext</span><span style="color: #007700">;  </span><span style="color: #FF8000">/* Неправильное имя переменной */<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    В приведённом примере интерпретатор видит переменную
    <var class="varname">$varname</var>, после которой идёт оператор
    конкатенации, а затем голая строка (то есть строка, которую не заключили
    в кавычки, и которая не соответствует ни одному из ключевых или
    зарезервированных слов) «ext». Очевидно, что это не даст ожидаемого результата.
   </p>

   <p class="para">
    Поэтому важно отметить, что PHP будет автоматически
    заменять точки в именах входящих переменных на символы
    подчёркивания.
   </p>

  </div>

  <div class="sect2" id="language.variables.determining-type-of">
   <h3 class="title">Определение типов переменных</h3>

   <p class="para">
    Поскольку PHP определяет типы переменных и преобразовывает типы (как правило)
    по мере необходимости, не всегда очевидно, какому типу принадлежит переменная
    в каждый момент времени. PHP содержит несколько функций, которые умеют
    определять тип переменной, например: <span class="function"><a href="function.gettype.php" class="function">gettype()</a></span>,
    <span class="function"><a href="function.is-array.php" class="function">is_array()</a></span>, <span class="function"><a href="function.is-float.php" class="function">is_float()</a></span>,
    <span class="function"><a href="function.is-int.php" class="function">is_int()</a></span>, <span class="function"><a href="function.is-object.php" class="function">is_object()</a></span>
    и <span class="function"><a href="function.is-string.php" class="function">is_string()</a></span>. Подробнее о типах данных, которые
    поддерживает PHP, рассказывает раздел
    «<a href="language.types.php" class="link">Типы</a>».
   </p>
   <p class="para">
    HTTP — текстовый протокол, и большая, если не вся, часть содержимого,
    которое попадает в <a href="language.variables.superglobals.php" class="link">суперглобальные массивы</a>
    наподобие <var class="varname"><a href="reserved.variables.post.php" class="classname">$_POST</a></var> и <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET</a></var>, останется в виде строк.
    PHP не будет преобразовывать значения в конкретный тип.
    В приведённом примере элемент <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var1"]</a></var>
    будет содержать строку «null», а элемент <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET["var2"]</a></var> — строку «123».
    <div class="example-contents">
<div class="cdata"><pre>
/index.php?var1=null&amp;var2=123
</pre></div>
    </div>

   </p>
  </div>

  <div class="sect2" id="language.variables.external.changelog">
   <h3 class="title">Список изменений</h3>

   <p class="para">
    <table class="doctable informaltable">
     
      <thead>
       <tr>
        <th>Версия</th>
        <th>Описание</th>
       </tr>

      </thead>

      <tbody class="tbody">
       <tr>
        <td>7.2.34, 7.3.23, 7.4.11</td>
        <td>
         По соображениям безопасности <em>имена</em>
         входящих cookie больше не декодируются из URL-кодированной строки.
        </td>
       </tr>

      </tbody>
     
    </table>

   </p>
  </div>

 </div><?php manual_footer($setup); ?>