Question

Je suis en train de changer certaines requêtes codées en dur pour utiliser les entrées paramétrées, mais j'ai rencontré un problème: comment formater-vous l'entrée pour les inserts en vrac paramétrées

À l'heure actuelle, les regards de code comme ceci:

$data_insert = "INSERT INTO my_table (field1, field2, field3) ";
$multiple_inserts = false;
while ($my_condition)
{
    if ($multiple_inserts)
    {
        $data_insert .= " UNION ALL ";
    }

    $data_insert .= " SELECT myvalue1, myvalue2, myvalue3 ";
}

$recordset = sqlsrv_query($my_connection, $data_insert);

Une solution potentielle (modifié à partir de Comment insérer un tableau dans un seul MySQL Instruction préparée w / PHP et AOP ) semble être:

$sql = 'INSERT INTO my_table (field1, field2, field3) VALUES ';
$parameters = array();
$data = array();
while ($my_condition)
{
    $parameters[] = '(?, ?, ?)';
    $data[] = value1;
    $data[] = value2;
    $data[] = value3;
}

if (!empty($parameters)) 
{
    $sql .= implode(', ', $parameters);
    $stmt = sqlsrv_prepare($my_connection, $sql, $data);
    sqlsrv_execute($stmt);
}

Y at-il une meilleure façon de réaliser un insert en vrac avec des requêtes paramétrées?

Était-ce utile?

La solution

Eh bien, vous avez trois options.

  1. Construire une fois - exécuter plusieurs. En gros, vous préparez la pièce une fois pour une ligne, boucle puis sur les lignes de l'exécuter. Depuis l'extension SQLServer ne supporte pas re-liaison d'une requête après qu'il a été préparé (vous devez faire hacks sale avec des références ) qui ne peuvent pas être la meilleure option.

  2. Construire une fois - une fois exécuter. Fondamentalement, vous construisez un insert géant comme vous le dites dans votre exemple, lient une fois, et l'exécuter. Ceci est un peu sale peu et manque certains des avantages qui ont préparé les requêtes donne. Toutefois, en raison de l'exigence de références de l'option 1, je ferais celui-ci. Je pense qu'il est plus propre pour construire une requête géante plutôt que de dépendre des références variables.

  3. Construire multiples - exécuter plusieurs. En gros, prenez la méthode que vous faites, et apportez des modifications à nouveau préparer la requête tous autant de disques. Cela évite des requêtes excessivement grandes et « lots » les requêtes. Donc, quelque chose comme ceci:

    $sql = 'INSERT INTO my_table (field1, field2, field3) VALUES ';
    $parameters = array();
    $data = array();
    
    $execute = function($params, $data) use ($my_connection, $sql) {
        $query = $sql . implode(', ', $parameters);
        $stmt = sqlsrv_prepare($my_connection, $query, $data);
        sqlsrv_execute($stmt);
    }
    
    while ($my_condition) {
        $parameters[] = '(?, ?, ?)';
        $data[] = value1;
        $data[] = value2;
        $data[] = value3;
        if (count($parameters) % 25 == 0) {
            //Flush every 25 records
            $execute($parameters, $data);
            $parameters = array();
            $data = array();
        }
    }
    if (!empty($parameters))  {
        $execute($sql, $parameters, $data);
    }
    

Les deux méthodes suffira. Faites ce que vous pensez correspond à vos besoins mieux ...

Autres conseils

Pourquoi ne pas utiliser « préparer une fois, exécuter plusieurs » méthode. Je sais que vous voulez qu'il soit tout échec ou tout le travail, mais il est pas tout à fait difficile à gérer que les transactions:

http://www.php.net/manual/en/pdo. begintransaction.php

http://www.php.net/manual/en/pdo. commit.php

http://www.php.net/manual/en/pdo. rollback.php

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top