P粉3846792662023-08-09 13:15:28
你有兩個問題:
你沒有使用正確的bind語法。
你試圖在一個預處理語句中插入多行
if (isset($_POST['checkbox_selected'])) { $sql = "INSERT INTO map (user_id, feed_id, attribute_id, csvcolumn) VALUES (?, ?, ?, ?);"; // prepare only has to happen once $stmt = mysqli_prepare($conn,$sql); mysqli_begin_transaction($conn); try { foreach ($_POST['checkbox_selected'] as $key => $value) { $findrow = array_search_partial($attributeid, $value); $attribute = $value; $csv = $csvcolumn[$findrow]; $stmt->bindParam('iiii', $userid, $feed_id, $attribute, $csv); $stmt->execute(); } mysqli_commit($conn); } catch(mysqli_sql_exception $e) { mysqli_rollback($conn); // immediately roll back changes throw $e; // re-throw exception } }
唯一的微弱好處是,你嘗試在一個查詢中打包多個VALUES()時,它會被隱含交易包裝。但是這種方法的其他方面都是不利的。明確地開啟包裹綁定/執行循環的事務,可以得到相同的好處[錯誤回滾,IO批處理],同時也能利用預處理語句的好處[單一簡單查詢解析,參數化等]