PHP 8.4.1 Released!

Використання PHP

Цей розділ зібрав багато розповсюджених помилок, з якими можна зіткнутися під час написання PHP-скриптів.

  1. Я не пам’ятаю порядок параметрів функцій PHP, він хаотичний?
  2. Я б хотів написати загальний PHP-скрипт для обробки даних, що надходять з форм. Як мені дізнатися, які змінні методу POST доступні?
  3. Мені треба додати перед усіма одинарними лапками (') зворотню косу риску (\). Як це зробити за допомогою регулярного виразу? Мені б також хотілося замінити (") на (\") та (\) на (\\).
  4. Коли я роблю наступне, результат виводиться не за порядком: <?php function myfunc($argument) { echo $argument + 10; } $variable = 10; echo "myfunc($variable) = " . myfunc($variable); ?> що відбувається?
  5. Ей, чому все в одному рядку? <pre> <?php echo "Це має бути перший рядок."; ?> <?php echo "Це має виводитись після символу початку рядка, що є вище."; ?> </pre>
  6. Я отримую повідомлення "Warning: Cannot send session cookie - headers already sent..." або "Cannot add header information - headers already sent...".
  7. Мені потрібен прямий доступ до інформації в заголовку запиту. Як я можу це зробити?
  8. Коли я намагаюся використати автентифікацію за допомогою IIS, я отримую 'No Input file specified'.
  9. Windows: Я не можу отримати доступ до файлів, спільних з іншим комп'ютером, використовуючи IIS.
  10. Як я можу змішувати XML та PHP? Інтерпретатор скаржиться на теги "<?xml"!
  11. Де я можу знайти повний список змінних, які мені доступні в PHP?
  12. Як генерувати файли PDF без платних комерційних бібліотек, таких як PDFLib? Я б хотів щось безкоштовне і що не вимагає зовнішніх бібліотек.
  13. Певні директиви PHP можуть мати скорочене байтове значення, крім, коли воно записується виключно числом. Які скорочення дозволені?
Я не пам’ятаю порядок параметрів функцій PHP, він хаотичний?

PHP — це "клей", який об’єднує сотні зовнішніх бібліотек, тому іноді виглядає безладним. Однак просте правило полягає в наступному:

Параметри функцій для роботи з масивами розміщені у порядку "needle, haystack", натомість у функцій для роботи з рядками навпаки — "haystack, needle".

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

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 це, зазвичай, полегшує вам життя, якщо не потрібно виводити цей символ. Бо інакше доведеться створювати надто довгі рядки, щоб досягнути такого ж ефекту, а це зробить код не придатним для читання.

Я отримую повідомлення "Warning: Cannot send session cookie - headers already sent..." або "Cannot add header information - headers already sent...".

Функції 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, я отримую 'No Input file specified'.

У цьому винна модель безпеки IIS. Це є проблемою усіх CGI-застосунків в IIS. Щоб обійти її, створіть простий файл HTML (що не обробляється PHP), який буде сторінкою входу в теці автентифікації. Потім використайте META-тег для перенаправлення на PHP-сторінку, або посилання. PHP розпізна́є спробу входу коректно. Це не повинно впливати на інші вебсервери NT. Більше інформації за адресою » http://support.microsoft.com/kb/q160422/ та у розділі посібника HTTP-автентифікація.

Windows: Я не можу отримати доступ до файлів, спільних з іншим комп'ютером, використовуючи IIS.

Потрібно внести зміни. Перейдіть в Internet Information Services. Знайдіть свій файл PHP і перейдіть до його властивостей. Далі до вкладки File Security, далі — Edit -< Anonymous access and authentication control.

Ви можете вирішити проблему, знявши галочку Anonymous Access і залишивши галочку Integrated Window Authentication, або поставити галочку Anonymous Access і відредагувати користувача, оскільки він може не мати прав доступу.

Як я можу змішувати XML та PHP? Інтерпретатор скаржиться на теги "<?xml"!

Щоб вставляти <?xml прямо у ваш код PHP, треба вимкнути короткі теги, задавши директиві PHP short_open_tags значення 0. Не дозволяється використовувати для цього функцію ini_set(). Якщо вимкнути short_open_tags, ви зможете робити щось на кшталт: <?php echo '<?xml'; ?>. Початкове значення цієї директиви: On.

Де я можу знайти повний список змінних, які мені доступні в PHP?

Прочитайте сторінку посібника про попередньо визначені змінні, вона містить неповний список попередньо визначених змінних, які доступні вашому скрипту. А повний список (і багато іншої інформації) виводить функція phpinfo(). Обов'язково прочитайте розділ посібника про змінні, що поза PHP, оскільки він описує поширені сценарії зі зовнішніми змінними, як-от з HTML-форми, Cookie та URL.

Як генерувати файли PDF без платних комерційних бібліотек, таких як PDFLib? Я б хотів щось безкоштовне і що не вимагає зовнішніх бібліотек.

Є альтернативи, написані на PHP: » FPDF та » TCPDF.

Певні директиви PHP можуть мати скорочене байтове значення, крім, коли воно записується виключно числом. Які скорочення дозволені?

K (для кілобайтів), M (для мегабайтів) та G (для гігабайтів) незалежно від регістру символу. Все інше — це байти. 1M дорівнює одному мегабайту або 1048576 байтам. 1K дорівнює одному кілобайту або 1024 байтам. Такі скорочення можна використовувати в php.ini та в функції ini_set(). Майте на увазі, що числове значення приводиться до типу int; наприклад 0.5M трактується як 0.

Зауваження: Кілобайти проти кібібайтів

Нотація PHP визначає один кілобайт рівним 1024 байтам, в той час як стандарт IEC вважає це кібібайтом. Підсумок: k та K = 1024 байтів.

add a note

User Contributed Notes 1 note

up
23
robjbrain at gmail dot com
8 years ago
There is no error message given if you accidentally use KB, MB or GB instead of K, M or G. From what I can tell the alphabetic characters will be ignored and it will be treated as bytes, so 1GB actually equals 1 Byte. phpinfo() and ini_get() will report what you have written e.g. 1GB, so it will not be clear that there is anything wrong with your setting even though there is.
To Top