Уроки по PHP: типи змінних, екранування, спецсимволи і синтаксис heredoc в PHP. PHP регулярні вирази екранування - особливості реалізації

Привіт, шановні читачі, сьогодні я б хотів розкрити тему екранування лапок в php, javascript і sql, розповісти що це таке і навіщо потрібно, а також навести кілька корисних прикладів показують необхідність екранування.

Що таке екранування лапок

Щоб дати визначення цьому поняттю, для початку наведу невеликий приклад оголошення рядка.

Практично в будь-якій мові програмування ми використовуємо наступний принцип оголошення строкової змінної:
  var text = "Назва мого блогу компанії life";
  Все, що міститься між лапок - розуміється інтерпретатором як рядок.

Якщо нам потрібно передати в строкову змінну текст містить лапки і ми спробуємо зробити це таким чином:
  var text = "Назва мого блогу:" life "";
  то станеться помилка, оскільки замість одного рядка інтерпретатор побачить дві:

  "Назва мого блогу:"
" "
  а між ними невідомий йому оператор - life.

Щоб такого не відбувалося необхідно екранувати лапки. У javascript, наприклад, це буде виглядати таким чином:
  var text = "Назва мого блогу: \\" life \\ "";
  Після цього практичного прикладу можна дати визначення поняттю екранування лапок.

Екранування лапок - це дія, що здійснюється над строкової змінної в ході роботи скрипта. Дія це дозволяє використовувати лапки в рядку. Приватним але досить поширеним способом екранування є підстановка зворотного слеша \\ перед внутрішніми лапками.

Php екранування лапок

В php екранувати лапки можна кількома способами, перший з них аналогічний розглянутому вище.

  "Як же ваше здоров'я?" - запитала Катерина Іванівна. "Нічого, живемо понемножечку", - відповів Старцев (Чехов)

Щоб вивести її на сторінку, в PHP слід робити одним з таких способів.

Екранування зворотним слешем:
  echo "\\" Як же ваше здоров'я? \\ "- запитала Катерина Іванівна. \\" Нічого, живемо понемножечку \\ ", - відповів Старцев (Чехов)";
Екранування одинарними лапками
  echo "" Як же ваше здоров'я? "- запитала Катерина Іванівна." Нічого, живемо понемножечку ", - відповів Старцев (Чехов)";
У разі, коли внутрішніх лапок в рядку багато простіше при оголошенні рядка використовувати одинарні лапки, а всередині неї подвійні. Або, навпаки, в залежності від наявності в тексті тих чи інших лапок.

Навіщо може знадобитися екранування лапок в PHP

Крім розібраного прикладу з висновком рядків, екранування лапок та інших спец символів часто необхідно при роботі з БД.

Щоб не допустити, різного роду проблем при роботі з базою даних, перед збереженням даних в таблиці можна використовувати функцію addslashes
  $ Str = "Is your name O" reilly? "; // виводить: Is your name O \\" reilly? echo addslashes ($ str);
  або mysql_real_escape_string

  Обидві ці функції є стандартними в php і екранують спецсимволи рядків. Коли і яку використовувати, залежить від конкретних завдань. Наприклад addslashes краще використовувати для серіалізовані рядки при запису її в базу, а mysql_real_escape_string для всіх призначених для користувача даних прийшли з форми на сайті.

У невеликих web-додатках, можна не використовувати ручне екранування addslashes або mysql_real_escape_string якщо включити "Магічні лапки" - magic_quotes_gpc
  if (! get_magic_quotes_gpc ()) (ini_set ( 'magic_quotes_gpc', 'on');)
  Найчастіше магічні лапки включені за замовчуванням на сервері, це можна дізнатися з інформацією отриманою при виконанні функції
  echo phpinfo ();
javascript екранування лапок

Дуже часто, особливо в javascript доводиться працювати з рядками, що містять HTML розмітку.

У javascript екранування лапок відбувається аналогічним чином, або зворотним слешем, або використанням різного типу лапок.
  Приклад зі зворотним слешем:
  var html = "

Блок із зеленим текстом
";
  Приклад з внутрішніми лапками:
  var html = "
Блок із зеленим текстом
";
  Коли рядок з HTML розміткою занадто довга і вимагає розриву рядків, знову з'являється необхідність екранування, в цьому випадку вже не лапок, а символу розриву рядків
  var html = "
\\ Блок із зеленим текстом \\
";
  Якщо в даному прикладі не використовувати зворотний слеш перед перенесенням рядка, то скрипт працювати не буде.

Досить рідко, але можна зіткнутися із завданням передати HTML розмітку в серіалізовані рядку формату JSON. Якщо рядок містить символи перенесення, то формат JSON буде порушений.

Щоб уникнути цих проблем потрібно прогнати текст з перенесенням рядків через функцію JSON.stringify ()
  text = JSON.stringify (text);
  JSON.stringify () - доступна тільки після підключення бібліотеки jquery.

Sql екранування лапок

У sql екранування лапок крім розібраних нами в php і js способів - зворотного слеша і внутрішніх лапок, має ще одне рішення.
  SELECT "Is your name O" "reilly?";
  Для екранування лапки в sql потрібно їх дублювати.

замість "писати" "
замість "писати" "

Прибрати екранування лапок

Прибрати екранування лапок в php можна стандартною функцією stripslashes ();

У javascript не існує аналога stripslashes, але ж ми завжди можемо скористатися регулярним виразом, яке допоможе нам прибрати екранування лапок в javascript
  str.replace (/ \\ 0 / g, "0"). replace (/\\\\(.)/ g, "$ 1")
  У даній статті я постарався розкрити тему екранування лапок в php, js, mysql і показати в яких випадках необхідно застосовувати екранування. Сподіваюся, стаття виявилася корисною.

замітка:   активована адаптивна версія сайту, яка автоматично підлаштовується під невеликий розмір Вашого браузера і приховує деякі деталі сайту для зручності читання. Приємного перегляду!

Радий знову вітати всіх на сторінках блогу присвяченому всім тонкощам успішного створення і просування сайтів - Site   on! У сьогоднішньому уроці по PHP ми торкнемося такі теми як: типи змінних, екранування, спецсимволи, а також синтаксис heredoc   в PHP.

типи змінних

PHP має вісім різних типів змінних, з них

4 скалярних типи:

  • boolean (Логічний або логічний тип)
  • integer (Цілі числа)
  • float (Число з плаваючою точкою)
  • string (Рядок)

2 змішаних типу:

  • array (масив)
  • object (Об'єкт)

2 спеціальних типу:

  • resource

Перш ніж перейти до розгляду кожного з типів більш докладно, варто уточнити, що PHP НЕ строго типізований мову, а мову з динамічною типізацією. Це означає, що нам не потрібно заздалегідь (при створенні) оголошувати тип кожної змінної. PHP сам здогадається, який тип має та чи інша змінна, виходячи з того, що ми в цю змінну покладемо. Це також означає, що на відміну від мов з суворою типізації ми можемо в змінну з числом (integer) взяти і покласти рядок (string) і це не буде помилкою! Це одна з особливостей PHP, Яка дуже подобається людям (новачкам), які раніше не мали справу з програмуванням. Як правило, в результаті все приходять до того, що це мінус мови, а не плюс.

Boolean (логічний)   - найпростіший тип. Може приймати всього 2 значення: true   або false   (Вірно або невірно), вони регістра-незалежні (можна писати TRUE, trUe і тд.). Наочний приклад:

echo $ name, "
", $ Name2;?\u003e

результат:

Як бачите, браузер не розуміє логічний тип, на відміну від PHP, тому при спробі вивести true   або false   він виведе на сторінку число 1   або порожній рядок.

При перетворенні в логічний тип наступні значення розглядаються як FALSE:

  • ціле 0 (нуль)
  • число з плаваючою точкою 0.0 (нуль)
  • порожній рядок і рядок "0" або "0"
  • порожній масив
  • спеціальний тип NULL (включаючи невстановлені змінні)

Всі інші значення розглядаються як TRUE.

// десяткове число   $ Int = -5; // від'ємне число   $ Int = 05; // вісімкове число   $ Int = 0x1A; // шістнадцяткове число
// Числа з плаваючою точкою (речові):   $ Flt = 1.4; $ Flt = 1.2e3; $ Flt = 7E-10; ?\u003e

Однак самим часто застосовуваним типом в PHP можна вважати саме рядки (string). Рядки можна записувати або в одинарних, або в подвійних лапках, але записувати рядки в подвійних лапках я ніколи і нікому не раджу, так як тим самим ви змушуєте інтерпретатор PHP «парсити» вашу рядок на наявність змінних в ній, ніж хоч і незначно, але сповільнюєте роботу. Навіть якщо ви хочете використовувати у вашій рядку змінні - це можна зробити за допомогою одинарних лапок + (склеювання двох і більше рядків в одну). Для чого тоді подвійні лапки   взагалі потрібні? Наприклад, коли ми хочемо використовувати спецсимволи (\\ n, \\ r і тд.), Але про них трохи пізніше.

Також варто відзначити, що використання одинарних лапок + конкатенації   робить код набагато читабельний, ніж якщо все без розбору засовувати в подвійні лапки. Але вистачить передмов, зараз ви самі все побачите і зрозумієте:

$ Number = 2; // integer $ hand1 = "Кількість рук у людини:"; // string + змушуємо парсити на наявність змінних   $ Hand2 = "Кількість рук у людини:"; // string
// додамо в ці рядки змінну $ number:   $ Hand1 = "Кількість рук у людини: $ number і ще текст ..."; // НЕ рекомендую $ hand2 = "Кількість рук у людини:". $ Number. "І ще текст ..."; // рекомендую!
echo $ hand1, "
", $ Hand2;?\u003e

результат:


Детальніше про конкатенації ми поговоримо в наступній статті.

  • їй була присвоєна константа NULL.
  • їй ще не було присвоєно якесь значення.
  • вона була видалена за допомогою unset ()

Вивчення залишилися типів змінних на даному етапі було б безглуздим. З іншими типами ми зіткнемося і розберемо їх при більш глибокому вивченні PHP.

Екранування в PHP

А що якщо ми в нашій рядку не хочемо діставати значення змінної, а хочемо написати буквально $ number? Розглянемо два варіанти:

$ Hand1 = "Кількість рук у людини: \\ $ number і ще текст ..."; // НЕ рекомендую $ hand2 = "Кількість рук у людини: $ number і ще текст ..."; // рекомендую!
echo $ hand1, "
", $ Hand2;?\u003e

результат:


У першому варіанті (з подвійними лапками) ми використовували екранування спецсимволи долара, завдяки чому даний спецсимвол перестав мати своє спеціальне призначення (позначення змінних) і перетворився в звичайний знак долара.

У другому варіанті (з одинарними лапками) як ви вже знаєте - PHP інтерпретатор навіть не намагався знайти змінних в рядку, а тому екранування не було потрібно.

Спецсимволи в PHP

Спеціально для читачів блогу Site   on! я підготував невеликий список спеціальних символів в мові програмування PHP:

  • \\ N новий рядок
  • \\ R повернення каретки
  • \\ T горизонтальна табуляція
  • \\\\ зворотна коса риска (зворотний слеш)
  • \\ $ Знак долара
  • \\ "Лапки

Подивимося на роботу спецсимволов на прикладі \\ n - спецсимвол, який робить переклад на новий рядок (як Ентер), проте браузери не розуміють (і не повинні) його і ігнорують, але результат його роботи можна подивитися в вихідному коді сторінки:

echo $ rule, "
", $ Rule2;?\u003e

результат:


Вихідний код (Ctrl + U):


Якщо для відвідувачів в браузері спецсимвол \\ n ніяк не відображається, тоді в чому його сенс?

По-перше, за допомогою спецсимволов і \\ n зокрема можна зручно форматувати код на сторінці (як в прикладі вище).

По-друге, \\ n можна використовувати, наприклад, при операціях запису в файл, щоб зробити перенесення (Ентер) і продовжити запис на новому рядку.

Альтернативою такого форматування є.

Синтаксис heredoc в PHP

результат:


Вихідний код (Ctrl + U):


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

  • Рядок починається з трьох кутових скобочек<<<, далее следует имя идентификатора.
  • Рядок з відкриває ідентифікатором (міткою) ні в якому разі не повинна містити після нього ніяких інших символів, включаючи пробіл. Тобто іншими словами, відразу після нашої мітки ми повинні поставити Ентер, без пробілу, відразу Ентер!
  • Закриває ідентифікатор повинен починатися з першої позиції рядка. Перед ним не повинно бути пробілів або інших символів!
  • Рядок з закриває ідентифікатором (в нашому випадку слова METKA) не містить інших символів (включаючи пробіл), за винятком крапки з комою.

Дякую за увагу! У наступних статтях ми поговоримо про поняття конкатенації, яке вже не раз звучало сьогодні. Далі обговоримо роботу з рядками, а також я зроблю огляд деяких корисних функцій. Всім гарного дня і до зустрічі!


Для початку - трохи про те, чому взагалі потрібні ці слеші.
Якщо ми підставляємо в запит будь-які дані, то, щоб відрізнити ці дані від команд SQL, їх треба брати в лапки.
Наприклад, якщо написати
SELECT * FROM table WHERE name = Bill
то база вирішить, що Bill - це ім'я іншого поля, не знайде його, і видасть помилку. Тому що підставляються дані (в даному випадку ім'я Bill) треба брати в лапки - тоді база вважатиме його рядком, значення якої треба привласнити полю name:
SELECT * FROM table WHERE name = "Bill"
Однак, і в самих даних можуть зустрічатися лапки теж. Наприклад,
SELECT * FROM table WHERE name = "Д" Артаньян "
Тут база даних вирішить, що "Д" - це дані, а Артаньян - команда, яку вона не знає, і теж видасть помилку. Тому і треба прослешівать всі дані, щоб пояснити базі, що зустрічаються в них лапки (і деякі інші спецсимволи) відносяться до даних.
В результаті ми отримаємо правильний запит, який помилок не викличе:
SELECT * FROM table WHERE name = "Д \\" Артаньян "

Таким чином, ми з'ясували, що при підстановці даних в запит, слід дотримуватися двох правил:
- все що вставляються в запит дані повинні бути укладені в лапки (одинарні або подвійні, але зручніше і частіше використовуються одинарні).
- у всіх строкових змінних повинні бути екрановані Слеш спецсимволи.

Слід спеціально зазначити: додані слеші НЕ йдуть в базу. Вони потрібні тільки в запиті. При попаданні в базу слеші відкидаються. Відповідно, поширеною помилкою є застосування stripslashes при отриманні даних з бази.

Насправді, все вищесказане відноситься до даних строкового типу і датам. Числа можна вставляти НЕ прослешівая і не окружaя лапками. Якщо ви так робите, то ОБОВ'ЯЗКОВО!   насильно приводите дані до потрібного типу, перш ніж вставити в запит, наприклад:
$ Id = intval ($ id);
Однак для простоти (і надійності) можна і з числами працювати, як з рядками (проскольку mysql все одно перетворює їх до потрібного типу). Відповідно, ми будемо будь-які дані, що вставляються в запит, прослешівать і брати в лапки.

Так само, є ще одне правило - необов'язкове, але його слід дотримуватися, щоб уникнути появи помилок:
Імена полів і таблиць слід укладати в зворотні одинарні лапки - "` "(клавіша з цим символом знаходиться на стандартній клавіатурі зліва від клавіші" 1 ") Адже ім'я поля може збігатися з ключовими словами mysql, але якщо ми використовуємо зворотний лапки, то MySQL зрозуміє все правильно:
SELECT * FROM `table` WHERE` date` = "2006-04-04"
Слід розрізняти ці лапки і не плутати одні з іншими. Слід також пам'ятати, що зворотні лапки Слеш НЕ екрануються.

Отже, ми навчилися правильно підставляти в запит дані.
АЛЕ! Динамічне складання запитів не вичерпується підстановкою даних. Часто нам доводиться підставляти в запит команди SQL і імена полів. І тут ми вже переходимо до теми безпеки:

SQL Injection - це спосіб хакерської атаки, коли передаються скрипту дані модифікуються таким чином, що запит, що формується в цьому скрипті, починає виконувати зовсім не те, для чого він призначався.
Правила захисту від таких атак можна розділити на два пункти:
1. Робота з даними.
2. Робота з керуючими елементами запиту.

Перший пункт ми докладно розглядали вище. Він, можна сказати, і не є, власне, захистом. Дотримання правил додавання занних в запит продиктовано, в першу чергу, вимогами синтаксису SQL. А як побічний ефект ми маємо і захист від злому.

Другий пункт набагато складніше, оскільки не існує такого ж єдиного універсального правила, як для даних - зворотна лапки ніяк не захистить ім'я поля від модифікації хакером. Неможливо лапками захистити ім'я таблиці, оператори SQL, параметри команди LIMIT, і інші оператори.
Тому основне правило при підстановці керуючих елементів в запит таке:
Якщо потрібно динамічно підставляти в запит оператори SQL або імена полів, баз даних, таблиць, то ні в якому разі не вставляти їх в запит безпосередньо.
Всі варіанти таких додавань повинні бути ЗАРАНЕЕ прописані в вашому скрипті і вибиратися на підставі того, що ввів користувач.
Наприклад, якщо треба передати ім'я поля в оператор order by, то ні в якому разі не можна підставляти його безпосередньо. Треба спочатку перевірити його. Наприклад, зробити масив допустимих значень, і підставляти в запит тільки якщо переданий параметр в цьому масиві присутній:
$ Orders = array ( "name", "price", "qty");
$ Key = array_search ($ _GET [ "sort"], $ orders));
$ Orderby = $ orders [$ key];
$ Query = "SELECT * FROM` table` ORDER BY $ orderby ";
  Ми шукаємо в масиві заздалегідь описаних варіантів введене користувачем слово, і, якщо знаходимо, то вибираємо відповідний елемент масиву. Якщо збіги не буде знайдено, то буде обраний перший елемент масиву.
Таким чином, в запит підставляється не те, що ввів користувач, а то, що було прописано у нас в скрипті.
Точно так же треба чинити і у всіх інших випадках
Наприклад, якщо динамічно формується оператор WHERE:
if (! empty ($ _ GET [ "price"])) $ where. = "price =" ". mysql_real_escape_string ($ _GET [" price "])." "";
$ Query = "SELECT * FROM` table` WHERE $ where ";
  Мені складно уявити собі випадок, коли ім'я таблиці може підставлятися в запит динамічно, але якщо таке трапиться, то ім'я теж треба вставляти тільки з заздалегідь прописаного в скрипті набору.
Параметри оператора LIMIT слід примусово приводити до целочисленному типу за допомогою арифметичних операцій або функції intval ().
Не слід думати, що перерахованими тут прикладами вичерпуються всі варіанти динамічного складання запитів. Потрібно просто зрозуміти принцип, і застосовувати його у всіх подібних випадках.

Особливості роботи з оператором LIKE
Абсолютно окремий випадок - оператор LIKE.
По-перше, крім звичайного прослешіванія, в змінних, які підставляються в LIKE, треба подвоювати слеші. Тобто, якщо у змінній міститься символ \\, то його треба подвоїти, а після цього виконати звичайне прослешіваніе, через mysql_real_escape_string.
Наприклад, якщо ми шукаємо рядок
  символ \\ називається "backslash" і нам потрібно точний збіг, то ми просто застосовуємо mysql_real_escape_string і запит виходить стандартний:
SELECT * FROM test WHERE field = "символ \\\\ називається \\" backslash \\ ""   Якщо ж ми хочемо підставити цей рядок в LIKE, то спочатку треба замінити кожен слеш на два, а потім застосувати mysql_real_escape_string. В результаті вийде
  SELECT * FROM table WHERE field LIKE "% символ \\\\\\\\ називається \\" backslash \\ "%"
По-друге, слід звернути увагу на те, що жодна з функцій, що додають слеші, що не додає їх до метасимволів пошуку "%" і "_", використовуваним в операторі LIKE. Тому, якщо ви використовуєте цей оператор, і не хочете, щоб символи _ і% використовувалися, як маски, то додавайте слеші вручну. Це можна зробити командою
$ Data = addCslashes ($ data, "% _"); Увага - це не addslashes! В імені цієї функції є додаткова буква "c".

Таким чином виходить, що змінні, використовувані в операторі LIKE ми повинні обробляти окремо.
спочатку замінювати один слеш на два, за допомогою такого, наприклад, коду:
$ Var = str_replace ( "\\\\", "\\\\\\\\", $ var); потім (можна нарівні з усіма іншими даними, що йдуть в запит) прослешіваем:
$ Var = mysql_real_escape_string ($ var);   а потім, якщо хочемо, щоб _ і% відповідали точно самим собі, робимо
$ Var = addCslashes ($ var, "_%");
В результаті, якщо ми будемо шукати, наприклад, такий рядок
символ \\ називається "backslash", а символ _ називається "underscore"   то після обробки, в запиті вона повинна виглядати так:
"% Символ \\\\\\\\ називається \\" backslash \\ ", а символ \\ _ називається \\" underscore \\ "   Тобто, слеш, який був в рядку спочатку - почетверити. Решта символів прослешілісь, як зазвичай. Плюс - прослешілся символ підкреслення.

Про Слеш. Як від них позбутися
Слеш, або бекслеш, від англійського back slash - зворотна коса риска ( "\\"), яка незрозумілим чином раптом сама собою з'являється в ваших змінних. Додається він до деяких спецсимволи, але в основному його помічають через лапок.
Відбувається це через спеціальних налаштувань PHP, зазвичай включених на хостингу за замовчуванням. Теоретично, ці установки можуть підвищити безпеку скриптів, работаюющіх з БД. Практично ж, від автоматичного додавання слешів часто виходить плутанина і незручність, як при роботі з БД, так і при її відсутності.
Нижче ми докладно розберемо обидва ці випадки.

За автоматичне додавання слешів відповідають директиви php.ini, які носять загальну назву "чарівні лапки":
magic_quotes_gpc і magic_quotes_runtime Якщо включена перша, то PHP автоматично додає слеші до даних, які прийшли від користувача - з POST, GET запитів і кук (а так само - до логіну та паролю, отриманим через HTTP Authorisation).
Якщо друга, то слеші додаються до даних, отриманим під час виконання скрипта - наприклад, з файлу або бази даних.

Якщо ви працюєте без бази даних, або ж працюєте з БД правильно (про що буде написано нижче), зайві слеші вам тільки заважають, і від них треба позбавлятися. Простіше і правильніше за все відключити автоматичне додавання, в настройках PHP.
Це можна зробити або поправивши відповідні директиви в php.ini, якщо у вас є до нього доступ, або створивши в Конєва каталозі сайту файл .htaccess, і додавши в нього рядки
php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0

Якщо відключити таким чином не виходить, то доведеться писати код різного ступеня складності, щоб очистити від слешів вхідні дані. (Втім, якщо ви хочете написати переносний додаток, яке не залежить від налаштувань PHP, то написати його все одно доведеться. І включати окремим блоком на початку ваших скриптів).

З даними, одержуваними під час роботи, розібратися найпростіше: досить на початку скрипта написати
set_magic_quotes_runtime (0); Для даних, отриманих від користувача, все набагато складніше. Для цього коду нам потрібно дві функції:

  • перевірити, додав чи PHP, можна за допомогою функції get_magic_quotes_gpc.
  • видаляє слеші функція stripslashes.
    Відповідно, за допомогою першої треба перевірити, і, якщо PHP додав, то перебрати всі вхідні змінні і очистити за допомогою другої.
    Якщо ви працюєте правильно, при register_globals = off, то досить застосувати stripslashes до всіх масивів, що містить дані, що приходять з браузера.
    наприклад, можна включити в усі скрипти сайту ось такий код:
    function strips (& $ el) (
      if (is_array ($ el))
      foreach ($ el as $ k =\u003e $ v)
    strips ($ el [$ k]);
      else $ el = stripslashes ($ el);
    }
    if (get_magic_quotes_gpc ()) (
    strips ($ _GET);
    strips ($ _POST);
    strips ($ _COOKIE);
    strips ($ _REQUEST);
      if (isset ($ _ SERVER [ "PHP_AUTH_USER"])) strips ($ _SERVER [ "PHP_AUTH_USER"]);
      if (isset ($ _ SERVER [ "PHP_AUTH_PW"])) strips ($ _SERVER [ "PHP_AUTH_PW"]);
    }
      У разі ж неправильні налаштування register_globals прийнятне рішення і зовсім буде знайти важко, тому краще - повторюся - відразу працювати при правильних налаштуваннях.

    зауваження

    • Серед причин, за якими не варто покладатися на "чарівні лапки", є ще одна. Вельми малоймовірна, але все ж. До "чарівним лапок" відноситься насправді не дві директиви, а три. Третя - magic_quotes_sybase. Мало того, що вона замість слеша додає лапки - так вона ще й скасовує дію magic_quotes_gpc. Якщо якимось дивом обидві ці директиви мають статус "on", то остання не спрацює!   Тобто, покладаючись на "чарівні лапки", ми в цьому випадку отримаємо всі принади неправильно складених запитів. Взагалі, чисто теоретично, треба враховувати наявність цієї директиви, оскільки вона підносить ще й такий сюрприз, як ... зміна поведінки функцій addslashes і stripslashes! Якщо magic_quotes_sybase = on, то ці функції починають замість слеша додавати і видаляти одинарні лапки відповідно.
    • Всі наведені приклади стосуються тільки БД Mysql. Конкретні правила складання запитів можуть відрізнятися для інших СУБД, але загальний принцип залишається тим самим:
      • якщо API для роботи з БД або стороння бібліотека надає спеціальні функції для складання запитів, І є можливість їх використання, то користуватися в першу чергу треба ними.
      • якщо таких функцій немає, то слід шукати в документації функції екранування спецсимволов для цієї СУБД.
    Примітка: форми
    При виведенні value в тегах input форм, слеші не допомагають.
    Щоб текст в такому полі виводився цілком, value треба брати в лапки, А до виведеним даним застосовувати функцію htmlspecialchars ()
    приклад:

    Необхідно так само відзначити (хоч це вже зовсім не має відношення до лапок і Слеш), що функцію htmlspecialchars слід застосовувати при виведенні в браузер взагалі до всіх даних, які отримані від неперевіреного користувача. Чому це слід робити, можна почитати в гуглі за запитом що таке XSS уразливість
    by phpfaq.ru
  • Щоб дати визначення цьому поняттю, для початку наведу невеликий приклад оголошення рядка. Практично в будь-якій мові програмування ми використовуємо наступний принцип оголошення строкової змінної:

    Var text = "Назва мого блогу компанії - Назва";

    Все, що міститься між лапок - розуміється інтерпретатором як рядок.
      Якщо нам потрібно передати в строкову змінну текст містить лапки і ми спробуємо зробити це таким чином:

    Var text = "Назва мого блогу:" Назва "";

    то станеться помилка, оскільки замість одного рядка інтерпретатор побачить дві:

       "Назва мого блогу:" "" а між ними невідомий йому оператор - Назва.

    Щоб такого не відбувалося необхідно екранувати лапки. У javascript, наприклад, це буде виглядати таким чином:

    Var text = "Назва мого блогу: \\" Назва \\ "";

    Після цього практичного прикладу можна дати визначення поняттю екранування лапок.

    екранування лапок- це дія, що здійснюється над строкової змінної в ході роботи скрипта. Дія це дозволяє використовувати лапки в рядку. Приватним але досить поширеним способом екранування є підстановка зворотного слеша \\ перед внутрішніми лапками.

    Php екранування лапок

    В php екранувати лапки можна кількома способами, перший з них аналогічний розглянутому вище.
      Наприклад, ми маємо рядок з авторської і прямою мовою, яка містить лапки:

       "Як же ваше здоров'я?" - запитала Катерина Іванівна. "Нічого, живемо понемножечку", - відповів Старцев (Чехов)

    Щоб вивести її на сторінку, в PHP слід робити одним з таких способів.

    Екранування зворотним слешем:

       echo "\\" Як же ваше здоров'я? \\ "- запитала Катерина Іванівна. \\" Нічого, живемо понемножечку \\ ", - відповів Старцев (Чехов)";

    Екранування одинарними лапками

       echo "" Як же ваше здоров'я? "- запитала Катерина Іванівна." Нічого, живемо понемножечку ", - відповів Старцев (Чехов)";

    У разі, коли внутрішніх лапок в рядку багато простіше при оголошенні рядка використовувати одинарні лапки, а всередині неї подвійні. Або, навпаки, в залежності від наявності в тексті тих чи інших лапок.

    Навіщо може знадобитися екранування лапок в PHP

    Крім розібраного прикладу з висновком рядків, екранування лапок та інших спец символів часто необхідно при роботі з БД.
    Щоб не допустити, різного роду проблем при роботі з базою даних, перед збереженням даних в таблиці можна використовувати функцію addslashes

       $ Str = "Is your name O" reilly? "; // виводить: Is your name O \\" reilly? echo addslashes ($ str); або mysql_real_escape_string

    Обидві ці функції є стандартними в php і екранують спецсимволи рядків. Коли і яку використовувати, залежить від конкретних завдань. Наприклад addslashes краще використовувати для серіалізовані рядки при запису її в базу, а mysql_real_escape_string для всіх призначених для користувача даних прийшли з форми на сайті.
      У невеликих web-додатках, можна не використовувати ручне екранування addslashes або mysql_real_escape_string якщо включити "Магічні лапки" - magic_quotes_gpc

    If (! Get_magic_quotes_gpc ()) (ini_set ( 'magic_quotes_gpc', 'on');)

    Найчастіше магічні лапки включені за замовчуванням на сервері, це можна дізнатися з інформацією отриманою при виконанні функції

    Echo phpinfo ();

    javascript екранування лапок

    Дуже часто, особливо в javascript доводиться працювати з рядками, що містять HTML розмітку.
      У javascript екранування лапок відбувається аналогічним чином, або зворотним слешем, або використанням різного типу лапок.

    Приклад зі зворотним слешем:

       var html = "
    Блок із зеленим текстом
    ";

    Приклад з внутрішніми лапками:

       var html = "
    Блок із зеленим текстом
    ";

    Коли рядок з HTML розміткою занадто довга і вимагає розриву рядків, знову з'являється необхідність екранування, в цьому випадку вже не лапок, а символу розриву рядків

    Var html = "

    \\ Блок із зеленим текстом \\
    ";

    Якщо в даному прикладі не використовувати зворотний слеш перед перенесенням рядка, то скрипт працювати не буде.
      Досить рідко, але можна зіткнутися із завданням передати HTML розмітку в серіалізовані рядку формату JSON. Якщо рядок містить символи перенесення, то формат JSON буде порушений.
      Щоб уникнути цих проблем потрібно прогнати текст з перенесенням рядків через функцію

    JSON.stringify () text = JSON.stringify (text);

    JSON.stringify () - доступна тільки після підключення бібліотеки jquery.

    Sql екранування лапок

    У sql екранування лапок крім розібраних нами в php і js способів - зворотного слеша і внутрішніх лапок, має ще одне рішення.

    SELECT "Is your name O" "reilly?";

    Для екранування лапки в sql потрібно їх дублювати.
      замість "писати" "
      замість "писати" "

    Прибрати екранування лапок

    Прибрати екранування лапок в php можна стандартною функцією stripslashes ();
      У javascript не існує аналога stripslashes, але ж ми завжди можемо скористатися регулярним виразом, яке допоможе нам прибрати екранування лапок в javascript

    Str.replace (/ \\ 0 / g, "0"). Replace (/\\\\(.)/ g, "$ 1")

    У даній статті я постаралася розкрити тему екранування лапок в php, js, mysql і показати в яких випадках необхідно застосовувати екранування. Сподіваюся, стаття виявилася корисною.

    У цій короткій статті показано, як і де варто використовувати лапки в PHP.

    Одинарні лапки (апострофи) в PHP

    Рядки, укладені в одинарні лапки, ніяк не обробляються PHP. Тобто одинарні лапки представляють текст, укладений між ними, як є.

       // Правильно echo "Як життя?"; echo "Як життя? $ name"; echo "Як життя?". $ name; // Неправильно echo "Як життя? $ Name";

    Спеціальні символи в одинарних і подвійних лапках

    Щоб, наприклад, символ табуляції (\\ t) інтерпретувався як символ табуляції, а не як слеш і буква t, необхідно укладати рядок з текстом, в якій міститься символ табуляції, в подвійні лапки. В одинарних лапках   можна використовувати тільки \\ 'і \\\\. Всі інші екранують послідовності (\\ n, \\ r, \\ $ і т.д.) неприпустимо використовувати в одинарних лапках.

       // Неправильно echo "Як життя? \\ N"; // Правильно echo "Як життя? \\ N";

    Щоб екранувати подвійні лапки всередині рядка, поставте лапки перед зворотним слешем \\ ".

       // Неправильно echo "

      Як життя?

    "; // Правильно echo"

      Як життя?

    "; Echo"

      Як життя?

    ";

    Подвійні лапки в PHP

    Текст, укладений в подвійні лапки, обробляється зовсім по-іншому. Наприклад, змінні, укладені в подвійні лапки, замінюються на їх значення. Це робить зручним складати SQL запити за допомогою подвійних лапок.

       $ Query = "INSERT INTO table (post, author, text, date) VALUES (" $ id "," $ author "," $ text "," $ date ")";