recherche

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

La meilleure façon d'insérer par lots dans MySQLi ?

<p>Je recherche une technique sécurisée par injection SQL pour insérer un grand nombre de lignes (~ 2 000 lignes) à la fois en utilisant PHP et MySQLi. </p><p>J'ai un tableau qui contient toutes les valeurs qu'il doit contenir. Actuellement, je fais ceci : </p> <pre class="brush:php;toolbar:false;"><?php $array = array("tableau", "avec", "à propos", "2000", "valeurs"); foreach ($tableau comme $one) { $query = "INSÉRER DANS la table (lien) VALEURS (?)"; $stmt = $mysqli->prepare($query); $stmt ->bind_param("s", $one); $stmt->exécuter(); $stmt->fermer(); } ?>≪/pré> <p>J'ai essayé call_user_func_array() mais cela a entraîné un débordement de pile. </p> <p>Quel est le moyen le plus rapide de procéder (comme les insérer tous en même temps ?) tout en empêchant l'injection SQL (comme les instructions préparées) et le débordement de pile ? </p>
P粉951914381P粉951914381446 Il y a quelques jours501

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

  • P粉530519234

    P粉5305192342023-08-25 15:20:13

    Réessayez, je ne comprends pas pourquoi votre code d'origine ne fonctionne pas après une légère modification :

    $query = "INSERT INTO table (link) VALUES (?)";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param("s", $one);
    
    foreach ($array as $one) {
        $stmt->execute();
    }
    $stmt->close();

    répondre
    0
  • P粉340980243

    P粉3409802432023-08-25 00:31:22

    En plaçant vos inserts dans une transaction, vous devriez pouvoir augmenter considérablement la vitesse. Vous pouvez également déplacer les instructions préparer et lier en dehors de la boucle.

    $array = array("array", "with", "about", "2000", "values");
    $query = "INSERT INTO table (link) VALUES (?)";
    $stmt = $mysqli->prepare($query);
    $stmt ->bind_param("s", $one);
    
    $mysqli->query("START TRANSACTION");
    foreach ($array as $one) {
        $stmt->execute();
    }
    $stmt->close();
    $mysqli->query("COMMIT");

    J'ai testé ce code sur mon serveur web pendant 10 000 itérations.

    Pas d'affaire :226 秒。 Horaires de trading : 2 秒。 Ou 速度提高两个数量级, du moins pour ce test.

    répondre
    0
  • Annulerrépondre