Учебник РНР (перевод Alexandr Pyramidin) Размещено на PHPClub.Net
Назад Вперёд

Глава 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-серверы. См. дополнительно https://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"]".


НазадОглавление Вперёд
Проблемы построения ВверхPHP и HTML