Bei der Verarbeitung großer Mengen an Dateneinfügungsvorgängen ist es weniger effizient, durch Einfügenanweisungen zu schleifen. Um die Leistung zu verbessern, kann MySQLI :: STMT_INIT in Kombination mit bind_param () verwendet werden, um die Batch -Ausführung vorverarbeiteter Aussagen zu implementieren, die nicht nur die Ausführungseffizienz verbessern, sondern auch das Risiko der SQL -Injektion verhindern können. In diesem Artikel wird erläutert, wie dieser Vorgang anhand von Beispielen effizient durchgeführt wird.
Die Verwendung von Prepe + bind_param ist sicherer als die herkömmliche String -Spleißmethode und ist besonders für Situationen mit dynamischeren Parametern geeignet. Zu den Vorteilen gehören:
Vermeiden Sie die SQL -Injektion;
Vermeiden Sie die wiederholte Zusammenstellung von SQL zur Verbesserung der Ausführungseffizienz;
Gute Lesbarkeit und klare Struktur.
Wir werden als Beispiel eine einfache Benutzerinformationstabelle verwenden, und seine Struktur lautet wie folgt:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100)
);
Nehmen wir an, wir müssen mehrere Benutzerdatensätze einfügen. Folgendes ist die vollständige PHP -Implementierung:
<?php
// Datenbankverbindungskonfiguration
$mysqli = new mysqli("localhost", "db_user", "db_pass", "db_name");
// Überprüfen Sie die Verbindung
if ($mysqli->connect_errno) {
die("Verbindung ist fehlgeschlagen: " . $mysqli->connect_error);
}
// Initialisieren Sie das Anweisungsobjekt
$stmt = $mysqli->stmt_init();
// Vorbereiten SQL Stellungnahme
$sql = "INSERT INTO users (username, email) VALUES (?, ?)";
if (!$stmt->prepare($sql)) {
die("Die Vorverarbeitung schlug fehl: " . $stmt->error);
}
// Binden Sie Parameter(Beachten Sie, dass Variablen verwiesen werden)
$stmt->bind_param("ss", $username, $email);
// Simulieren Sie die zu eingefügten Daten
$data = [
["alice", "alice@m66.net"],
["bob", "bob@m66.net"],
["charlie", "charlie@m66.net"]
];
// Stapelinsertion durchführen
foreach ($data as $row) {
$username = $row[0];
$email = $row[1];
if (!$stmt->execute()) {
echo "Einfügen fehlgeschlagen: " . $stmt->error . "<br>";
}
}
$stmt->close();
$mysqli->close();
?>
Obwohl Sie $ MySQLI-> Preped () Abkürzung direkt verwenden können, verwenden Sie STMT_Init , um den Prozess explizit auszudrücken, der besser für komplexe oder große Projekte geeignet ist.
Bind_param bindet eine Referenz auf die Variable, sodass der Wert der Variablen in der Schleife geändert werden kann und nicht jedes Mal wiederhergestellt werden muss.
Wenn Sie den Rückgabewert nach jeder Ausführung () überprüfen, können wir schnell feststellen, welcher Datensatz nicht einfügt hat.
Batch -Einreichung: Für große Mengen an Dateninsertion kann sie in Chargen (z. B. eine Gruppe pro 1.000 Elemente) verarbeitet werden.
Schalten Sie das automatische Commit ( $ mySQLI-> autocommit (false) ) aus und reichen Sie Transaktionen einheitlich ein, nachdem eine Charge verarbeitet wurde.
Vergleichen Sie die Unterschiede für die Testleistung mit der Mehrwert-Insertions-Syntax (in ... Werte (...), (...), ...).
Die Verwendung von MySQLI :: STMT_INIT und BIND_PARAM () kann nicht nur die Effizienz des Batch -Insertion verbessern, sondern auch die Sicherheit und Wartbarkeit der Anwendung verbessern. Diese Methode wird besonders empfohlen, wenn Sie mit Szenarien wie großen Mengen an Benutzerdaten oder Protokollierung zu tun haben.