mirror of
https://github.com/php/doc-uk.git
synced 2026-03-23 22:52:14 +01:00
370 lines
16 KiB
XML
370 lines
16 KiB
XML
<?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 закінченням блоку коду є як "?>", так і "?>\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 -<
|
||
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? Інтерпретатор скаржиться на теги
|
||
"<?xml"!
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Щоб вставляти <?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><?php echo '<?xml'; ?></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
|
||
-->
|