suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Binden Sie ein PHP-Array für die SQL-Einfügung

<p>Es wird versucht, ein Array zu binden (erste Array-Bindung), um SQL-Injection zu verhindern</p><p>Dies ist gültiger Code: </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) { //Rufen Sie die Array-ID ab, um die Zeilennummer der CSVOption-Spalte zu finden $findrow = array_search_partial($attributeid, $value); //Beim Absenden des Formulars wird der Attributwert der Attribut-ID zugewiesen $attribute = $value; $csv = $csvcolumn[$findrow]; $valuesArr[] = "('$userid', '$feed_id', '$attribute', '$csv')"; } $sql = „INSERT INTO Kartenwerte (Benutzer-ID, Feed-ID, Attribut-ID, CSV-Spalte)“; $sql .= implode(',', $valuesArr); mysqli_query($conn,$sql); } </code></pre> <p>Ich kann das Array nicht binden, habe es versucht: </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') //Dies ist das in SQL eingefügte Array //(user_id, feed_id, attribute_id, csvcolumn) //Hier ist der in der ersten Anweisung zugewiesene Wert</pre> <p><br /></p>
P粉928591383P粉928591383464 Tage vor503

Antworte allen(1)Ich werde antworten

  • P粉384679266

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

    你有两个问题:

    你没有使用正确的bind语法。

    你试图在一个预处理语句中插入多行

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

    唯一的微弱好处是,你尝试在一个查询中打包多个VALUES()时,它会被隐式事务包装。但是这种方法的其他方面都是不利的。明确地打开包裹绑定/执行循环的事务,可以获得相同的好处[错误回滚,IO批处理],同时也能利用预处理语句的好处[单个简单查询解析,参数化等]

    Antwort
    0
  • StornierenAntwort