recherche

Maison  >  Questions et réponses  >  le corps du texte

Lier un tableau PHP pour l'insertion SQL

<p>Essayer de lier un tableau (première liaison de tableau) pour empêcher l'injection SQL</p><p>Ceci est un code valide : </p><p><br /> ;</p> ; <pre class="lang-php Prettyprint-override"><code>if (isset($_POST['checkbox_selected'])) { $valuesArr = tableau(); foreach ($_POST['checkbox_selected'] as $key => $value) { //Récupère l'ID du tableau pour trouver le numéro de ligne de la colonne CSVOption $findrow = array_search_partial($attributeid, $value); //Lorsque le formulaire est soumis, la valeur de l'attribut est affectée à l'identifiant de l'attribut $attribut = $valeur ; $csv = $csvcolonne[$findrow]; $valuesArr[] = "('$userid', '$feed_id', '$attribute', '$csv')"; } $sql = "INSERT INTO map (user_id, feed_id, attribue_id, csvcolumn) valeurs » ; $sql .= implode(',', $valuesArr); mysqli_query($conn,$sql); } </code></pre> <p>Je ne parviens pas à lier le tableau, j'ai essayé : </p> <pre class="brush:php;toolbar:false;">$sql = "INSERT INTO map (user_id, feed_id,attribut_id, csvcolumn) VALUES (?, ?, ? ,?)"; $stmt = $conn->préparer($sql); $stmt->bind_param('iiii', implode(',', $valuesArr)); $stmt->exécuter(); echo imploser(',', $valuesArr) //('1', '1', '13', '9') //Voici le tableau inséré dans SQL //(user_id, feed_id,attribut_id, csvcolumn) //Voici la valeur attribuée dans la première instruction</pre> <p><br /></p>
P粉928591383P粉928591383502 Il y a quelques jours543

répondre à tous(1)je répondrai

  • P粉384679266

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

    Vous avez deux problèmes :

    Vous n'utilisez pas la syntaxe de liaison correcte.

    Vous avez essayé d'insérer plusieurs lignes dans une seule instruction préparée

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

    Le seul léger avantage est que lorsque vous essayez d'envelopper plusieurs VALUES() dans une seule requête, elle sera enveloppée par une transaction implicite. Mais d’autres aspects de cette approche sont désavantageux. En ouvrant explicitement la transaction qui encapsule la boucle de liaison/exécution, vous obtenez les mêmes avantages [annulation d'erreur, traitement par lots d'E/S], tout en profitant également des avantages des instructions préparées [analyse de requête simple, paramétrage, etc.]

    répondre
    0
  • Annulerrépondre