Главная Статьи Написать
 
Начнём
Введение
Инсталяция
Конфигурирование
Безопасность
Справочник Языка
Базовый синтаксис
Типы
Переменные
Константы
Выражения
Операции
Структуры управления
Функции
Классы и Объекты
Ссылки. Разъяснение.
Возможности
Обработка Ошибок
Создание изображений и манипуляции с ними
HTTP-аутентификация в PHP
Куки
Обработка загрузки файлов
Использование удалённых файлов
Обслуживание соединений
Постоянные соединения с базами данных
Безопасный режим
Использование PHP из командной строки
Функции. Справочник.
Функции, специфические для Apache
Array-функции
Aspell-функции [не рекомендуются]
BCMath математические функции произвольной точности
Bzip2 Compression-функции
Calendar-функции
CCVS API-функции
Функции поддержки COM для Windows
Class/Object-функции
ClibPDF-функции
Crack-функции
CURL, Client URL Library-функции
Cybercash payment-функции
Crédit Mutuel CyberMUT-функции
Cyrus IMAP -функции администрирования
Функции типов символов
Функции абстрактного слоя БД (dbm-стиль)
Дата и Время
dBase-функции
DBM-функции
dbx-функции
DB++-функции
Direct IO-функции
Функции директорий
DOM XML-функции
.NET-функции
Обработка ошибок и логинг
FrontBase-функции
filePro-функции
Функции файловой системы
Forms Data Format-функции
FriBiDi-функции
FTP-функции
Функции работы с функциями
Gettext
GMP-функции
HTTP-функции
Hyperwave-функции
Hyperwave API-функции
ICAP-функции [не рекомендуются]
iconv-функции
Image-функции
IMAP, POP3 и NNTP-функции
Informix-функции
InterBase-функции
Ingres II-функции
IRC Gateway-функции
Java
LDAP-функции
Mail-функции
mailparse-функции
Mathematical-функции
Многобайтные строки
MCAL-функции
Mcrypt Encryption-функции
Mhash-функции
Mimetype-функции
Microsoft SQL Server-функции
Ming-функции для Flash
Прочие функции
mnoGoSearch-функции
mSQL-функции
MySQL-функции
Mohawk Software -функции обработчика сессии
muscat-функции
Network-функции
Ncurses -функции управления терминалом
Lotus Notes-функции
Unified ODBC-функции
Oracle 8-функции
OpenSSL-функции
Oracle-функции
Ovrimos SQL-функции
Управление выводом
Перегрузка свойств объектов и вызовов методов
PDF-функции
Verisign Payflow Pro-функции
PHP. Опции & Информация
POSIX-функции
PostgreSQL-функции
Управление процессом
Выполнение программы
Printer-функции
Pspell-функции
GNU Readline
GNU Recode-функции
Функции регулярных выражений (Perl-совместимые)
qtdom-функции
Функции регулярных выражений (POSIX расширенная)
Semaphore, Shared Memory и IPC-функции
SESAM database-функции
Обслуживание сессий
Shared Memory-функции
Shockwave Flash-функции
SNMP-функции
Socket-функции
String-функции
Sybase-функции
URL-функции
Функции переменных
vpopmail-функции
W32api-функции
WDDX-функции
XML parser-функции
XMLRPC-функции
XSLT-функции
YAZ-функции
YP/NIS-функции
Zip File-функции (доступ только для чтения)
Zlib Compression-функции
Расширение PHP 4.0
Обзор
Возможность расширения
Строение исходного кода
Система автоматического построения РНР
Создание расширений
Использование расширений
Решение проблем
Исходные Ресурсы. Обсуждение.
Приём аргументов
Создание переменных
Дублирование содержимого переменной: конструктор Copy
Возвращаемые значения
Печать информации
Startup и Shutdown-функции
Вызов пользовательских функций
Поддержка файлов инициализации
Что дальше?
Справочник: некоторые макросы конфигурации
Макросы API
FAQ: Frequently Asked Questions
Общая информация
Списки рассылки
Получение PHP
Вопросы о базах данных
Инсталяция
Проблемы построения
Использование PHP
PHP и HTML
PHP и COM
PHP и другие языки
Переход от PHP 2 к PHP 3
Переход от PHP 3 к PHP 4
Другие вопросы
Приложения
История PHP и смежных проектов
Переход от PHP 3 к PHP 4
Переход от PHP/FI 2 к PHP 3
Отладка PHP
Расширение PHP
Список псевдонимов функций
Список зарезервированных слов
Список типов ресурсов
Список лексем разборщика
Об этом учебнике




Глава 50. Использование PHP

В этом разделе собраны наиболее часто встречающиеся при написании PHP-скриптов ошибки.

1. Я хотел бы написать общий PHP-скрипт, обрабатывающий данные из любой формы. Как мне узнать, какие переменные метода POST доступны?
2. Мне необходимо конвертировать одинарные кавычки (') в backslash'и с одинарными кавычками. Как это можно сделать с помощью регулярного выражения?
3. Когда я выполняю следующие действия, вывод печатается в неправильном порядке:
function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
что происходит?
4. Эй, что происходит с моими символами newline?
<pre>
<?php echo "This should be the first line."; ?>
<?php echo "This should show up after the new line above."; ?>
</pre>
5. Я получаю сообщение 'Предупреждение!: Cannot send session cookie - headers already sent...' или 'Cannot add header information - headers already sent...'.
6. Мне нужен прямой доступ к информации шапки/header запроса. Как это сделать?
7. Когда я пытаюсь использовать аутентификацию совместно с IIS, я получаю 'No Input file specified'.
8. Мой PHP-скрипт работает на IE под Lynx, но на Netscape часть вывода теряется. Если я выполняю "View Source", я вижу содержимое в IE, но не в Netscape.
9. Как мне смешать XML и PHP? Он жалуется на мои тэги <?xml>!
10. Как работать с PHP во FrontPage или другом HTML-редакторе, который настаивает на удалении моего кода?
11. Где можно найти полный список предустановленных переменных, и почему они не задокументированы в документации PHP?
12. Я пытаюсь получить доступ к одной из стандартных переменных CGI (таких как $DOCUMENT_ROOT или $HTTP_REFERER) в пользовательской функции, и не могу их найти. Что не так?

1. Я хотел бы написать общий PHP-скрипт, обрабатывающий данные из любой формы. Как мне узнать, какие переменные метода POST доступны?

Убедитесь, что track_vars включена в вашем файле php.ini. Начиная с PHP 4.0.3, эта возможность всегда on/включена. Когда track_vars on, она создаёт некоторые ассоциативные массивы, самый важный из них: $_POST (он используется для вызова из $HTTP_POST_VARS в PHP-версиях до 4.1.0). Так, чтобы написать общий скрипт для обработки переменных метода POST, вам необходимо что-нибудь такое:

foreach ($_POST as $var => $value) {
    echo "$var = $value<br>\n";
}

2. Мне необходимо конвертировать одинарные кавычки (') в backslash'и с одинарными кавычками. Как это можно сделать с помощью регулярного выражения?

Прежде всего просмотрите функцию addslashes(). Она делает в точности то, что вам нужно. Вы также должны просмотреть директиву magic_quotes_gpc в файле php.ini.

3. Когда я выполняю следующие действия, вывод печатается в неправильном порядке:

function myfunc($argument)
{
    echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
что происходит?

Чтобы иметь возможность использовать в выражении результаты работы вашей функции (такие как конкатенация с другими строками в предыдущем примере), вам необходимо return\возвратить значение, а не echo() его.

4. Эй, что происходит с моими символами newline?

<pre>
<?php echo "This should be the first line."; ?>
<?php echo "This should show up after the new line above."; ?>
</pre>

В PHP блок кода завершается символами "?>" или "?>\n" (где \n означает newline/символ новой строки). Так, в приведённом примере, echo-предложения будут на одной строке, так как PHP опускает символы newline после конца блока. Это означает, что необходимо вставить дополнительный newline после каждого блока кода PHP, что заставить РНР выводить новые строки.

Почему PHP этого не делает? Потому что при форматировании нормального HTML это обычно облегчает вам жизнь, поскольку эти newline вам не нужны, а иначе пришлось бы создавать строки огромной длины или как-нибудь иначе делать исходник страницы нечитабельным, чтобы получить нужный эффект.

5. Я получаю сообщение 'Предупреждение!: Cannot send session cookie - headers already sent...' или 'Cannot add header information - headers already sent...'.

Функциям header(), setcookie() и функциям сессии необходимо добавлять шапки/headers в поток вывода. Но шапки могут высылаться только до отправки любого другого содержимого. Проверьте, не высылает ли ваш скрипт шапки уже после высылки содержимого.

6. Мне нужен прямой доступ к информации шапки/header запроса. Как это сделать?

Функция getallheaders() сделает это, если вы запускаете PHP как Apache-модуль. Так, следующий участок кода покажет вам все шапки/headers запроса:

$headers = getallheaders();
foreach ($headers as $name => $content) {
    echo "headers[$name] = $content<br>\n";
}

7. Когда я пытаюсь использовать аутентификацию совместно с IIS, я получаю 'No Input file specified'.

Здесь модель безопасности IIS терпит неудачу. Это проблема, общая для всех CGI-программ, работающих под IIS. Здесь нужно создать обычный HTML-файл (не разбираемый PHP) как страницу для входа в аутентифицируемой директории. Затем используйте тэг META для перенаправления на PHP-страницу или сделайте ссылку на PHP-страницу. Тогда PHP распозн́ает аутентификацию корректно. С модулем ISAPI проблем не возникает. Это не должно влиять на другие NT web-серверы. См. дополнительно http://support.microsoft.com/support/kb/articles/q160/4/22.asp.

8. Мой PHP-скрипт работает на IE под Lynx, но на Netscape часть вывода теряется. Если я выполняю "View Source", я вижу содержимое в IE, но не в Netscape.

Netscape более строг в отношении html-тэгов (таких как table), нежели IE. Может помочь запуск вашего html-вывода через html validator, такой как validator.w3.org. Например, это может происходить из-за отсутствия закрывающего тэга </table>.

Также и IE и Lynx игнорируют любые NUL'и (\0) в потоке HTML, а Netscape - нет. Лучший способ проверить это - скомпилировать версию командной строки PHP (известную также как CGI-версия) и запустить ваш скрипт из командной строки. В *nix - пропустите его через od -c и посмотрите на любые символы \0. Если вы в Windows, необходимо найти редактор или другую программу, которая позволяет просматривать двоичные файлы. Когда Netscape обнаруживает NUL в файле, он обычно ничего больше не выводит на данной строке, а IE и Lynx - выводят.

9. Как мне смешать XML и PHP? Он жалуется на мои тэги <?xml>!

Вам необходимо выключить краткие тэги/short tags, установив short_tags в 0 в файле php.ini, или использовать подходящую директиву Apache. Вы можете использовать и раздел <File>, чтобы делать это селективно.

10. Как работать с PHP во FrontPage или другом HTML-редакторе, который настаивает на удалении моего кода?

Проще всего включить использование ASP-тэгов в вашем коде PHP. Это позволит использовать ограничители кода <% и %> в стиле ASP. Некоторые популярные HTML-реакторы обрабатывают эту ситуацию более интеллигентно (на данный момент). Чтобы включить тэги в стиле ASP, вы должны установить переменную asp_tags в php.ini или использовать подходящую директиву Apache.

11. Где можно найти полный список предустановленных переменных, и почему они не задокументированы в документации PHP?

Лучше всего вставить часть <?php phpinfo(); ?> на страницу и загрузить её. Это  покажет все виды информации о вашей установке PHP, включая список переменных окружения, а также специальные переменные, установленные вашим web-сервером. Этот список действительно не может быть задокументирован в документации PHP, поскольку он будет отличаться для каждого сервера.

12. Я пытаюсь получить доступ к одной из стандартных переменных CGI (таких как $DOCUMENT_ROOT или $HTTP_REFERER) в пользовательской функции, и не могу их найти.
Что не так?

Переменные окружения являются нормальными глобальными переменными, поэтому вы обязаны либо объявлять их как глобальные переменные в вашей функции (используя "global $DOCUMENT_ROOT;", например) или использовать массив глобальных переменных (т.е. "$GLOBALS["DOCUMENT_ROOT"]".