P粉928591383 2023-08-08 15:51:43 0 1 231
尝试绑定一个数组(第一个数组绑定)以防止SQL注入
这是有效的代码:
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); }
我无法绑定该数组,已尝试:
$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) //这里是第一个语句中分配的值
P粉384679266 采纳为最佳 2023-08-09 13:15:28 1楼
你有两个问题:
你没有使用正确的bind语法。
你试图在一个预处理语句中插入多行
唯一的微弱好处是,你尝试在一个查询中打包多个VALUES()时,它会被隐式事务包装。但是这种方法的其他方面都是不利的。明确地打开包裹绑定/执行循环的事务,可以获得相同的好处[错误回滚,IO批处理],同时也能利用预处理语句的好处[单个简单查询解析,参数化等]
赞 +0 添加回复