Position actuelle: Accueil> Derniers articles> Comment encapsuler STMT_INIT en tant que classe d'opération de base de données générale

Comment encapsuler STMT_INIT en tant que classe d'opération de base de données générale

M66 2025-05-17

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.

1. Quelle est la fonction mysqli :: stmt_init ?

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.

2. Avantages de l'utilisation de mysqli :: stmt_init

  • 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.

3. Classes de fonctionnement de la base de données communes encapsulées

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 .

3.1 Classe de connexion de la base de données

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

3.2 Utilisez cette classe pour effectuer des opérations de base de données

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

3.3 Fonctions étendues: opération par lots

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&#39;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: