我有一个脚本,当我们在调查链接中输入新调查后,该脚本会接收wufoo.com发送的钩子。我在代码中要做的第一件事就是像这样存储帖子值...

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


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

上面的代码在大多数情况下都有效,但是偶尔我会在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()时显示正确的输出。

最佳答案

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

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

关于php - json_encode($ _ POST)在数据库中存储为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44226738/

10-11 23:14
查看更多