PHP не экранируется при использовании json_encode - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть форма HTML с текстовыми полями, которую я пытаюсь отправить в BLOB-объект MySQL в виде данных JSON, чтобы получить их обратно в массив PHP (для повторного заполнения полей et c.) Однако строка JSON, похоже, игнорирует значение по умолчанию экранирования «недопустимых» символов. Когда он пытается декодировать JSON, массив становится пустым. Мой код:

if ($_POST) {
$_POST = json_encode($_POST);

$query = "REPLACE INTO `$form` (`jsonresults`) VALUES ('$_POST') ";
$stm = $pdo->prepare("$query");
$stm->execute();

Затем массив расшифровывается с помощью:

$dbresults = json_decode($dbresults['jsonresults'], true);

Это прекрасно работает с текстом, который не имеет специальных символов, но при добавлении «или» и т. Д. c. вызывает ошибку. При просмотре базы данных JSON, по-видимому, не экранировал какие-либо специальные символы, хотя, по-видимому, он должен делать это по умолчанию (если только не используется JSON_UNESCAPED_SLASHES, а я нет).

Я также попробовал следующее (конечно, отдельно):

$_POST = json_encode(array_map('utf8_encode', $_POST));
$_POST = htmlspecialchars(json_encode($_POST), ENT_QUOTES, 'UTF-8');
$_POST = serialize($_POST);

все с похожими проблемами. Как только массив "декодируется", специальные символы разбивают его и заставляют его быть пустым или Неправильно.

Кто-нибудь может подсказать, почему это не работает, или как лучше всего хранить и извлекать массив PHP в базе данных MySQL (без использования отдельных полей БД для каждого ввода текста, У меня есть сотни на этой странице).

1 Ответ

2 голосов
/ 21 апреля 2020

Косые черты, добавленные json_encode, экранируются для JSON. База данных интерпретирует их как экранирование для базы данных, и поэтому косые черты не сохраняются в данных, если они также не экранированы. Используйте готовое утверждение:

$_POST = json_encode($_POST);
$query = "REPLACE INTO `$form` (`jsonresults`) VALUES (:json)";
$stm = $pdo->prepare($query);
$stm->bindParam(':json', $_POST, PDO::PARAM_STR);
$stm->execute();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...