Цей розділ зібрав багато розповсюджених помилок, з якими можна зіткнутися під час написання PHP-скриптів.
PHP — це "клей", який об’єднує сотні зовнішніх бібліотек, тому іноді виглядає безладним. Однак просте правило полягає в наступному:
Параметри функцій для роботи з масивами розміщені у порядку "needle, haystack", натомість у функцій для роботи з рядками навпаки — "haystack, needle".
PHP пропонує багато попередньо визначених змінних, наприклад суперглобальну $_POST. Ви можете застосувати цикл до $_POST, оскільки це асоціативний масив усіх значень POSTу. Нехай просто пройдемося по ньому за допомогою foreach, перевіримо наявність порожніх() значень, та виведемо їх на екран.
<?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;
}
?>
Схоже, це для бази даних, але в ній вже існує механізм екранування символів, тож використовуйте його. Для MySQL — це mysql_real_escape_string(), а для PostgreSQL — pg_escape_string(). Також є загальні функції addslashes() і stripslashes(), які частіше зустрічаються у старому коді PHP.
<?php
function myfunc($argument)
{
echo $argument + 10;
}
$variable = 10;
echo "myfunc($variable) = " . myfunc($variable);
?>
Щоб могти використовувати результат вашої функції у виразі (наприклад приєднати його до іншого рядка, як показано вище), вам необхідно повернути() значення, а не виводити його на екран конструкцією echo.
<pre>
<?php echo "Це має бути перший рядок."; ?>
<?php echo "Це має виводитись після символу початку рядка, що є вище."; ?>
</pre>
У PHP закінченням блоку коду є як "?>", так і "?>\n" (де \n означає початок нового рядка). Тож у прикладі вище виведені речення будуть на одній лінії, бо PHP опускає символ початку рядка. З цього випливає, що вам необхідно вставити ще один символ нового рядка після кожного блоку коду PHP, щоб виводився один новий рядок.
Чому PHP робить це? Бо під час форматування простого HTML це, зазвичай, полегшує вам життя, якщо не потрібно виводити цей символ. Бо інакше доведеться створювати надто довгі рядки, щоб досягнути такого ж ефекту, а це зробить код не придатним для читання.
Функції header(), setcookie(), та функції для роботи з сесіями надсилають заголовки до потоку виводу, проте заголовки можна надіслати тільки перед всім іншим вмістом. Тобто не можна нічого виводити перед використанням цих функцій, наприклад код HTML. Функція headers_sent() може перевірити, чи ваш скрипт надіслав заголовки. Докладніше: Функції контролю виводу.
Це робить функція getallheaders() за умови запуску PHP як модуля Apache. Тоді наступний коротенький код покаже всі заголовки запиту:
<?php
$headers = getallheaders();
foreach ($headers as $name => $content) {
echo "headers[$name] = $content<br />\n";
}
?>
Перегляньте також apache_lookup_uri(), apache_response_headers() та fsockopen()
У цьому винна модель безпеки IIS. Це є проблемою усіх CGI-застосунків в IIS. Щоб обійти її, створіть простий файл HTML (що не обробляється PHP), який буде сторінкою входу в теці автентифікації. Потім використайте META-тег для перенаправлення на PHP-сторінку, або посилання. PHP розпізна́є спробу входу коректно. Це не повинно впливати на інші вебсервери NT. Більше інформації за адресою » http://support.microsoft.com/kb/q160422/ та у розділі посібника HTTP-автентифікація.
Потрібно внести зміни. Перейдіть в
Internet Information Services
. Знайдіть свій файл PHP
і перейдіть до його властивостей. Далі до вкладки
File Security
, далі — Edit -<
Anonymous access and authentication control
.
Ви можете вирішити проблему, знявши галочку Anonymous
Access
і залишивши галочку Integrated Window
Authentication
, або поставити галочку Anonymous
Access
і відредагувати користувача, оскільки він може не мати
прав доступу.
Щоб вставляти <?xml прямо у ваш код PHP, треба вимкнути короткі теги,
задавши директиві PHP
short_open_tags значення
0
. Не дозволяється використовувати для цього функцію
ini_set(). Якщо вимкнути
short_open_tags, ви зможете
робити щось на кшталт: <?php echo '<?xml'; ?>
.
Початкове значення цієї директиви: On
.
Прочитайте сторінку посібника про попередньо визначені змінні, вона містить неповний список попередньо визначених змінних, які доступні вашому скрипту. А повний список (і багато іншої інформації) виводить функція phpinfo(). Обов'язково прочитайте розділ посібника про змінні, що поза PHP, оскільки він описує поширені сценарії зі зовнішніми змінними, як-от з HTML-форми, Cookie та URL.
K (для кілобайтів), M (для мегабайтів) та G (для гігабайтів) незалежно від
регістру символу. Все інше — це байти. 1M
дорівнює
одному мегабайту або 1048576
байтам.
1K
дорівнює одному кілобайту або
1024
байтам. Такі скорочення можна використовувати в
php.ini та в функції ini_set().
Майте на увазі, що числове значення приводиться до типу int;
наприклад 0.5M
трактується як 0
.
Зауваження: Кілобайти проти кібібайтів
Нотація PHP визначає один кілобайт рівним 1024 байтам, в той час як стандарт IEC вважає це кібібайтом. Підсумок: k та K = 1024 байтів.