Каковы правильные кодировки / экранирование / htmlentities, необходимые при отправке данных из js в php, php в mysql и для ответов REST json

Это то, с чем я часто сталкиваюсь, и обычно я возвращаюсь к методу try и try again, пока данные не будут работать. Я понял, что SO будет знать, что лучше всего подходит для поддержания данных и не испортить json.

Предположим, что данные, которые я хочу отправить, – это текстовые данные наиболее раздражающего вида – специальные символы, &, <, ", \ n, \ n \ r, \ t, + и т. Д.

Предположим также, что я хочу сохранить все в utf8, а моя таблица mysql настроена на utf8. Однако, поскольку поддержка utf8 PHP отсутствует, это следует учитывать.

Какую кодировку / экранирование / htmlentities следует делать из:

1) Отправка данных JSON от клиента JS на PHP через AJAX POST (что-то другое для GET?)

2) Декодирование данных в PHP и сохранение текстовой строки в базе данных mysql (или сохранение экранированных / закодированных данных?)

3) Получение данных из базы данных MySQL в PHP и возвращение в виде ответа JSON на запрос JS AJAX

4) В ответе JSON от нашего REST api

Всякий раз, когда я использую php / mysql / jquery для передачи данных взад и вперед, я в конечном итоге использую следующую комбинацию кодировок / экранов, и, похоже, она работает хорошо для меня.

1) вам здесь ничего не нужно делать, ЕСЛИ вы отправляете URL-адрес (я думаю, что это только для запросов GET), но если вы отправляете URL-адрес, вам нужно использовать encodeURIComponent (url), который будет правильно удаляться & & и специальные символы в URL-адресе (см. подробнее здесь ).

2) Используйте mysqli и связанные параметры, он сделает все возможное для вас (читайте об этом здесь )

3) Я всегда использую это при повторении данных в файл HTML:

<?php htmlspecialchars($string_to_escape, ENT_QUOTES, 'UTF-8', false); ?> 

Это будет правильно кодировать все специальные символы (false для «без двойной кодировки»). Также убедитесь, что у вас есть соответствующие метатеги UTF-8 в верхней части ваших html-страниц.

4) Использование json_encode должно всегда корректно удалять ваши данные, но я бы использовал код из # 3, чтобы убедиться. Но вам, вероятно, понадобится только это, если вы возвращаете данные со специальными символами.

  1. для отправки json-данных на php вам не нужно делать ничего особенного. JSON – это просто сериализованная переменная javascript,
  2. используйте подготовленные заявления! не пытайтесь декодировать / стирать / изменять содержимое с помощью php
  3. используйте соответствующие функции для удаления данных для json (я не знаю, есть ли встроенная функция php для этого)
  4. так же, как 3.