Bei der PHP -Entwicklung sind Datenbankoperationen ein unverzichtbarer Teil, und die allgemeinen Operationen umfassen Addition, Löschung, Änderung und Suche. Herkömmliche Datenbank -Interaktionsmethoden haben jedoch häufig Probleme wie Code -Redundanz, Schwachstellen für SQL -Injektionen und Leistungs Engpässe. Um die Effizienz der Datenbankinteraktion zu verbessern und die Wiederverwendbarkeit des Codes zu verbessern, können wir die MySQLI :: STMT_INIT -Methode verwenden, um eine allgemeine Datenbankbetriebsklasse zu verkörpern. Auf diese Weise kann nicht nur die Effizienz verbessert werden, sondern auch die Schwachstellen für SQL -Injektionen können verhindert werden.
In diesem Artikel werden wir ausführlich vorgestellt, wie die Funktion MySQLI :: STMT_INIT verwendet wird, um eine gemeinsame Datenbankbetriebsklasse zu erstellen und die Datenbankinteraktion effizienter und sicherer durch angemessene Kapselung zu machen.
MySQLI :: STMT_INIT ist eine Methode in der MySQLI -Erweiterung, um ein MySQLi_stmt -Objekt zu initialisieren. Das Objekt von MySQLI_STMT stellt eine vorbereitete SQL -Anweisung dar, die bei der Ausführung von SQL -Abfragen effizienter als herkömmliche Abfragemethoden ist, insbesondere wenn mehrere ähnliche SQL -Abfragen ausgeführt werden müssen. Vorverarbeitungsanweisungen können die Zeit des SQL -Parsens verkürzen und die Ausführungseffizienz verbessern.
Leistungsverbesserung : Durch Vorverarbeitungsanweisungen erstellt und optimiert MySQL SQL -Abfragen einmal, ohne sie jedes Mal zu analysieren.
Verhindern Sie die SQL -Injektion : Durch Bindungsparameter wird das direkte Einfügen von Benutzereingabedaten vermieden, wodurch die SQL -Injektionsangriffe effektiv verhindert werden.
Wiederverwendbarkeit von Code : Nach der Einkapselung der Datenbankbetriebsklasse kann sie an verschiedenen Stellen wiederverwendet werden, um die Wiederverwendbarkeit des Codes zu verbessern.
Zunächst müssen wir eine Datenbankverbindungsklasse erstellen und SQL -Operationen mit MySQLI :: STMT_INIT zusammenfassen.
class Database {
private $mysqli;
public function __construct($host, $username, $password, $dbname) {
// Erstellen Sie eine Datenbankverbindung
$this->mysqli = new mysqli($host, $username, $password, $dbname);
// Überprüfen Sie die Verbindung
if ($this->mysqli->connect_error) {
die("Connection failed: " . $this->mysqli->connect_error);
}
}
// Vorbereiten SQL Anweisung und Ausführung
public function executeQuery($sql, $params = []) {
// Initialisierungsanweisung
$stmt = $this->mysqli->stmt_init();
// Vorbereiten SQL Stellungnahme
if (!$stmt->prepare($sql)) {
die("Error in preparing statement: " . $stmt->error);
}
// Binden Sie Parameter
if (!empty($params)) {
// Parametertyp abrufen
$types = str_repeat('s', count($params)); // Angenommen, alle Parameter sind String -Typen
$stmt->bind_param($types, ...$params);
}
// Eine Frage ausführen
if ($stmt->execute()) {
// Rückgabeergebnissatz
return $stmt->get_result();
} else {
die("Error in executing statement: " . $stmt->error);
}
}
// Schließen Sie die Datenbankverbindung
public function close() {
$this->mysqli->close();
}
}
Im obigen Code verkapulieren wir eine Datenbank für Datenbankoperation, mit der alle SQL -Abfragen ausgeführt werden können. Bei der Verwendung müssen wir nur SQL -Anweisungen und Parameter übergeben.
Fügen Sie beispielsweise eine Daten ein:
$db = new Database('localhost', 'root', 'password', 'm66.net');
// Daten einfügen
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$params = ['John Doe', 'johndoe@m66.net'];
$db->executeQuery($sql, $params);
Abfragedaten:
$sql = "SELECT * FROM users WHERE email = ?";
$params = ['johndoe@m66.net'];
$result = $db->executeQuery($sql, $params);
// Ausgangsergebnis
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row['name'] . ", Email: " . $row['email'] . "<br>";
}
$db->close();
Neben der Ausführung einer einzelnen SQL -Abfrage kann die eingekapselte Datenbankbetriebsklasse auch Stapelvorgänge unterstützen. Durch Hinzufügen einer Stapelbetriebsmethode zur Klasse können wir mehrere Datenoperationen effizient ausführen.
public function executeBatchQuery($sql, $paramsList) {
// Initialisierungsanweisung
$stmt = $this->mysqli->stmt_init();
// Vorbereiten SQL Stellungnahme
if (!$stmt->prepare($sql)) {
die("Error in preparing statement: " . $stmt->error);
}
// Parametertyp abrufen
$types = str_repeat('s', count($paramsList[0])); // Angenommen, alle Parameter sind String -Typen
// Iterieren Sie die Parameterliste und führen Sie aus
foreach ($paramsList as $params) {
$stmt->bind_param($types, ...$params);
$stmt->execute();
}
return true;
}
Daten in Chargen einfügen: