我有一个收集数据并将其放入对象的函数。然后,它将此对象转换为json字符串,并将其放入表中。大约需要30秒。
现在,这个json字符串相当大(大约36mb左右)。
但是当我执行查询时,表中没有任何内容,也没有出现任何错误。
所以我做了一些调试,现在代码如下:
function __construct($total, $allActions, $employees, $branches, $companies, $departments, $lastUpdated, $update = false)
{
echo "Made it to constructor. Update: ".json_encode($update);
global $conn;
$this->Total = $total;
$this->AllActions = $allActions;
$this->Employees = $employees;
$this->Branches = $branches;
$this->Companies = $companies;
$this->Departments = $departments;
$this->LastUpdated = $lastUpdated;
if($update) {
try {
$query = $conn->prepare("INSERT INTO actionplansummarydata_new (json, last_updated) VALUES (?, ?)");
echo "Prepared query.";
if($query->bind_param('ss', json_encode($this), $this->LastUpdated->format("Y-m-d H:i:s"))) {
echo "Bound parameters.";
if ($query->execute()) {
echo "Executed query.";
} else {
echo "Error inserting summary: " . $query->error;
}
} else {
echo "Error binding query: " . $query->error;
}
} catch(Exception $ex) {
echo "Exception: ".$ex->getMessage();
}
}
}
现在,当执行此命令时,这是我在页面上得到的响应:
将其制作为构造函数。更新:truePrepared查询。绑定参数。
但是我这里有一个if语句:
if ($query->execute()) {
echo "Executed query.";
} else {
echo "Error inserting summary: " . $query->error;
}
这些都不会在页面上回显,也没有任何异常。
我完全困惑。
服务器为MariaDB 10.4,数据库中的json
字段为longtext
,因此它应该能够存储它。
答案 0 :(得分:3)
如果您的错误报告位于E_ALL,则您不应因查询执行而面临静默失败...无论如何,首先,首先要对故障点进行故障排除。
将json_encode($this)
移出绑定,将其分配给变量,然后var_dump
来查看您实际在给活页夹添加什么。 $this->LastUpdated->format
也是如此;假定它是一个DateTime对象,但谁知道。当故障点位于条件语句之外时,更易于调试。
如果您插入虚拟数据字符串,是否可以确认它是否按预期工作?例如:
if($query->bind_param('ss', '{}', '2020-05-19 01:01:01')); {
这里的一个问题是bind_param通过引用而不是通过值绑定变量。因此,您不能为其提供函数。您必须将值分配给变量,然后再绑定它们(因为函数不会返回可用的引用)。含义,更改为:
$json = json_encode($this);
$updated = $this->LastUpdated->format("Y-m-d H:i:s");
if($query->bind_param('ss', $json, $updated)) {
您可以将绑定结果(是/否)分配给变量,然后分配var_dump
。 (我们宁愿不要从条件语句中使用var_dump
,对吗?)由于上述原因,绑定将失败=== false。同样,var_dump
准备好的查询以确保成功,跟踪每个步骤。
致命错误可能由数据库引擎启动而触发,这可能与插入查询的大小有关。如果您在某处达到极限,则可能需要查找MariaDB错误日志以获取更多线索。我猜想max_allowed_packet的默认大小为16MB,您已经过了。 (另请参见mysqli_stmt::send_long_data,以块为单位发送长数据。)
在其他问题中,json
是MySQL 8.0中的保留字(未针对Maria 10.4列出吗?!)。您可能想要重命名该列以确保它不会成为问题(即使它在此处起作用)。
就这种情况的可能性而言,只有在从未显示的$query->execute()
触发致命错误的情况下,您描述的内容(if / else无输出)才有意义。除非PHP错误报告中存在某些MySQL错误的错误。请仔细检查您的PHP错误报告配置,包括代码/.htaccess中可能覆盖php.ini的任何地方。
答案 1 :(得分:1)
检查max_allowed_packet
的设置;这可能会阻止您。将其设置为1G。
如果这不起作用,则可能存在超时问题或其他一些大小限制。
对于大文本字符串,有时我想对其进行压缩,然后将其存储到MEDIUMBLOB
中。
答案 2 :(得分:0)
您用于存储36MB JSON字符串的数据类型是什么?您可能需要将数据类型更改为可以存储多达4GB数据的LONGTEXT或可以存储多达1GB数据的JSON数据类型
或
您可以将其单独存储为表中的列,并在需要时将其更改回代码上的JSON
答案 3 :(得分:-1)
尝试检查是否已准备好
if($query = $conn->prepare("INSERT INTO actionplansummarydata_new (json, last_updated) VALUES (?, ?)")){
$query->bind_param('ss', json_encode($this), $this->LastUpdated->format("Y-m-d H:i:s"));
if($query->execute()){
// code here
}
}