Яким чином необхідно обробляти текст і 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.
І тоді все символи запишуться в цілості й схоронності.