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

时间:2020-05-15 14:40:15

标签: php mysql

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

4 个答案:

答案 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
        }

}