【问题标题】:json_encode($_POST) gets stored as null in databasejson_encode($_POST) 在数据库中存储为空
【发布时间】:2017-05-28 11:22:57
【问题描述】:

当在我们的调查链接上输​​入新调查时,我有一个脚本可以接收 wufoo.com 发送的挂钩。我在代码中做的第一件事就是像这样存储 post 值...

$post = $_POST;
$db->insert('hook_log', [ 'log_text' => json_encode($post) ]);

$db 是一个类文件,具有插入函数,可将输入数组转换为插入语句并在表/数据库中执行。

上面的方法大部分都有效,但偶尔我会在 hook_log 表中插入一个空值。更令人困惑的部分是代码的后续部分已经成功接收到正确的数据并在数据库中创建了所需的行。

其实在$db->insert()之前,我有下面的代码,里面从来没有触发过。

$post = $_POST;

if ($post == null) {
    $db->insert('hook_log', [ 'log_text' => "Post was empty!! Checking for input: ".json_encode(file_get_contents('php://input')) ]);
    $db->insert('hook_log', [ 'log_text' => "May be get: ".json_encode($_GET) ]);
    $post = json_decode(file_get_contents('php://input'), true);
}

因此,显然我的脚本正在接收正确的 POST 数据,但不知何故无法对其进行 json_encode 并将其正确存储在表中。我的列是 latin1 编码的,如果它收到一个 unicode 字符,我会看到它在测试中被正确转义。

我什至尝试记录 getallheaders(),它显示一些数据已经发布。有人可以建议我应该做些什么来弄清楚为什么我的代码会存储 NULL 以及如何防止这种情况发生?

编辑:

我不确定它是否重要,但我不直接将明文输入到表中,代码使用 aes_encrypt() 存储加密数据。但是,如前所述,代码大部分都可以工作,并且在我使用 aes_decrypt() 时会显示正确的输出。

【问题讨论】:

  • 而不是if ($post == null) {,如何检查if(is_array($_POST) && !empty($_POST)) {$_POST 将始终是一个数组,它应该是一个非空数组,在这种情况下。
  • 好的,我已将其添加到条件列表中。让我们等待下一个钩子。我还添加了一行来转储 $_POST 而不进行加密,并使其插入 json_last_error()。很快就会更新。

标签: php mysql json post


【解决方案1】:

问题比我想象的要简单。显然 5,000 个字符不足以存储传入的 POST 数据。如果我在插入之前没有对其进行加密,我会注意到字符串被截断了。由于它被截断,即使 aes_decrypt 也无法正常工作并返回 null。

我现在已将列大小增加到 65,000,并将观察是否返回了更多空值。理想情况下,MySQL 应该警告我插入时的字符串截断。

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多