Lier un tableau PHP pour l'insertion SQL
P粉928591383
P粉928591383 2023-08-08 15:51:43
0
1
540
<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粉928591383
P粉928591383

répondre à tous(1)
P粉384679266

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal