SQL挿入用のPHP配列のバインド
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 = 配列();
foreach ($_POST['checkbox_selected'] as $key => $value) {
// 配列 ID を取得して CSVOption 列の行番号を見つけます
$findrow = array_search_partial($attributeid, $value);
// フォームが送信されると、属性値が属性 ID に割り当てられます。
$属性 = $値;
$csv = $csvcolumn[$findrow];
$valuesArr[] = "('$userid', '$feed_id', '$attribute', '$csv')";
}
$sql = "マップ (user_id、feed_id、attribute_id、csvcolumn) の値に挿入します。";
$sql .= implode(',', $valuesArr);
mysqli_query($conn,$sql);
}
</code></pre>
<p>配列をバインドできないので、試してみました: </p>
<pre class="brush:php;toolbar:false;">$sql = "マップ (user_id、feed_id、attribute_id、csvcolumn) の値に挿入 (?, ?, ? ,?)";
$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>
問題が 2 つあります:
正しいバインド構文を使用していません。
準備されたステートメントに複数の行を挿入しようとしています
リーリー唯一のわずかな利点は、クエリ内で複数の VALUES() をラップしようとすると、暗黙的なトランザクションによってラップされることです。しかし、このアプローチには他の面でも不利な点があります。バインディング/実行ループをラップするトランザクションを明示的に開くと、同じ利点 [エラー ロールバック、IO バッチ処理] が得られると同時に、プリペアド ステートメントの利点 [単一の単純なクエリ解析、パラメータ化など] も活用できます。