4 回答
TA贡献2003条经验 获得超2个赞
如果您的错误报告是在 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)) {
您可以将绑定结果 (true/false) 分配给一个变量,然后var_dump
. (我们不想var_dump
从条件语句内部,对吗?)由于上述原因,绑定将失败 === false。同样,var_dump
准备好的查询确保它成功,跟踪每个步骤。
数据库引擎运行可能会触发致命错误,这很可能与插入查询的大小有关。您可能需要查看 MariaDB 错误日志以获取更多线索,以防您在某处遇到限制。我猜想max_allowed_packet,默认 16MB,你已经完成了。(另见mysqli_stmt::send_long_data以块形式发送长数据。)
在其他问题中,json
是 MySQL 8.0 中的保留字(未针对 Maria 10.4 列出?!)。您可能希望重命名该列以确保它不会成为问题(即使它在这里有效)。
就这种情况的可能性而言,您所描述的内容(if/else 没有输出)只有在从未显示过的致命错误触发时才有意义$query->execute()
。除非在某些 MySQL 故障的 PHP 错误报告中存在错误。对您的 PHP 错误报告配置进行三次检查,包括 code/.htaccess 中可能覆盖 php.ini 的任何地方。
TA贡献1796条经验 获得超10个赞
检查设置max_allowed_packet
;这可能会阻止你。设置为 1G。
如果这不起作用,则可能存在超时问题或其他一些大小限制。
对于大文本字符串,我有时喜欢压缩它们,并将字符串存储到一个MEDIUMBLOB
.
TA贡献1829条经验 获得超6个赞
您使用什么数据类型来存储 36MB 的 JSON 字符串?您可能需要将数据类型更改为最多可存储 4GB 数据的 LONGTEXT 或最多可存储 1GB 数据的 JSON 数据类型
或者
您可以将其单独存储为表中的列,并在需要时在您的代码中将其更改回 JSON
TA贡献1805条经验 获得超9个赞
尝试检查是否准备好
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
}
}
- 4 回答
- 0 关注
- 154 浏览
添加回答
举报