<?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.using.php',
    1 => 'Використання PHP',
    2 => 'Використання PHP',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'ЧаПи',
  ),
  'prev' => 
  array (
    0 => 'faq.build.php',
    1 => 'Проблеми збірки',
  ),
  'next' => 
  array (
    0 => 'faq.passwords.php',
    1 => 'Гешування паролів',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'uk',
    'path' => 'faq/using.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.using" class="chapter">
  <h1 class="title">Використання PHP</h1>

  

  <p class="para">
   Цей розділ зібрав багато розповсюджених помилок, з якими можна зіткнутися під
   час написання PHP-скриптів.
  </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.using.parameterorder">
     
      Я не пам&rsquo;ятаю порядок параметрів функцій PHP, він хаотичний?
     
    </a></li><li><a href="#faq.using.anyform">
     
      Я б хотів написати загальний PHP-скрипт для обробки даних, що надходять з
      форм. Як мені дізнатися, які змінні методу POST доступні?
     
    </a></li><li><a href="#faq.using.addslashes">
     
      Мені треба додати перед усіма одинарними лапками (&#039;) зворотню косу риску
      (\). Як це зробити за допомогою регулярного виразу? Мені б також хотілося
      замінити (&quot;) на (\&quot;) та (\) на (\\).
     
    </a></li><li><a href="#faq.using.wrong-order">
     
      Коли я роблю наступне, результат виводиться не за порядком: 
     

&lt;?php
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo &quot;myfunc($variable) = &quot; . myfunc($variable);
?&gt;

    
     що відбувається?
     
    </a></li><li><a href="#faq.using.newlines">
     
      Ей, чому все в одному рядку?
      

&lt;pre&gt;
&lt;?php echo &quot;Це має бути перший рядок.&quot;; ?&gt;
&lt;?php echo &quot;Це має виводитись після символу початку рядка, що є вище.&quot;; ?&gt;
&lt;/pre&gt;

      
     
    </a></li><li><a href="#faq.using.headers-sent">
     
      Я отримую повідомлення &quot;Warning: Cannot send session cookie - headers
      already sent...&quot; або &quot;Cannot add header information - headers already
      sent...&quot;.
     
    </a></li><li><a href="#faq.using.header">
     
      Мені потрібен прямий доступ до інформації в заголовку запиту. Як я можу
      це зробити?
     
    </a></li><li><a href="#faq.using.authentication">
     
      Коли я намагаюся використати автентифікацію за допомогою IIS, я отримую
      &#039;No Input file specified&#039;.
     
    </a></li><li><a href="#faq.using.iis.sharing">
     
      Windows: Я не можу отримати доступ до файлів, спільних з іншим
      комп&#039;ютером, використовуючи IIS.
     
    </a></li><li><a href="#faq.using.mixml">
     
      Як я можу змішувати XML та PHP? Інтерпретатор скаржиться на теги
      &quot;&lt;?xml&quot;!
     
    </a></li><li><a href="#faq.using.variables">
     
      Де я можу знайти повний список змінних, які мені доступні в PHP?
     
    </a></li><li><a href="#faq.using.freepdf">
     
      Як генерувати файли PDF без платних комерційних бібліотек, таких як
      PDFLib? Я б хотів щось безкоштовне і що не вимагає зовнішніх бібліотек.
     
    </a></li><li><a href="#faq.using.shorthandbytes">
     
      Певні директиви PHP можуть мати скорочене байтове значення, крім, коли
      воно записується виключно числом. Які скорочення дозволені?
     
    </a></li></ol></div>

   <dl class="qandaentry" id="faq.using.parameterorder">
    
    <dt><strong>
     
      Я не пам’ятаю порядок параметрів функцій PHP, він хаотичний?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP — це &quot;клей&quot;, який об’єднує сотні зовнішніх бібліотек, тому іноді
      виглядає безладним. Однак просте правило полягає в наступному:
     </p>
     <p class="para">
      Параметри <a href="book.array.php" class="link">функцій для роботи з масивами</a>
      розміщені у порядку &quot;<em>needle, haystack</em>&quot;, натомість у
      <a href="book.strings.php" class="link">функцій для роботи з рядками</a> навпаки —
      &quot;<em>haystack, needle</em>&quot;.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.anyform">
    <dt><strong>
     
      Я б хотів написати загальний PHP-скрипт для обробки даних, що надходять з
      форм. Як мені дізнатися, які змінні методу POST доступні?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP пропонує багато <a href="language.variables.predefined.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.post.php" class="classname">$_POST</a></var>, оскільки це асоціативний масив усіх значень
      POSTу. Нехай просто пройдемося по ньому за допомогою <a href="control-structures.foreach.php" class="link">foreach</a>, 
      перевіримо наявність <span class="function"><strong>порожніх()</strong></span> значень, та виведемо їх
      на екран.
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$empty </span><span style="color: #007700">= </span><span style="color: #0000BB">$post </span><span style="color: #007700">= array();<br />foreach (</span><span style="color: #0000BB">$_POST </span><span style="color: #007700">as </span><span style="color: #0000BB">$varname </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">) {<br />    if (empty(</span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">)) {<br />        </span><span style="color: #0000BB">$empty</span><span style="color: #007700">[</span><span style="color: #0000BB">$varname</span><span style="color: #007700">] = </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">;<br />    } else {<br />        </span><span style="color: #0000BB">$post</span><span style="color: #007700">[</span><span style="color: #0000BB">$varname</span><span style="color: #007700">] = </span><span style="color: #0000BB">$varvalue</span><span style="color: #007700">;<br />    }<br />}<br /><br />print </span><span style="color: #DD0000">"&lt;pre&gt;"</span><span style="color: #007700">;<br />if (empty(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">)) {<br />    print </span><span style="color: #DD0000">"Жодне значення POSTу не порожнє, ось вони:\n"</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br />} else {<br />    print </span><span style="color: #DD0000">"Дано " </span><span style="color: #007700">. </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">) . </span><span style="color: #DD0000">" порожніх значень.\n"</span><span style="color: #007700">;<br />    print </span><span style="color: #DD0000">"Заповнені:\n"</span><span style="color: #007700">; </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$post</span><span style="color: #007700">);<br />    print </span><span style="color: #DD0000">"Порожні:\n"</span><span style="color: #007700">;  </span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$empty</span><span style="color: #007700">);<br />    exit;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>

    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.addslashes">
    
    <dt><strong>
     
      Мені треба додати перед усіма одинарними лапками (&#039;) зворотню косу риску
      (\). Як це зробити за допомогою регулярного виразу? Мені б також хотілося
      замінити (&quot;) на (\&quot;) та (\) на (\\).
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Схоже, це для бази даних, але в ній вже існує механізм екранування
      символів, тож використовуйте його. Для MySQL — це
      <span class="function"><a href="function.mysql-real-escape-string.php" class="function">mysql_real_escape_string()</a></span>, а для PostgreSQL —
      <span class="function"><a href="function.pg-escape-string.php" class="function">pg_escape_string()</a></span>. Також є загальні функції
      <span class="function"><a href="function.addslashes.php" class="function">addslashes()</a></span> і <span class="function"><a href="function.stripslashes.php" class="function">stripslashes()</a></span>, які
      частіше зустрічаються у старому коді PHP.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.wrong-order">
    <dt><strong>
     
      Коли я роблю наступне, результат виводиться не за порядком: 
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">myfunc</span><span style="color: #007700">(</span><span style="color: #0000BB">$argument</span><span style="color: #007700">)<br />{<br />    echo </span><span style="color: #0000BB">$argument </span><span style="color: #007700">+ </span><span style="color: #0000BB">10</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">$variable </span><span style="color: #007700">= </span><span style="color: #0000BB">10</span><span style="color: #007700">;<br />echo </span><span style="color: #DD0000">"myfunc(</span><span style="color: #0000BB">$variable</span><span style="color: #DD0000">) = " </span><span style="color: #007700">. </span><span style="color: #0000BB">myfunc</span><span style="color: #007700">(</span><span style="color: #0000BB">$variable</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

     що відбувається?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Щоб могти використовувати результат вашої функції у виразі (наприклад
      приєднати його до іншого рядка, як показано вище), вам необхідно
      <span class="function"><strong>повернути()</strong></span> значення, а не виводити його на екран
      конструкцією <span class="function"><a href="function.echo.php" class="function">echo</a></span>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.newlines">
    <dt><strong>
     
      Ей, чому все в одному рядку?
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">&lt;pre&gt;<br /><span style="color: #0000BB">&lt;?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Це має бути перший рядок."</span><span style="color: #007700">; </span><span style="color: #0000BB">?&gt;<br />&lt;?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"Це має виводитись після символу початку рядка, що є вище."</span><span style="color: #007700">; </span><span style="color: #0000BB">?&gt;<br /></span>&lt;/pre&gt;</span></code></div>
      </div>

     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      У PHP закінченням блоку коду є як &quot;?&gt;&quot;, так і &quot;?&gt;\n&quot; (де \n означає
      початок нового рядка). Тож у прикладі вище виведені речення будуть на
      одній лінії, бо PHP опускає символ початку рядка. З цього випливає, що вам
      необхідно вставити ще один символ нового рядка після кожного блоку коду
      PHP, щоб виводився один новий рядок.
     </p>
     <p class="para">
      Чому PHP робить це? Бо під час форматування простого HTML це, зазвичай,
      полегшує вам життя, якщо не потрібно виводити цей символ. Бо інакше
      доведеться створювати надто довгі рядки, щоб досягнути такого ж ефекту, а
      це зробить код не придатним для читання.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.headers-sent">
    <dt><strong>
     
      Я отримую повідомлення &quot;Warning: Cannot send session cookie - headers
      already sent...&quot; або &quot;Cannot add header information - headers already
      sent...&quot;.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Функції <span class="function"><a href="function.header.php" class="function">header()</a></span>, <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>,
      та <a href="ref.session.php" class="link">функції для роботи з сесіями</a>
      надсилають заголовки до потоку виводу, проте заголовки можна
      надіслати тільки перед всім іншим вмістом. Тобто не можна нічого виводити
      перед використанням цих функцій, наприклад код HTML. Функція
      <span class="function"><a href="function.headers-sent.php" class="function">headers_sent()</a></span> може перевірити, чи ваш скрипт надіслав
      заголовки. Докладніше: <a href="ref.outcontrol.php" class="link">Функції контролю
      виводу</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.header">
    <dt><strong>
     
      Мені потрібен прямий доступ до інформації в заголовку запиту. Як я можу
      це зробити?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Це робить функція <span class="function"><a href="function.getallheaders.php" class="function">getallheaders()</a></span> за умови запуску PHP
      як модуля Apache. Тоді наступний коротенький код покаже всі заголовки
      запиту:
      <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$headers </span><span style="color: #007700">= </span><span style="color: #0000BB">getallheaders</span><span style="color: #007700">();<br />foreach (</span><span style="color: #0000BB">$headers </span><span style="color: #007700">as </span><span style="color: #0000BB">$name </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$content</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"headers[</span><span style="color: #0000BB">$name</span><span style="color: #DD0000">] = </span><span style="color: #0000BB">$content</span><span style="color: #DD0000">&lt;br /&gt;\n"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </p>
     <p class="para">
      Перегляньте також 
      <span class="function"><a href="function.apache-lookup-uri.php" class="function">apache_lookup_uri()</a></span>,
      <span class="function"><a href="function.apache-response-headers.php" class="function">apache_response_headers()</a></span> та
      <span class="function"><a href="function.fsockopen.php" class="function">fsockopen()</a></span>
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.authentication">
    <dt><strong>
     
      Коли я намагаюся використати автентифікацію за допомогою IIS, я отримую
      &#039;No Input file specified&#039;.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      У цьому винна модель безпеки IIS. Це є проблемою усіх CGI-застосунків в
      IIS. Щоб обійти її, створіть простий файл HTML (що не обробляється PHP),
      який буде сторінкою входу в теці автентифікації. Потім використайте
      META-тег для перенаправлення на PHP-сторінку, або посилання. PHP розпізна́є
      спробу входу коректно. Це не повинно впливати на інші вебсервери NT.
      Більше інформації за адресою <a href="http://support.microsoft.com/kb/q160422/" class="link external">&raquo;&nbsp;http://support.microsoft.com/kb/q160422/</a>
      та у розділі посібника
      <a href="features.http-auth.php" class="link">HTTP-автентифікація</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.iis.sharing">
    <dt><strong>
     
      Windows: Я не можу отримати доступ до файлів, спільних з іншим
      комп&#039;ютером, використовуючи IIS.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Потрібно внести зміни. Перейдіть в
      <code class="literal">Internet Information Services</code>. Знайдіть свій файл PHP
      і перейдіть до його властивостей. Далі до вкладки
      <code class="literal">File Security</code>, далі — <code class="literal">Edit -&lt; 
      Anonymous access and authentication control</code>.
     </p>
     <p class="para">
      Ви можете вирішити проблему, знявши галочку <code class="literal">Anonymous
      Access</code> і залишивши галочку <code class="literal">Integrated Window
      Authentication</code>, або поставити галочку <code class="literal">Anonymous
      Access</code> і відредагувати користувача, оскільки він може не мати
      прав доступу.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.mixml">
    <dt><strong>
     
      Як я можу змішувати XML та PHP? Інтерпретатор скаржиться на теги
      &quot;&lt;?xml&quot;!
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Щоб вставляти &lt;?xml прямо у ваш код PHP, треба вимкнути короткі теги,
      задавши директиві PHP
      <a href="ini.core.php#ini.short-open-tag" class="link">short_open_tags</a> значення
      <code class="literal">0</code>. Не дозволяється використовувати для цього функцію
      <span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span>. Якщо вимкнути
      <a href="ini.core.php#ini.short-open-tag" class="link">short_open_tags</a>, ви зможете
      робити щось на кшталт: <code class="literal">&lt;?php echo &#039;&lt;?xml&#039;; ?&gt;</code>.  
      Початкове значення цієї директиви: <code class="literal">On</code>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.variables">
    <dt><strong>
     
      Де я можу знайти повний список змінних, які мені доступні в PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Прочитайте сторінку посібника про
      <a href="language.variables.predefined.php" class="link">попередньо визначені
      змінні</a>, вона містить неповний список попередньо визначених змінних,
      які доступні вашому скрипту. А повний список (і багато іншої інформації)
      виводить функція <span class="function"><a href="function.phpinfo.php" class="function">phpinfo()</a></span>. Обов&#039;язково прочитайте
      розділ посібника про <a href="language.variables.external.php" class="link">змінні,
      що поза PHP</a>, оскільки він описує поширені сценарії зі зовнішніми
      змінними, як-от з HTML-форми, Cookie та URL.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.freepdf">
    <dt><strong>
     
      Як генерувати файли PDF без платних комерційних бібліотек, таких як
      PDFLib? Я б хотів щось безкоштовне і що не вимагає зовнішніх бібліотек.
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Є альтернативи, написані на PHP:
      <a href="http://www.fpdf.org/" class="link external">&raquo;&nbsp;FPDF</a> та
      <a href="http://www.tcpdf.org/" class="link external">&raquo;&nbsp;TCPDF</a>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.using.shorthandbytes">
    <dt><strong>
     
      Певні директиви PHP можуть мати скорочене байтове значення, крім, коли
      воно записується виключно <span class="type">числом</span>. Які скорочення дозволені?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      K (для кілобайтів), M (для мегабайтів) та G (для гігабайтів) незалежно від
      регістру символу. Все інше — це байти. <code class="literal">1M</code> дорівнює
      одному мегабайту або <code class="literal">1048576</code> байтам.
      <code class="literal">1K</code> дорівнює одному кілобайту або
      <code class="literal">1024</code> байтам. Такі скорочення можна використовувати в
      <var class="filename">php.ini</var> та в функції <span class="function"><a href="function.ini-set.php" class="function">ini_set()</a></span>.
      Майте на увазі, що числове значення приводиться до типу <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>;
      наприклад <code class="literal">0.5M</code> трактується як <code class="literal">0</code>.
     </p>
     <blockquote class="note"><p><strong class="note">Зауваження</strong>: 
      <strong>Кілобайти проти кібібайтів</strong><br />
      <p class="para">
       Нотація PHP визначає один кілобайт рівним 1024 байтам, в той час як
       стандарт <abbr>IEC</abbr> вважає це кібібайтом.
       Підсумок: k та K = 1024 байтів.
      </p>
     </p></blockquote>
    </dd>
   </dl>
  
 </div>
<?php manual_footer($setup); ?>