Php 未插入数据,查询执行不';我好像跑不了

Php 未插入数据,查询执行不';我好像跑不了,php,mysql,Php,Mysql,我有一个收集数据并将其放入对象的函数。然后将该对象转换为json字符串,并将其放入表中。大约需要30秒 现在,这个json字符串相当大(大约36mb左右) 但是当我执行查询时,没有任何内容被放入表中,并且我没有得到任何错误 所以我做了一些调试,代码如下所示: function __construct($total, $allActions, $employees, $branches, $companies, $departments, $lastUpdated, $update = false

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

尝试检查是否准备好了

 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
        }

}

如果您的错误报告是在所有,您不应该面临一个无声的查询执行失败。。。在任何情况下,首先是故障点故障排除的一些步骤

json\u encode($this)
移出绑定,分配给变量,然后
var\u dump
查看您实际向绑定器提供的内容。
$this->LastUpdated->format
也是如此;假设它是DateTime对象,但谁知道呢。当失败点位于条件语句之外时,更易于调试

如果插入伪数据字符串,是否可以确认它是否按预期工作?例如:

if($query->bind_param('ss', '{}', '2020-05-19 01:01:01')); {
这里的一个问题是,通过引用而不是通过值绑定变量。因此,您不能为它提供函数。必须将值赋给变量,然后再绑定它们(因为函数不会返回可用的引用)。含义,变更为:

$json = json_encode($this);
$updated = $this->LastUpdated->format("Y-m-d H:i:s");
if($query->bind_param('ss', $json, $updated)) {
您可以将绑定结果(真/假)赋给变量,然后
var\u dump
。(我们不希望从条件语句内部
var\u dump
,对吗?)绑定将失败===false,原因如上所述。同样地,
var\u dump
会跟踪每个步骤,以确保准备好的查询成功

数据库引擎运行可能会触发致命错误,这很可能与插入查询的大小有关。您可能希望查找MariaDB错误日志以获得更多线索,以防您在某个地方达到某个极限。我猜,默认16MB,你已经很好了。(另请参见以块形式发送长数据的相关信息。)

在其他版本中,
json
在MySQL 8.0中是一个保留字(在Maria 10.4中没有列出)。您可能希望重命名该列,以确保它不会成为问题(即使它在此处工作)


就这种情况而言,您所描述的(if/else没有输出)只有在
$query->execute()
触发的致命错误从未显示时才有意义。除非PHP错误报告中存在错误,并且出现某些MySQL故障。请三次检查PHP错误报告配置,包括可能覆盖PHP.ini的code/.htaccess中的任何位置。

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

如果这不起作用,可能会出现超时问题,或其他一些大小限制


对于大型文本字符串,我有时喜欢将其压缩,并将字符串存储到
MEDIUMBLOB

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


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

如果它没有准备好,为什么允许我绑定?通常这些东西会抛出错误。您应该始终检查是否已准备好,然后绑定参数。如果未准备好,则在尝试绑定时会抛出错误。类似于“无法在非对象上调用bind”。同样,json_encode()函数返回json编码的数据,而不是字符串,因此您无法直接绑定json,请尝试在插入之前将其保存到变量中,如$str=json_encode(data);然后bind it以前也从未遇到过问题,这与输入的字符串的大小有关。这可能有助于调试查询@SeifHatem,这有什么帮助?打印调试的最后一行将永远无法到达。请发布json_encode($this)@nbk的结果,因为它包含员工信息。json只是文本,因此在编辑器中清理内容。如果json字符串足够小,则查询会起作用。另外,
bind_参数通过引用绑定变量
。这似乎不是真的,正如我所说的,如果字符串足够小,可以插入,它就可以正常工作。我已经将
max\u allowed\u数据包设置为400mb,我仍然面临同样的问题。我的错误配置看起来不错,因为所有其他致命错误都显示出来了。如果您
var\u dump
bind语句,您会得到什么?你看过你的MySQL错误日志了吗?