Php ще раз про лапки, видалення пробілів і константи php_ini_

PHP: ще раз про лапки, видалення пробілів і константи PHP_INI_ *

Типова задача виключення з введення користувача зайвих прогалин і / або тегів вирішується практично в кожному професійному скрипті на PHP.

Видалити теги легко стандартною функцією strip_tags. а ось щоб видалити всі зайві пробіли (в тому числі, між словами), нам недостатньо стандартної trim. як мінімум, потрібно використовувати регулярний вираз:

(Або альтернативне вираз, як ось тут).

Невирішеною залишиться тільки проблема з лапками. На жаль, при настройках PHP за замовчуванням (в тому числі, і в поточній версії 5.3.1), лапки з рядків, переданих методом POST або GET після введення користувача, при виведенні їх на екран можуть "екрануватися", тобто, символ "в коді перетвориться в # 92; ":

Введення "слово1" дасть на виході # 92; "слово1 # 92;". За настройки лапок в PHP 4-5 версій відповідають аж 3 змінних, в майбутньої 6 версії їх обіцяють прибрати.

magic_quotes_gpc - якщо директива включена, всі символи '. ". \ І NUL (байт з нульовим кодом) будуть автоматично екрануватися бекслешем \. З версії 5.3.0 опція оголошена застарілою, буде виключена в PHP 6.0.0. Чи не змінюється програмно у версіях старше 4.2.3. За замовчуванням включена, саме ця настройка "винна" в тому, що у нас сталося зі словом.

magic_quotes_runtime - якщо включена, то більшість функцій, які повертають дані з бази або текстових файлів, повертатимуть заекранувати тими ж бекслешамі подвійні і одинарні лапки. Але це ще не все! Якщо додатково включена директива magic_quotes_sybase. то екрануються тільки одинарні лапки, причому не зворотним слешем, а такий же одинарною лапкою! На щастя, цієї директиви можна управляти програмно, за замовчуванням вона виключена, в версії 5.3.0 оголошена застарілою, а в 6.0.0 буде скасована.

magic_quotes_sybase - як уже сказано, якщо ця опція включена, то змінюється правило екранування одинарної лапки, вона записується з додатковою одинарною лапкою замість зворотної косої межі, якщо magic_quotes_gpc або magic_quotes_runtime дозволені. Директивою можна управляти програмно, за замовчуванням вимкнена. Ніде не написано, що вона оголошена застарілою, але в PHP 6.0.0 директива також повинна бути скасована.

Як від усього цього не зійти з розуму і забезпечити коректну обробку лапок?

Я не раз вже приводив код функції magic. яка розбирається з цією проблемою, останнім часом вона стала ось такий:

Тобто, 2 директиви, які можна поставити програмно, так і ставляться (з видаленням контролю помилок оператором "@" - для майбутніх версій), третя директива перевіряється і при необхідності обробляються "зайві" бекслеші. Останнє виконується стандартною функцією stripslashes. хоча можна було б і "ручними" замінами, як я робив раніше:

Функцію get_magic_quotes_gpc також можна б було не викликати, обмежившись стандартної ini_get:

P.S. При такому підході функція stripslashes видалить поєднання символів # 92; "навіть там, де вона потрібна, наприклад, в цьому реченні. Як бути? Я просто в таких випадках заміняю символ" # 92; "Його HTML-кодом # 92;

Іноді доводиться вирішувати зворотну задачу - екранувати "небезпечні" символи зворотними Слеш. Додати бекслеші при вимкненому налаштування magic_quotes_gpc можна стандартною функцією addslashes. А ось якщо magic_quotes_gpc включена, робити addslashes не потрібно - вийде подвійне екранування. адже тоді функція addslashes і так автоматично застосовується до всіх даних GET. POST. і COOKIE.

Тепер повний код прикладу, що видаляє з введення теги, всі зайві пробіли між лексемами, що не залежить від налаштувань лапок і повертає лапки в форму, став таким:

(В прикладі не вистачає відкривають і закривають тегів HTML). Як бачите, перед тим як видати в тезі

текст в якості значення поля введення (За стандартом HTML тут потрібен синтаксис value = "значення в подвійних лапках"), ми замінили "критичні" для PHP символи <.>. ". 'І на відповідні "HTML-суті". lt ;. gt; і т.д. Зробила це стандартна функція htmlspecialchars. Взагалі кажучи, так потрібно робити завжди, незалежно від налаштувань лапок.

Заодно відзначимо ще один важливий прийом, про який початківці теж часто забувають. Перед використанням будь-якого рядка в коді формованого скриптом SQL-запиту не забудьте після з'єднання з базою застосувати до цієї рядку функцію mysql_real_escape_string - в статті стандартної довідки по цій функції все дуже добре розписано, навіщо і чому :)

Нарешті, дізнатися про те, які директиви файлу php.ini якими способами можна змінювати, легко з так званих "констант PHP_INI_ *", в довідці поруч із кожною директивою в стовпці Changeable написано одне з 4 значень:

Визначення констант PHP_INI_ *

PHP_INI_USER - директива може бути встановлена ​​в призначених для користувача скриптах методом ini_set або в реєстрі Windows;

PHP_INI_PERDIR - директива може бути встановлена ​​в файлі php.ini. htaccess або httpd.conf;

PHP_INI_SYSTEM - директива може бути встановлена ​​в файлі php.ini або httpd.conf;

PHP_INI_ALL - директива може бути встановлена ​​де завгодно.