【问题标题】:PHP not escaping when using json_encode使用 json_encode 时 PHP 没有转义
【发布时间】:2020-04-20 21:52:03
【问题描述】:

我有一个带有文本字段的 HTML 表单,我正在尝试将其作为 JSON 数据发布到 MySQL blob 中,以便检索回 PHP 数组(用于重新填充字段等) 但是,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);

这适用于没有特殊字符的文本,但是当添加“或”等时会导致错误。查看数据库,JSON 似乎没有转义任何特殊字符,即使它显然应该默认这样做(除非使用 JSON_UNESCAPED_SLASHES,我没有这样做)。

我还尝试了以下方法(当然是单独的):

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

都有类似的问题。 一旦数组被“解码”,特殊字符会破坏它并导致它为空或无效。

谁能指出为什么这不起作用,或者在 MySQL 数据库中存储和检索 PHP 数组的最佳方法是什么(不为每个文本输入使用单独的 DB 字段,我在此页面上有数百个字段)。

【问题讨论】:

标签: php mysql json serialization


【解决方案1】:

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();

【讨论】:

  • 这应该是3v4l.org/g6gEN 的流程,您可能需要编辑您的问题或提出一个新问题,其中包含不同阶段的实际输入和输出。
  • 谢谢。这是一种工作,但如果在网页的文本字段中输入双引号,它仍然会弄乱数据。
  • 谢谢。是的,数据完好无损,现在成功拉入 PHP 数组。但是当我尝试使用 PHP 动态生成 HTML 来显示它时,它会截断: 。抱歉,我知道这已经超出了最初的问题。感谢您的帮助,我已经取得了很多进展。我猜双引号现在把 HTML/PHP 扔掉了。
  • 为什么要覆盖超全局$_POST
  • htmlentities 输入值之前的数据,"。这将如何工作value="some "data" here"
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 2016-09-23
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多