Правильний спосіб зберігання тексту і html-коду в базі mysql - stack overflow російською

Яким чином необхідно обробляти текст і html-код для запису в базу MySQL? Яка схема?

Перерив інтернет, всюди рада для запису в базу використовувати mysql_real_escape_string (), і більше ніби нічого не потрібно. Але як бути зі спец-місволамі html? Наприклад "⇔" при вставці в форму відображається як символ, а не як html-код сиволов. Відповідно при записі в базу, він перетворюється в "?"

Як я розумію необхідно обробляти текст ось так перед вставкою:

Відповідно при виведенні з бази на відображення необхідно обробляти текст ось так:

Такий алгоритм правильний або треба робити якось по-іншому?

Кодування сайту utf8.

Питання дуже просте, але в той же час дуже характерний.

У ньому відмінно зібрані найбільш популярні омани початківців користувачів РНР. Спробуємо в них розібратися.

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

Отже, відповідаючи на поставлені в пості (не зовсім коректні, як ми бачимо), питання:

  • Як зберігати будь-які дані в БД? Дані повинні зберігатися як є.
  • Як обробляти дані для БД? Ніяк. Ні в якому разі ніяк обробляти не можна.
  • Як зберігати HTML? Ніяких особливих дій ні для HTML, ні для будь-яких інших даних проводити не потрібно. Всі дані зберігаються абсолютно однаково.

Використання даних в SQL запитах.

А ось це вже зовсім інше питання. Єдиний, у відповідь на який нам треба буде щось робити. Але при цьому самі дані ми все одно не чіпатимемо. Так Так! Навіть для приміщення в SQL запит ми ніяк дані обробляти не будемо. Справа в тому, що "рада для запису в базу використовувати mysql_real_escape_string ()" - це просто феєрична дурість, на жаль, розтиражована в мільйонах екземплярів.

А єдино правильний спосіб додавання даних в SQL запит - це робити це через плейсхолдери.

Тобто, щоб використовувати будь-які дані в SQL запиті, треба спочатку на їх місці написати знаки питання:

це, до речі, стосується взагалі всіх запитів. SELECT ми пишемо точно так же:

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

тобто, ідея така: якщо нам треба підставити в запит будь-яку змінну, замість неї треба поставити знак питання. А саму змінну передати після.

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

Спец-символи HTML

Я думаю, що уважний читач уже вловив ідею: HTML взагалі ніякого відношення до БД не має. Ніякого. Це абсолютно різні речі. Тобто користувачу РНР ніколи не ввійде в голову ідея використовувати функцію, в якій зустрічається слово "HTML" для будь-якої роботи з БД, а при роботі з HTML - функцію, в якій зустрічається слово "mysql".

Функції для роботи з HTML слід застосовувати для роботи з HTML.

Тобто, якщо ми збираємося виводити HTML текст в HTML, то ми його повинні виводити як є.

Але якщо ми збираємося виводити в HTML текст, який не є HTML, ми повинні відформатувати його так, щоб він нам часом не попсував верстку. Зазвичай для цього використовується функція htmlspecialchars ()

Якщо який-небудь символ зберігається в вигляді знака питання, то це не проблема HTML кодування, а проблема кодування, яка просто не підтримує даний символ. Щоб БД могла зберігати символи типу ⇔. у неї повинна бути кодування utf8. А також РНР скрипт, встановлюючи з'єднання з базою, повинен виставляти кодування цього з'єднання в utf8. При цьому відображаючи користувачеві форму, повинен видавати НТТР заголовку Content-type з кодуванням UTF-8.

І тоді все символи запишуться в цілості й схоронності.