Dans le développement de PHP, les opérations de base de données sont une partie indispensable et les opérations communes incluent l'addition, la suppression, la modification et la recherche. Cependant, les méthodes d'interaction de la base de données traditionnelles ont souvent des problèmes tels que la redondance du code, les vulnérabilités d'injection SQL et les goulots d'étranglement des performances. Afin d'améliorer l'efficacité d'interaction de la base de données et d'améliorer la réutilisabilité du code, nous pouvons utiliser la méthode MySQLI :: STMT_INIT pour encapsuler une classe de fonctionnement de la base de données générale. De cette façon, non seulement l'efficacité peut être améliorée, mais les vulnérabilités d'injection SQL peuvent également être évitées.
Dans cet article, nous présenterons en détail comment utiliser la fonction MySQLI :: STMT_INIT pour créer une classe d'opération de base de données commune et rendre l'interaction de la base de données plus efficace et sécurisée grâce à une encapsulation raisonnable.
MySQLI :: STMT_INIT est une méthode dans l'extension MySQLI pour initialiser un objet MySQLI_STMT . L'objet MySQLI_STMT représente une instruction SQL préparée qui est plus efficace que les méthodes de requête traditionnelles lors de l'exécution de requêtes SQL, en particulier lorsque plusieurs requêtes SQL similaires doivent être exécutées. Les déclarations de prétraitement peuvent réduire le temps de l'analyse SQL et améliorer l'efficacité de l'exécution.
Amélioration des performances : grâce à des instructions de prétraitement, MySQL compile et optimise les requêtes SQL une fois sans les analyser à chaque fois.
Empêcher l'injection SQL : par paramètres de liaison, il évite d'insérer directement les données d'entrée utilisateur, empêchant ainsi efficacement les attaques d'injection SQL.
Réutilisabilité du code : Après avoir encapsulé la classe de fonctionnement de la base de données, il peut être réutilisé à différents endroits pour améliorer la réutilisabilité du code.
Tout d'abord, nous devons créer une classe de connexion de base de données et encapsuler les opérations SQL à l'aide de mysqli :: stmt_init .
class Database {
private $mysqli;
public function __construct($host, $username, $password, $dbname) {
// Créer une connexion de base de données
$this->mysqli = new mysqli($host, $username, $password, $dbname);
// Vérifiez la connexion
if ($this->mysqli->connect_error) {
die("Connection failed: " . $this->mysqli->connect_error);
}
}
// Préparer SQL Déclaration et exécuter
public function executeQuery($sql, $params = []) {
// Instruction d'initialisation
$stmt = $this->mysqli->stmt_init();
// Préparer SQL Déclaration
if (!$stmt->prepare($sql)) {
die("Error in preparing statement: " . $stmt->error);
}
// Lier les paramètres
if (!empty($params)) {
// Obtenir le type de paramètre
$types = str_repeat('s', count($params)); // Supposons que tous les paramètres sont des types de chaînes
$stmt->bind_param($types, ...$params);
}
// Exécuter une requête
if ($stmt->execute()) {
// Ensemble de résultats de retour
return $stmt->get_result();
} else {
die("Error in executing statement: " . $stmt->error);
}
}
// Fermez la connexion de la base de données
public function close() {
$this->mysqli->close();
}
}
Dans le code ci-dessus, nous encapsulons une base de données de classe d'opération de base de données qui peut exécuter n'importe quelle requête SQL. Lorsque vous l'utilisez, nous n'avons qu'à passer des instructions et des paramètres SQL.
Par exemple, insérez des données:
$db = new Database('localhost', 'root', 'password', 'm66.net');
// Insérer des données
$sql = "INSERT INTO users (name, email) VALUES (?, ?)";
$params = ['John Doe', 'johndoe@m66.net'];
$db->executeQuery($sql, $params);
Données de requête:
$sql = "SELECT * FROM users WHERE email = ?";
$params = ['johndoe@m66.net'];
$result = $db->executeQuery($sql, $params);
// Résultat de sortie
while ($row = $result->fetch_assoc()) {
echo "Name: " . $row['name'] . ", Email: " . $row['email'] . "<br>";
}
$db->close();
En plus d'exécuter une seule requête SQL, la classe de fonctionnement de la base de données encapsulée peut également prendre en charge les opérations par lots. En ajoutant une méthode de fonctionnement par lots à la classe, nous pouvons effectuer efficacement plusieurs opérations de données.
public function executeBatchQuery($sql, $paramsList) {
// Instruction d'initialisation
$stmt = $this->mysqli->stmt_init();
// Préparer SQL Déclaration
if (!$stmt->prepare($sql)) {
die("Error in preparing statement: " . $stmt->error);
}
// Obtenir le type de paramètre
$types = str_repeat('s', count($paramsList[0])); // Supposons que tous les paramètres sont des types de chaînes
// Itérer sur la liste des paramètres et exécuter
foreach ($paramsList as $params) {
$stmt->bind_param($types, ...$params);
$stmt->execute();
}
return true;
}
Insérer des données par lots: