cari

Rumah  >  Soal Jawab  >  teks badan

Ikat tatasusunan PHP untuk sisipan SQL

<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粉928591383P粉928591383547 hari yang lalu570

membalas semua(1)saya akan balas

  • P粉384679266

    P粉3846792662023-08-09 13:15:28

    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.]

    balas
    0
  • Batalbalas