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

我有一个收集数据并将其放入对象的函数。然后它将此对象转换为 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,所以应该可以存储。


LEATH
浏览 155回答 4
4回答

湖上湖

如果您的错误报告是在 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 的任何地方。

白衣染霜花

检查设置max_allowed_packet;这可能会阻止你。设置为 1G。如果这不起作用,则可能存在超时问题或其他一些大小限制。对于大文本字符串,我有时喜欢压缩它们,并将字符串存储到一个MEDIUMBLOB.

肥皂起泡泡

您使用什么数据类型来存储 36MB 的 JSON 字符串?您可能需要将数据类型更改为最多可存储 4GB 数据的 LONGTEXT 或最多可存储 1GB 数据的 JSON 数据类型或者您可以将其单独存储为表中的列,并在需要时在您的代码中将其更改回 JSON

Cats萌萌

尝试检查是否准备好 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        }}
打开App,查看更多内容
随时随地看视频慕课网APP