Frage

Ich versuche, einige hartcodierte Abfragen zu wechseln parametrisierte Eingaben zu verwenden, aber ich habe auf ein Problem stoßen: Wie forma Sie die Eingabe für parametrisierte bulk Einsätze

Derzeit Der Code sieht wie folgt aus:

$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);

Eine mögliche Lösung (modifiziert von Wie ein Array in eine einzige MySQL vorbereitete Anweisung w / PHP und PDO einfügen) scheinen zu sein:

$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);
}

Gibt es einen besseren Weg, um einen Masseneinsatz mit parametrisierte Abfragen zu erreichen?

War es hilfreich?

Lösung

Nun, haben Sie drei Möglichkeiten.

  1. Erstellen einmal - mehrere auszuführen. Im Prinzip bereitet man die Einlage einmal für eine Zeile, dann die Schleife über die Zeilen es ausführt. Da die SQLSERVER Erweiterung müssen a href nicht wieder Bindung einer Abfrage unterstützen, nachdem sie vorbereitet ist schon (Sie tun <= "http://msdn.microsoft.com/en-US/library/cc296201(v=SQL. 90) .aspx“rel = "noreferrer"> schmutzig Hacks mit Referenzen ), die nicht die beste Option sein kann.

  2. Build einmal - einmal auszuführen. Grundsätzlich bauen Sie einen Rieseneinsatz, wie Sie in Ihrem Beispiel gesagt, binden sie einmal, und ausführen. Dies ist ein bisschen schmutzig und vermisst einige der Vorteile, die Abfragen vorbereitet gibt. Aufgrund der Anforderung der Referenzen von Option 1, würde ich dies tun. Ich denke, es ist sauberer eine riesige Abfrage zu erstellen, anstatt auf Variablenreferenzen abhängen.

  3. Erstellen mehr - ausführen mehr. Grundsätzlich nehmen Sie die Methode, die Sie tun, und es zwicken neu präparieren die Abfrage alle so viele Datensätze. Dies verhindert, dass übermäßig große Abfragen und „Chargen“ die Abfragen. So etwas wie folgt aus:

    $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);
    }
    

Jede Methode genügt. Tun Sie, was Sie denken, passt Ihre Anforderungen am besten ...

Andere Tipps

Warum nicht einfach verwenden Methode „einmal vorbereiten, mehrere execute“. Ich weiß, Sie wollen, dass es entweder alle zum Scheitern verurteilt oder alle Arbeit, aber es ist nicht gerade schwer zu handhaben, die mit Transaktionen:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top