<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP и HTML',
    2 => 'PHP и HTML-разметка',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'ЧАВО',
  ),
  'prev' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'Хеширование паролей',
  ),
  'next' => 
  array (
    0 => 'faq.com.php',
    1 => 'PHP и COM',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'faq/html.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.html" class="chapter">
  <h1 class="title">PHP и HTML-разметка</h1>

  

  <p class="para">
   Язык программирования PHP и язык гипертекстовой разметки HTML тесно взаимодействуют:
   PHP умеет генерировать HTML, а HTML умеет передавать информацию PHP. Перед чтением вопросов в этом разделе
   важно понимать, как получать <a href="language.variables.external.php" class="link">
   переменные из внешних источников</a>. Страницы руководства по этой теме
   содержат много примеров.
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.html.encoding">
     
      Какое кодирование или декодирование я должен выполнять при передаче значения
      через форму или URL-адрес?
     
    </a></li><li><a href="#faq.html.form-image">
     
      Я пытаюсь использовать &lt;input type=&quot;image&quot;&gt;, но переменные
      $foo.x и $foo.y
      недоступны. Значение $_GET[&#039;foo.x&#039;] тоже не существует.
      Где они?
     
    </a></li><li><a href="#faq.html.arrays">
     Как создать массивы в HTML &lt;form&gt;?
    </a></li><li><a href="#faq.html.select-multiple">
     
      Как получить все результаты из HTML-тега select с атрибутом multiple?
     
    </a></li><li><a href="#faq.html.javascript-variable">
     
      Как передать переменную из JavaScript в PHP?
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.html.encoding">
    <dt><strong>
     
      Какое кодирование или декодирование я должен выполнять при передаче значения
      через форму или URL-адрес?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Есть несколько этапов, на которых кодировка важна. Предположим, что у вас
      есть переменная <var class="varname">$data</var> с типом <span class="type"><a href="language.types.string.php" class="type string">string</a></span>, которая содержит
      строку, которую вы хотите передать без кодирования. Вот эти этапы:
      <ul class="itemizedlist">
       <li class="listitem">
        <p class="para">
         Интерпретация HTML. Чтобы задать произвольную строку,
         вы <em>должны</em> заключить её в двойные кавычки и
         использовать функцию <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span> для кодирования.
        </p>
       </li>
       <li class="listitem">
        <p class="para">
         URL: URL-адрес состоит из нескольких частей. Если вы хотите, чтобы
         данные были восприняты как один элемент, <em>нужно</em>
         закодировать их функцией <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span>.
        </p>
       </li>
      </ul>
     </p>
     <p class="para">
      <div class="example" id="example-1">
       <p><strong>Пример #1 Скрытый элемент HTML-формы</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: #DD0000">'&lt;input type="hidden" value="' </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">) . </span><span style="color: #DD0000">'" /&gt;'</span><span style="color: #007700">.</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

      </div>
      <blockquote class="note"><p><strong class="note">Замечание</strong>: 
       <span class="simpara">
        Кодировать перменную <var class="varname">$data</var> функцией
        <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span> неправильно, поскольку кодировать данные
        <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span> это обязанность браузера. Популярные
        браузеры делают это правильно.
        Заметьте, что это произойдёт независимо от метода (например,
        GET или POST). Это заметно только в случае GET-запроса,
        поскольку POST-запросы обычно скрыты.
       </span>
      </p></blockquote>
      <div class="example" id="example-2">
       <p><strong>Пример #2 Данные, которые редактирует пользователь</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: #DD0000">"&lt;textarea name='mydata'&gt;\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">) . </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"&lt;/textarea&gt;"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

      </div>
      <blockquote class="note"><p><strong class="note">Замечание</strong>: 
       <span class="simpara">
        Браузер показывает данные как предполагалось, потому что браузер
        интерпретирует экранированные HTML-символы.
       </span>
       <span class="simpara">
        При отправке через GET- или POST-метод браузер закодирует (urlencoded)
        данные для передачи, а PHP декодирует (urldecoded). Поэтому
        не нужно выполнять какое-либо кодирование или декодирование,
        всё обрабатываются автоматически.
       </span>
      </p></blockquote>
      <div class="example" id="example-3">
       <p><strong>Пример #3 В URL</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: #DD0000">'&lt;a href="' </span><span style="color: #007700">. </span><span style="color: #0000BB">htmlspecialchars</span><span style="color: #007700">(</span><span style="color: #DD0000">"/nextpage.php?stage=23&amp;data=" </span><span style="color: #007700">.<br />    </span><span style="color: #0000BB">urlencode</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">)) . </span><span style="color: #DD0000">'"&gt;' </span><span style="color: #007700">. </span><span style="color: #DD0000">"\n"<br /></span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

      </div>
      <blockquote class="note"><p><strong class="note">Замечание</strong>: 
       <span class="simpara">
        На самом деле вы подделываете HTML-запрос GET, поэтому необходимо
        вручную закодировать (<span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span>) данные.
       </span>
      </p></blockquote>
      <blockquote class="note"><p><strong class="note">Замечание</strong>: 
       <span class="simpara">
        Вам надо применить функцию <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>
        к полному URL-адресу, потому что URL-адрес появляется как значение HTML-атрибута.
        При этом браузер сначала раскодирует всё значение
        (операция, обратная действию функции <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>) и затем передаст URL.
        PHP поймёт URL-адрес правильно, поскольку вы закодировали данные
        функцией <span class="function"><a href="function.urlencode.php" class="function">urlencode()</a></span>.
       </span>
       <span class="simpara">
        Вы заметите, что символ <code class="literal">&amp;</code> в URL-адресе заменяется на
        мнемонику <code class="literal">&amp;amp;</code>. Хотя большинство браузеров это исправит,
        если вы забудете об этом, но всё же это не всегда возможно. Поэтому,
        даже если ваш URL-адрес не динамический, <em>нужно</em>
        закодировать его функцией <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>.
       </span>
      </p></blockquote>
     </p>
     
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.html.form-image">
    <dt><strong>
     
      Я пытаюсь использовать &lt;input type=&quot;image&quot;&gt;, но переменные
      <var class="varname">$foo.x</var> и <var class="varname">$foo.y</var>
      недоступны. Значение <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['foo.x']</a></var> тоже не существует.
      Где они?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      При отправке формы, вместо стандартной кнопки отправки допустимо использовать
      изображение с тэгом вроде такого:
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input type=&quot;image&quot; src=&quot;image.gif&quot; name=&quot;foo&quot; /&gt;</pre>
</div>
      </div>

      Когда пользователь кликает по изображению, серверу будет послана
      сопутствующая форма с двумя дополнительными переменными:
      <var class="varname">foo.x</var> и <var class="varname">foo.y</var>.
     </p>
     <p class="para">
      Поскольку имена <var class="varname">foo.x</var> и <var class="varname">foo.y</var>
      не разрешены в PHP, они автоматически преобразовываются в
      <var class="varname">foo_x</var> и <var class="varname">foo_y</var>. То есть
      точки заменяются на подчёркивания. Таким образом, вы обращаетесь к этим переменным
      так же, как и к любым другим, описанным в разделе о получении
      <a href="language.variables.external.php" class="link">переменных извне
      PHP</a>. Например, <var class="varname"><a href="reserved.variables.get.php" class="classname">$_GET['foo_x']</a></var>.
      <blockquote class="note"><p><strong class="note">Замечание</strong>: 
       <p class="para">
         Пробелы в именах переменных запроса преобразовываются в подчёркивания.
       </p>
      </p></blockquote>
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.html.arrays">
    <dt><strong>
     Как создать массивы в HTML &lt;form&gt;?
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Чтобы браузер передал результат &lt;form&gt; в PHP-скрипт
      как <a href="language.types.array.php" class="link">массив</a>,
      элементы &lt;input&gt;, &lt;select&gt; или &lt;textarea&gt; называют
      следующим образом:
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyArray[]&quot; /&gt;</pre>
</div>
      </div>

      Обратите внимание на квадратные скобки после имени переменной: они делают переменную массивом.
      Разработчику доступна группировка элементов в массив за счёт присваивания одинакового имени
      разным элементам:
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyArray[]&quot; /&gt;
&lt;input name=&quot;MyOtherArray[]&quot; /&gt;
&lt;input name=&quot;MyOtherArray[]&quot; /&gt;</pre>
</div>
      </div>

      Это создаст два массива, MyArray и MyOtherArray, которые браузер передаст
      PHP-скрипту. Можно также задать конкретные ключи для массивов:
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;input name=&quot;AnotherArray[]&quot; /&gt;
&lt;input name=&quot;AnotherArray[]&quot; /&gt;
&lt;input name=&quot;AnotherArray[email]&quot; /&gt;
&lt;input name=&quot;AnotherArray[phone]&quot; /&gt;</pre>
</div>
      </div>

      Массив AnotherArray теперь будет содержать ключи 0, 1, email и phone.
      </p>
      <p class="para">
       <blockquote class="note"><p><strong class="note">Замечание</strong>: 
        <p class="para">
         Определять ключи массивов в HTML необязательно. Если вы не установите
         ключи, массив заполнится в порядке появления элементов в форме.
         Первый пример будет содержать ключи 0, 1, 2 и 3.
        </p>
       </p></blockquote>
      </p>
      <p class="para">
      Также смотрите
      <a href="ref.array.php" class="link">Функции для работы с массивами</a> и
      <a href="language.variables.external.php" class="link">Переменные извне PHP</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.html.select-multiple">
    <dt><strong>
     
      Как получить все результаты из HTML-тега select с атрибутом multiple?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      HTML-тег select с атрибутом multiple разрешает пользователю выбрать
      элементы из списка. Эти элементы затем передаются обработчику
      формы. Проблема в том, что они переданы с одним и тем же именем.
      Например:
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;select name=&quot;var&quot; multiple=&quot;yes&quot;&gt;</pre>
</div>
      </div>

      Каждая выбранная опция поступит обработчику формы как:
      <div class="example-contents"><div class="cdata"><pre>
var=option1
var=option2
var=option3
      </pre></div></div>

      Каждая опция будет перезаписывать содержимое предыдущей переменной
      <var class="varname">$var</var>. Решение — использовать функцию
      PHP «массив из элемента формы». Как в следующем примере:
      <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;select name=&quot;var[]&quot; multiple=&quot;yes&quot;&gt;</pre>
</div>
      </div>

      Это говорит PHP рассматривать переменную <var class="varname">$var</var> как массив и
      каждое присваивание значения для var[] добавляет элемент в массив.
      Первым элементом будет <var class="varname">$var[0]</var>, следующим —
      <var class="varname">$var[1]</var> и т. д. Можно использовать функцию <span class="function"><a href="function.count.php" class="function">count()</a></span>,
      чтобы определить, сколько элементов было выбрано,
      а функцию <span class="function"><a href="function.sort.php" class="function">sort()</a></span> — для сортировки массива опций, если это необходимо.
     </p>
     <p class="para">
      Заметьте, если вы используете JavaScript, есть риск того, что запись <code class="literal">[]</code>
      в имени элемента вызовет проблемы, если вы пытаетесь обращаться к
      элементу по имени. Вместо этого указывайте числовой идентификатор элемента формы или
      возьмите имя переменной в одинарные кавычки и используйте его как
      индекс массива элементов, например:
      <div class="example-contents"><div class="cdata"><pre>
variable = document.forms[0].elements[&#039;var[]&#039;];
      </pre></div></div>

     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.html.javascript-variable">
    <dt><strong>
     
      Как передать переменную из JavaScript в PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Поскольку JavaScript — обычно клиентская технология,
      а PHP, как правило, серверная, и поскольку
      HTML — протокол «без состояния», эти два языка не умеют обмениваться
      переменными напрямую.
     </p>
     <p class="para">
      Однако можно передавать переменные между ними.
      Один из способов добиться этого — сгенерировать JavaScript-код
      из PHP и принудительно обновлять браузер, посылая определённые
      переменные обратно PHP-скрипту. Пример показывает,
      как это сделать — он разрешает PHP-коду захватывать высоту и ширину
      экрана, что обычно возможно только на стороне клиента.
     </p>
     <p class="para">
      <div class="example" id="example-4">
       <p><strong>Пример #4 Генерирование JavaScript из PHP</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">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'width'</span><span style="color: #007700">]) AND isset(</span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'height'</span><span style="color: #007700">])) {<br />    </span><span style="color: #FF8000">// Выводим переменные с размерами<br />    </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Ширина экрана: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'width'</span><span style="color: #007700">] . </span><span style="color: #DD0000">"&lt;br /&gt;\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"Высота экрана: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$_GET</span><span style="color: #007700">[</span><span style="color: #DD0000">'height'</span><span style="color: #007700">] . </span><span style="color: #DD0000">"&lt;br /&gt;\n"</span><span style="color: #007700">;<br />} else {<br />    </span><span style="color: #FF8000">// Передаём переменные с размерами<br />    // (сохраняем оригинальную строку запроса<br />    //   — POST-переменные нужно будет передавать другим способом)<br /><br />    </span><span style="color: #007700">echo </span><span style="color: #DD0000">"&lt;script&gt;\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"  location.href = \"</span><span style="color: #007700">{</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'SCRIPT_NAME'</span><span style="color: #007700">]}</span><span style="color: #DD0000">?</span><span style="color: #007700">{</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'QUERY_STRING'</span><span style="color: #007700">]}</span><span style="color: #DD0000">"<br />            </span><span style="color: #007700">. </span><span style="color: #DD0000">"&amp;width=\" + screen.width + \"&amp;height=\" + screen.height;\n"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"&lt;/script&gt;\n"</span><span style="color: #007700">;<br />    exit;<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

      </div>
     </p>
    </dd>
   </dl>

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