1
0
mirror of https://github.com/php/doc-uk.git synced 2026-03-23 22:52:14 +01:00
Files
archived-doc-uk/faq/using.xml

370 lines
16 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 0a3a57fae02391db80baeba98c9a071dc2760889 Maintainer: mproshchuk Status: ready -->
<chapter xml:id="faq.using" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Використання PHP</title>
<titleabbrev>Використання PHP</titleabbrev>
<para>
Цей розділ зібрав багато розповсюджених помилок, з якими можна зіткнутися під
час написання PHP-скриптів.
</para>
<qandaset>
<qandaentry xml:id="faq.using.parameterorder">
<!-- TODO: Mention named arguments -->
<question>
<para>
Я не пам’ятаю порядок параметрів функцій PHP, він хаотичний?
</para>
</question>
<answer>
<para>
PHP — це "клей", який об’єднує сотні зовнішніх бібліотек, тому іноді
виглядає безладним. Однак просте правило полягає в наступному:
</para>
<para>
Параметри <link linkend="book.array">функцій для роботи з масивами</link>
розміщені у порядку "<emphasis>needle, haystack</emphasis>", натомість у
<link linkend="book.strings">функцій для роботи з рядками</link> навпаки —
"<emphasis>haystack, needle</emphasis>".
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.anyform">
<question>
<para>
Я б хотів написати загальний PHP-скрипт для обробки даних, що надходять з
форм. Як мені дізнатися, які змінні методу POST доступні?
</para>
</question>
<answer>
<para>
PHP пропонує багато <link linkend="language.variables.predefined">
попередньо визначених змінних</link>, наприклад суперглобальну
<varname>$_POST</varname>. Ви можете застосувати цикл до
<varname>$_POST</varname>, оскільки це асоціативний масив усіх значень
POSTу. Нехай просто пройдемося по ньому за допомогою &foreach;,
перевіримо наявність <function>порожніх</function> значень, та виведемо їх
на екран.
<programlisting role="php">
<![CDATA[
<?php
$empty = $post = array();
foreach ($_POST as $varname => $varvalue) {
if (empty($varvalue)) {
$empty[$varname] = $varvalue;
} else {
$post[$varname] = $varvalue;
}
}
print "<pre>";
if (empty($empty)) {
print "Жодне значення POSTу не порожнє, ось вони:\n";
var_dump($post);
} else {
print "Дано " . count($empty) . " порожніх значень.\n";
print "Заповнені:\n"; var_dump($post);
print "Порожні:\n"; var_dump($empty);
exit;
}
?>
]]>
</programlisting>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.addslashes">
<!-- TODO Probably should mention not doing this... -->
<question>
<para>
Мені треба додати перед усіма одинарними лапками (') зворотню косу риску
(\). Як це зробити за допомогою регулярного виразу? Мені б також хотілося
замінити (") на (\") та (\) на (\\).
</para>
</question>
<answer>
<para>
Схоже, це для бази даних, але в ній вже існує механізм екранування
символів, тож використовуйте його. Для MySQL — це
<function>mysql_real_escape_string</function>, а для PostgreSQL —
<function>pg_escape_string</function>. Також є загальні функції
<function>addslashes</function> і <function>stripslashes</function>, які
частіше зустрічаються у старому коді PHP.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.wrong-order">
<question>
<para>
Коли я роблю наступне, результат виводиться не за порядком:
<programlisting role="php">
<![CDATA[
<?php
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
?>
]]>
</programlisting>
що відбувається?
</para>
</question>
<answer>
<para>
Щоб могти використовувати результат вашої функції у виразі (наприклад
приєднати його до іншого рядка, як показано вище), вам необхідно
<function>повернути</function> значення, а не виводити його на екран
конструкцією <function>echo</function>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.newlines">
<question>
<para>
Ей, чому все в одному рядку?
<programlisting role="php">
<![CDATA[
<pre>
<?php echo "Це має бути перший рядок."; ?>
<?php echo "Це має виводитись після символу початку рядка, що є вище."; ?>
</pre>
]]>
</programlisting>
</para>
</question>
<answer>
<para>
У PHP закінченням блоку коду є як "?&gt;", так і "?&gt;\n" (де \n означає
початок нового рядка). Тож у прикладі вище виведені речення будуть на
одній лінії, бо PHP опускає символ початку рядка. З цього випливає, що вам
необхідно вставити ще один символ нового рядка після кожного блоку коду
PHP, щоб виводився один новий рядок.
</para>
<para>
Чому PHP робить це? Бо під час форматування простого HTML це, зазвичай,
полегшує вам життя, якщо не потрібно виводити цей символ. Бо інакше
доведеться створювати надто довгі рядки, щоб досягнути такого ж ефекту, а
це зробить код не придатним для читання.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.headers-sent">
<question>
<para>
Я отримую повідомлення "Warning: Cannot send session cookie - headers
already sent..." або "Cannot add header information - headers already
sent...".
</para>
</question>
<answer>
<para>
Функції <function>header</function>, <function>setcookie</function>,
та <link linkend="ref.session">функції для роботи з сесіями</link>
надсилають заголовки до потоку виводу, проте заголовки можна
надіслати тільки перед всім іншим вмістом. Тобто не можна нічого виводити
перед використанням цих функцій, наприклад код HTML. Функція
<function>headers_sent</function> може перевірити, чи ваш скрипт надіслав
заголовки. Докладніше: <link linkend="ref.outcontrol">Функції контролю
виводу</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.header">
<question>
<para>
Мені потрібен прямий доступ до інформації в заголовку запиту. Як я можу
це зробити?
</para>
</question>
<answer>
<para>
Це робить функція <function>getallheaders</function> за умови запуску PHP
як модуля Apache. Тоді наступний коротенький код покаже всі заголовки
запиту:
<programlisting role="php">
<![CDATA[
<?php
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content<br />\n";
}
?>
]]>
</programlisting>
</para>
<para>
Перегляньте також
<function>apache_lookup_uri</function>,
<function>apache_response_headers</function> та
<function>fsockopen</function>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.authentication">
<question>
<para>
Коли я намагаюся використати автентифікацію за допомогою IIS, я отримую
'No Input file specified'.
</para>
</question>
<answer>
<para>
У цьому винна модель безпеки IIS. Це є проблемою усіх CGI-застосунків в
IIS. Щоб обійти її, створіть простий файл HTML (що не обробляється PHP),
який буде сторінкою входу в теці автентифікації. Потім використайте
META-тег для перенаправлення на PHP-сторінку, або посилання. PHP розпізна́є
спробу входу коректно. Це не повинно впливати на інші вебсервери NT.
Більше інформації за адресою <link xlink:href="&url.iis;">&url.iis;</link>
та у розділі посібника
<link linkend="features.http-auth">HTTP-автентифікація</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.iis.sharing">
<question>
<para>
Windows: Я не можу отримати доступ до файлів, спільних з іншим
комп'ютером, використовуючи IIS.
</para>
</question>
<answer>
<para>
Потрібно внести зміни. Перейдіть в
<literal>Internet Information Services</literal>. Знайдіть свій файл PHP
і перейдіть до його властивостей. Далі до вкладки
<literal>File Security</literal>, далі — <literal>Edit -&lt;
Anonymous access and authentication control</literal>.
</para>
<para>
Ви можете вирішити проблему, знявши галочку <literal>Anonymous
Access</literal> і залишивши галочку <literal>Integrated Window
Authentication</literal>, або поставити галочку <literal>Anonymous
Access</literal> і відредагувати користувача, оскільки він може не мати
прав доступу.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.mixml">
<question>
<para>
Як я можу змішувати XML та PHP? Інтерпретатор скаржиться на теги
"&lt;?xml"!
</para>
</question>
<answer>
<para>
Щоб вставляти &lt;?xml прямо у ваш код PHP, треба вимкнути короткі теги,
задавши директиві PHP
<link linkend="ini.short-open-tag">short_open_tags</link> значення
<literal>0</literal>. Не дозволяється використовувати для цього функцію
<function>ini_set</function>. Якщо вимкнути
<link linkend="ini.short-open-tag">short_open_tags</link>, ви зможете
робити щось на кшталт: <literal>&lt;?php echo '&lt;?xml'; ?&gt;</literal>.
Початкове значення цієї директиви: <literal>On</literal>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.variables">
<question>
<para>
Де я можу знайти повний список змінних, які мені доступні в PHP?
</para>
</question>
<answer>
<para>
Прочитайте сторінку посібника про
<link linkend="language.variables.predefined">попередньо визначені
змінні</link>, вона містить неповний список попередньо визначених змінних,
які доступні вашому скрипту. А повний список (і багато іншої інформації)
виводить функція <function>phpinfo</function>. Обов'язково прочитайте
розділ посібника про <link linkend="language.variables.external">змінні,
що поза PHP</link>, оскільки він описує поширені сценарії зі зовнішніми
змінними, як-от з HTML-форми, Cookie та URL.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.freepdf">
<question>
<para>
Як генерувати файли PDF без платних комерційних бібліотек, таких як
PDFLib? Я б хотів щось безкоштовне і що не вимагає зовнішніх бібліотек.
</para>
</question>
<answer>
<para>
Є альтернативи, написані на PHP:
<link xlink:href="&url.pdf.fpdf;">FPDF</link> та
<link xlink:href="&url.pdf.tcpdf;">TCPDF</link>.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.using.shorthandbytes">
<question>
<para>
Певні директиви PHP можуть мати скорочене байтове значення, крім, коли
воно записується виключно <type>числом</type>. Які скорочення дозволені?
</para>
</question>
<answer>
<para>
K (для кілобайтів), M (для мегабайтів) та G (для гігабайтів) незалежно від
регістру символу. Все інше — це байти. <literal>1M</literal> дорівнює
одному мегабайту або <literal>1048576</literal> байтам.
<literal>1K</literal> дорівнює одному кілобайту або
<literal>1024</literal> байтам. Такі скорочення можна використовувати в
&php.ini; та в функції <function>ini_set</function>.
Майте на увазі, що числове значення приводиться до типу <type>int</type>;
наприклад <literal>0.5M</literal> трактується як <literal>0</literal>.
</para>
<note>
<title>Кілобайти проти кібібайтів</title>
<para>
Нотація PHP визначає один кілобайт рівним 1024 байтам, в той час як
стандарт <acronym>IEC</acronym> вважає це кібібайтом.
Підсумок: k та K = 1024 байтів.
</para>
</note>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->