Mysql
為什麼這個 blob 在用作連接字元串而不是準備好的語句時會保存
我有一個 PHP mysqli 準備好的語句,如下所示:
$editSQL = "UPDATE tblClientReminders SET Header = ?, Notes = ?, DepartmentID = ?, TierID = ?, RemindType = ?, RemindDate = ?, DateAdded = ? WHERE ReminderID = ?"; $stmt = $conn->prepare($editSQL); $stmt->bind_param('sbiiissi', $input[1], $input[2], $input[3], $input[4], $input[5], $input[6], $DateAdded, $_SESSION[$thisTracker]); $DateAdded = date("Y-m-d h:i:s"); $stmt->execute(); $stmt->close();
當我執行它時,它執行時不會拋出任何錯誤並按預期執行其他所有內容;但是,即使 $input,“Notes”欄位也會被清除
$$ 2 $$有內容。但是當我使用連接來做到這一點時:
$editSQL = "UPDATE tblClientReminders SET Header = '".$input[1]."', Notes = '".$input[2]."', DepartmentID = '".$input[3]."', TierID = '".$input[4]."', RemindType = '".$input[5]."', RemindDate = '".$input[6]."', DateAdded = '".date("Y-m-d h:i:s")."' WHERE ReminderID = '".$_SESSION[$thisTracker]."'"; $stmt = $conn->prepare($editSQL); $stmt->execute(); $stmt->close();
$ input[2] is properly saved along with everything else. I have verified that the column “Notes” is a blob in the mySQL database, and that $ 輸入
$$ 2 $$當我嘗試準備好的語句時,實際上包含預期的數據。那麼,為什麼是 $input$$ 2 $$在第一個範例中沒有保存,我將如何解決這個問題。 我能想到的唯一其他因素是 $input
$$ 2 $$正在傳遞一個 AES 字元串,但我想不出為什麼會出現問題,因為我的程式碼中其他地方的其他查詢都很好地保存了 AES 字元串,但我認為這是唯一一個對 blob 執行此操作的查詢。 輸入範例:
$input[1] = 'test'; $input[2] = '8L2G1urlEQEjZdyMrSQeow==::88f32b3584167b1d7286a57f861d4fd6'; $input[3] = 1; $input[4] = 3; $input[5] = 0; $input[6] = '2018-11-20'; $_SESSION[$thisTracker] = 15;
該
bind_param
頁面提到(強調我的)的types
參數對應的變數是一個blob,將在數據包中發送
以這種方式完成:
$null = NULL; $stmt->bind_param('sbiiissi', $input[1], $null, $input[3], $input[4], $input[5], $input[6], $DateAdded, $_SESSION[$thisTracker]); $stmt->send_long_data(1, $input[2]);
如果您的 BLOB 數據超過了
max_allowed_packet
您需要send_long_data
多次呼叫的大小,則每次發送一個較小的片段。此 Oracle 部落格中的更多資訊。