mirror of
https://github.com/php/doc-ru.git
synced 2025-08-20 23:31:15 +00:00
375 lines
17 KiB
XML
375 lines
17 KiB
XML
<?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, блок кода завершается либо с "?>", либо с "?>\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 ->
|
||
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?
|
||
Я бы хотел что-нибудь бесплатное и не требующее внешних библиотек 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
|
||
-->
|