Files
php-doc-ru/faq/using.xml
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

375 lines
17 KiB
XML
Raw 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: aab33d644359aba597e810e2fc0c0caa0d347c9c Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<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>сено, иголка</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>empty</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>
Подразумевая, что вы хотите использовать результат преобразования в работе
с базой данных, используйте соответствующий механизм экранирования, идущий
с используемой вами базой данных. Например, используйте
<function>mysql_real_escape_string</function> с MySQL и
<function>pg_escape_string</function> с PostgreSQL.
Есть также более общие функции <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>return</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 страницу.
После этого 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 -&gt;
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?
Я бы хотел что-нибудь бесплатное и не требующее внешних библиотек PDF.
</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>int</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
-->