Bei der Entwicklung von PHP, insbesondere in der MVC-Architektur (Modell-View-Controller), ist die Verwaltung von Datenbankvorgängen ein zentrales Problem. Die MySQLI -Erweiterung ist eine häufige Möglichkeit, in MySQL -Datenbanken in PHP zugreifen zu können, und die Funktion von MySQLi_Result wird verwendet, um das Ergebnissatz aus einer Datenbankabfrage abzurufen. In der MVC -Architektur kann der Code aufgebläht, schwer zu warten und sogar schwer zu skalieren, wenn Datenbankabfragen und Ergebnissätze direkt im Controller verarbeitet werden. Daher ist es ein Problem, das die Entwickler lösen müssen, um die Wartbarkeit und Skalierbarkeit des Codes zu verbessern, um die Wartbarkeit und Skalierbarkeit des Codes zu verbessern.
In diesem Artikel wird vorgestellt, wie die Verwendung von MySQLI_Result im MVC -Modus elegant zusammenfasst und relevante Codebeispiele angibt.
In der MVC -Architektur ist die Aufteilung der Verantwortlichkeiten sehr wichtig:
Modell : Verantwortlich für die Interaktion mit Datenquellen (z. B. Datenbanken), verkörperte Datenabfrage und Aktualisierung von Vorgängen.
Ansicht : Verantwortlich für die Datenanzeige, in der Regel nicht mit Datenbankvorgängen.
Controller : Empfängt Benutzereingaben, ruft das entsprechende Modell auf, um Daten zu verarbeiten, und übergibt das Ergebnis an die Ansicht.
Um den Code klar und kohärent zu halten, sollten wir uns die Logik der Interaktion mit der Datenbank in der Modellschicht konzentrieren, und der Controller muss nur Methoden im Modell aufrufen, um die Daten zu erhalten.
Das MySQLi_Result -Objekt ist das Ergebnis, das durch Ausführung der Anweisung Abfrage zurückgegeben wurde. Um die Wartbarkeit und Skalierbarkeit des Codes zu verbessern, sollten wir es vermeiden, das MySQLI_Result -Objekt im Controller direkt zu manipulieren. Gründe sind:
CODE -Duplikation : Wenn die Bearbeitung von Abfragen an mehreren Stellen führt, ist es einfach, einen doppelten Code zu verursachen.
Schwierig zu testen : Die direkte Manipulation des Objekts von MySQLI_Result macht Unit -Tests schwierig.
Schlechte Skalierbarkeit : Der direkte Betrieb von MySQLI_Result macht es schwierig, den Datenbanktreiber später zu erweitern (z. B. das Wechsel von MySQL zu PostgreSQL).
Daher sollten wir den Betrieb des MySQLi_Result -Objekts so einkapseln, dass es zu einem unabhängigen Modul wird, das in verschiedenen Szenarien wiederverwendet werden kann und einfacher geändert und erweitert werden kann.
Zunächst können wir eine abstrakte Datenbank erstellen, die für die Behandlung von Datenbankverbindungen und Abfragevorgängen verantwortlich ist. Diese Klasse gibt das eingekapselte Ergebnissatz zurück, um das direkte Manipulieren des MySQLi_Result -Objekts im Controller zu vermeiden.
<?php
abstract class Database {
protected $connection;
public function __construct($host, $username, $password, $dbname) {
$this->connection = new mysqli($host, $username, $password, $dbname);
if ($this->connection->connect_error) {
die("Connection failed: " . $this->connection->connect_error);
}
}
abstract public function query($sql);
}
?>
Erstellen Sie dann eine bestimmte Datenbankklasse, die aus der Datenbankklasse erbt. Diese Klasse wird die Operationen der Abfragung und des Erhaltens des Ergebnissatzes zusammenfassen.
<?php
class MySQLDatabase extends Database {
public function query($sql) {
$result = $this->connection->query($sql);
if ($result === false) {
return false; // Rückkehr, wenn die Abfrage fehlschlägt false
}
return new MySQLResult($result); // Gibt das eingekapselte Ergebnis -Set -Objekt zurück
}
}
?>
Als nächstes erstellen wir eine MySQLResult -Klasse, um das Objekt mySQLi_Result zu verkörpern. Diese Klasse bietet einige bequeme Methoden, um den Betrieb von Abfrageberichten zu vereinfachen.
<?php
class MySQLResult {
private $result;
public function __construct(mysqli_result $result) {
$this->result = $result;
}
public function fetchAll() {
return $this->result->fetch_all(MYSQLI_ASSOC); // Holen Sie sich alle Daten
}
public function fetchRow() {
return $this->result->fetch_assoc(); // Holen Sie sich eine Datenlinie
}
public function numRows() {
return $this->result->num_rows; // Holen Sie sich die Anzahl der Zeilen im Ergebnissatz
}
public function free() {
$this->result->free(); // Füllen Sie das Ergebnissatz frei
}
}
?>
In dieser Klasse verkapulieren wir einige gängige Operationen von MySQLI_Result , wie z. Dadurch wird die Datenbankabfragevorgänge prägnanter und einfacher zu warten.
Im Controller können wir Daten durch Aufrufen von Methoden im Modell erhalten, ohne sich darum zu kümmern, wie das Objekt mySQLI_Result betrieben wird.
<?php
class UserController {
private $db;
public function __construct() {
$this->db = new MySQLDatabase('localhost', 'root', '', 'my_database');
}
public function getUserList() {
$sql = "SELECT * FROM users";
$result = $this->db->query($sql);
if ($result === false) {
echo "Query failed.";
return;
}
$users = $result->fetchAll(); // Holen Sie sich alle Benutzerdaten
foreach ($users as $user) {
echo "User: " . $user['name'] . "<br>";
}
$result->free(); // Füllen Sie das Ergebnissatz frei
}
}
?>
Im Controller rufen wir die Abfragemethode des Datenbankmodells für die Abfrage auf. Das zurückgegebene MySQLResult- Objekt kann alle Ergebnisse über Fetchall () oder Fetchrow () verwenden, um Einzelliniendaten zu erhalten. Auf diese Weise wird der Code des Controllers sehr präzise und die Logik wird vollständig von der Datenbankoperation getrennt, wodurch es einfach ist, zu warten und zu erweitern.
Indem wir das Objekt von MySQLi_Result in der MVC -Architektur zusammenfassen, konzentrieren wir nicht nur Datenbankvorgänge auf die Modellschicht, sondern verbessern auch die Wartbarkeit und Skalierbarkeit unseres Codes. Durch die Verwendung der eingekapselten MySQLResult -Klasse kann die Verarbeitung von Abfrageergebnissen vereinfacht werden, sodass der Controller sich auf die Geschäftslogik konzentrieren kann, ohne sich um die zugrunde liegende Datenbankimplementierung zu kümmern. Dieser Ansatz hat große Vorteile für die Zusammenarbeit der Teams und die spätere Erweiterung.