为了账号安全,请及时绑定邮箱和手机立即绑定

没有插入数据,查询执行似乎没有运行

没有插入数据,查询执行似乎没有运行

PHP
LEATH 2023-03-26 13:52:46
我有一个收集数据并将其放入对象的函数。然后它将此对象转换为 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 query.Bound 参数。但是我这里有一个 if 语句:            if ($query->execute()) {                echo "Executed query.";            } else {                echo "Error inserting summary: " . $query->error;            }这些都没有回显到页面,我也没有得到任何异常。我完全不知所措。服务器是MariaDB 10.4,json数据库中的字段是longtext,所以应该可以存储。
查看完整描述

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 的任何地方。


查看完整回答
反对 回复 2023-03-26
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

检查设置max_allowed_packet;这可能会阻止你。设置为 1G。

如果这不起作用,则可能存在超时问题或其他一些大小限制。

对于大文本字符串,我有时喜欢压缩它们,并将字符串存储到一个MEDIUMBLOB.


查看完整回答
反对 回复 2023-03-26
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

您使用什么数据类型来存储 36MB 的 JSON 字符串?您可能需要将数据类型更改为最多可存储 4GB 数据的 LONGTEXT 或最多可存储 1GB 数据的 JSON 数据类型

或者

您可以将其单独存储为表中的列,并在需要时在您的代码中将其更改回 JSON


查看完整回答
反对 回复 2023-03-26
?
Cats萌萌

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

        }


}


查看完整回答
反对 回复 2023-03-26
  • 4 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信