綁定一個 PHP 陣列以進行 SQL 插入
P粉928591383
2023-08-08 15:51:43
<p>嘗試綁定一個陣列(第一個陣列綁定)以防止SQL注入</p><p>這是有效的程式碼:</p><p><br /> ;</p>
<pre class="lang-php prettyprint-override"><code>if (isset($_POST['checkbox_selected']))
{
$valuesArr = array();
foreach ($_POST['checkbox_selected'] as $key => $value) {
//檢索Array ID以查找CSVOption列的行號
$findrow = array_search_partial($attributeid, $value);
//在表單提交時,屬性值被指派給屬性 id
$attribute = $value;
$csv = $csvcolumn[$findrow];
$valuesArr[] = "('$userid', '$feed_id', '$attribute', '$csv')";
}
$sql = "INSERT INTO map (user_id, feed_id, attribute_id, csvcolumn) values ";
$sql .= implode(',', $valuesArr);
mysqli_query($conn,$sql);
}
</code></pre>
<p>我無法綁定該數組,已嘗試:</p>
<pre class="brush:php;toolbar:false;">$sql = "INSERT INTO map (user_id, feed_id, attribute_id, csvcolumn) VALUES (?, ?, ? ,?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('iiii', implode(',', $valuesArr));
$stmt->execute();
echo implode(',', $valuesArr)
//('1', '1', '13', '9') //這是被插入到SQL中的陣列
//(user_id, feed_id, attribute_id, csvcolumn) //這裡是第一個語句中分配的值</pre>
<p><br /></p>
你有兩個問題:
你沒有使用正確的bind語法。
你試圖在一個預處理語句中插入多行
唯一的微弱好處是,你嘗試在一個查詢中打包多個VALUES()時,它會被隱含交易包裝。但是這種方法的其他方面都是不利的。明確地開啟包裹綁定/執行循環的事務,可以得到相同的好處[錯誤回滾,IO批處理],同時也能利用預處理語句的好處[單一簡單查詢解析,參數化等]