<?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 => 'uk',
  ),
  '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' => 'uk',
    '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-тегу
      &lt;select&gt;?
     
    </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">
      Є кілька етапів, для яких кодування є важливим. Припустимо, що ви маєте
      <span class="type"><a href="language.types.string.php" class="type string">string</a></span> <var class="varname">$data</var>, яка містить рядок, який ви
      хочете передати незакодованим. Це виглядатиме таким чином:
      <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 складається з частин. Аби певні дані сприймалися, як частина
         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 />    </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 /></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> тому, що за це відповідає браузер. Усі
        популярні браузери роблять це правильно, незалежно від методу (себто 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 />    </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 /></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, браузер закодує дані в URL
        для передавання до PHP, який їх розкодує. Тож вам не треба самостійно
        щось кодувати, все обробиться автоматично.
       </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 />    </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"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

      </div>
      <blockquote class="note"><p><strong class="note">Зауваження</strong>: 
       <span class="simpara">
        Якщо ви модулюєте 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">
        Вам потрібно обробити всю URL функцією
        <span class="function"><a href="function.htmlspecialchars.php" class="function">htmlspecialchars()</a></span>, щоб 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> до URL.
       </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> and <var class="varname">foo.y</var>.
     </p>
     <p class="para">
      Оскільки <var class="varname">foo.x</var> і <var class="varname">foo.y</var> містять в
      назвах недозволені символи, вони автоматично перейменуються на
      <var class="varname">foo_x</var> і <var class="varname">foo_y</var>. Тобто крапки
      заміняться на підкреслення. Таким чином, ви матимете доступ до цих
      змінних, як і до будь-яких інших, описаних в розділі про отримання
      <a href="language.variables.external.php" class="link">змінних з зовнішніх
      джерел</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">
      Для отримання в скрипті PHP надісланого результату як
      <a href="language.types.array.php" class="link">array</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>

      Такий код створює два масиви &quot;MyArray&quot; та &quot;MyOtherArray&quot;, які
      надсилаються до скрипта 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>

      Масив &quot;AnotherArray&quot; міститиме ключі 0, 1, &quot;email&quot; і &quot;phone&quot;.
      </p>
      <p class="para">
       <blockquote class="note"><p><strong class="note">Зауваження</strong>: 
        <p class="para">
         Визначення ключів масиву необов&#039;язкове у 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">Змінні з зовнішніх
      джерел</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.html.select-multiple">
    <dt><strong>
     
      Як мені отримати всі вибрані варіанти з множинного виду HTML-тегу
      &lt;select&gt;?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Множинний вид тегу &lt;select&gt; в HTML дозволяє користувачам обрати
      кілька елементів з списку. Далі ці елементи передаються до обробника
      дій форми. Проблема в тому, що вони всі передаються з однаковою назвою.
      Тобто:
      <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 робити
      &quot;масив з елемента форми&quot;. Слід писати наступне:
      <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> в
      назві елемента може спровокувати проблеми при намаганні звернутися до
      елемента за атрибутом &quot;name&quot;. Краще використати атрибут &quot;id&quot; або вкласти
      назву змінної в одинарні лапки та використовувати її як індекс масиву
      елементів. Наприклад:
      <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 (зазвичай) —
      сервер, а HTTP — це протокол &quot;без стану&quot;, дві мови не мають функціоналу
      прямого обміну змінними.
     </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 /></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 language='javascript'&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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
       </div>

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

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