亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

沒有插入數據,查詢執行似乎沒有運行

沒有插入數據,查詢執行似乎沒有運行

PHP
LEATH 2023-03-26 13:52:46
我有一個收集數據并將其放入對象的函數。然后它將此對象轉換為 json 字符串,并將其放入表中。完成它大約需要 30 秒?,F在,這個 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 關注
  • 188 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號