Ikat tatasusunan PHP untuk sisipan SQL
P粉928591383
P粉928591383 2023-08-08 15:51:43
0
1
519
<p>Cuba mengikat tatasusunan (mengikat tatasusunan pertama) untuk menghalang suntikan SQL</p><p>Ini adalah kod yang sah: </p><p><br /> ;</p> ; <pre class="lang-php prettyprint-override"><kod>if (isset($_POST['checkbox_selected'])) { $valuesArr = array(); foreach ($_POST['checkbox_selected'] sebagai $key => $value) { // Dapatkan ID Tatasusunan untuk mencari nombor baris lajur CSVOption $findrow = array_search_partial($attributeid, $value); //Apabila borang diserahkan, nilai atribut diberikan kepada id atribut $atribut = $nilai; $csv = $csvcolumn[$findrow]; $valuesArr[] = "('$userid', '$feed_id', '$attribute', '$csv')"; } $sql = "MASUKKAN KE DALAM peta (user_id, feed_id, attribute_id, csvcolumn) nilai "; $sql .= implode(',', $valuesArr); mysqli_query($conn,$sql); } </code></pre> <p>Saya tidak dapat mengikat tatasusunan, cuba: </p> <pre class="brush:php;toolbar:false;">$sql = "INSERT IN TO map (user_id, feed_id, attribute_id, csvcolumn) NILAI (?, ?, ? ,?)"; $stmt = $conn->prepare($sql); $stmt->bind_param('iiii', implode(',', $valuesArr)); $stmt->execute(); echo implode(',', $valuesArr) //('1', '1', '13', '9') //Ini ialah tatasusunan yang dimasukkan ke dalam SQL //(user_id, feed_id, attribute_id, csvcolumn) //Berikut ialah nilai yang diberikan dalam pernyataan pertama</pre> <p><br /></p>
P粉928591383
P粉928591383

membalas semua(1)
P粉384679266

Anda mempunyai dua masalah:

Anda tidak menggunakan sintaks bind yang betul.

Anda cuba memasukkan berbilang baris dalam satu pernyataan yang disediakan

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
    }
}

Satu-satunya faedah yang sedikit ialah apabila anda cuba membungkus berbilang VALUES() dalam satu pertanyaan, ia akan dibalut oleh transaksi tersirat. Tetapi aspek lain dari pendekatan ini adalah merugikan. Membuka transaksi yang membungkus gelung pengikatan/pelaksanaan secara eksplisit, anda mendapat faedah yang sama [kembali balik ralat, kumpulan IO], sambil turut mengambil kesempatan daripada faedah penyataan yang disediakan [penghuraian pertanyaan mudah tunggal, parameterisasi, dll.]

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan