json_encode($ _ POST)在数据库中存储为null

时间:2017-05-28 11:22:57

标签: php mysql json post

我有一个脚本,当我们的调查链接上输​​入新的调查时,它接收wufoo.com发送的钩子。我在代码中做的第一件事就是将post值存储起来......

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

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

以上适用于大多数部分,但偶尔会在hook_log表中插入null。更令人困惑的部分是代码的后续部分已成功接收到正确的数据,并在数据库中创建了所需的行。

实际上在$ 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()时,代码大部分都有效,并显示正确的输出。

1 个答案:

答案 0 :(得分:0)

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

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