Maison > développement back-end > tutoriel php > Pourquoi mon mysqli::query() échoue-t-il avec une erreur de connexion à la base de données « Impossible de récupérer mysqli » ?

Pourquoi mon mysqli::query() échoue-t-il avec une erreur de connexion à la base de données « Impossible de récupérer mysqli » ?

Susan Sarandon
Libérer: 2024-12-07 21:05:14
original
845 Les gens l'ont consulté

Why is my mysqli::query() failing with a

Mysqli::query() : erreur de connexion à la base de données

L'erreur "mysqli::query() : impossible de récupérer mysqli" indique généralement un problème avec la connexion à la base de données. Les étapes suivantes décrivent le problème et fournissent une solution basée sur l'extrait de code fourni :

  1. Connexion : dans le fichier de connexion, le symbole @ dans new mysqli() est utilisé pour supprimer les rapports d'erreurs. Bien que cela vise à empêcher l'affichage des erreurs, il est préférable de gérer les erreurs correctement au lieu de les ignorer.
  2. Fermeture : Dans le constructeur de classe, vous attribuez $DBConnect à une variable membre de la classe. Cela garantit que l’objet de connexion est disponible dans toute la classe. Cependant, dans la méthode __destruct(), vous fermez la connexion s'il n'y a pas d'erreur de connexion. Il s'agit d'un problème car les requêtes suivantes échoueraient car la connexion n'est plus disponible.
  3. Réouverture : La méthode __wakeup() est destinée à rouvrir la connexion après la sérialisation. Cependant, elle n'est pas invoquée lorsque la classe est instanciée, ce qui signifie que la connexion reste fermée.

Solution :

  1. Supprimer le symbole @ à partir de l’instanciation de l’objet de connexion. Gérez les erreurs de manière plus robuste.
  2. Déplacez le code de fermeture de connexion vers une méthode distincte et appelez-le uniquement lorsqu'il est nécessaire de fermer la connexion.
  3. Assurez-vous que la méthode __wakeup() est invoquée lorsque la classe est instanciée (par exemple, lors de la récupération d'un objet d'une session).

Modifié Code :

// Connection file
$DBConnect = new mysqli("localhost", "root@localhost", NULL, "Ladle");

// Check for connection error
if ($DBConnect->connect_errno) {
    $ErrorMsgs[] = "The database server is not available. Connect Error is " . $DBConnect->connect_errno . " " . $DBConnect->connect_error . ".";
}

// Class
class EventCalendar {
    private $DBConnect = NULL;

    function __construct() {
        include("inc_LadleDB.php");
        $this->DBConnect = $DBConnect;
    }

    function __destruct() {
        // Close the connection only if it's not closed already
        if (!$this->DBConnect->connect_error) {
            $this->DBConnect->close();
        }
    }

    function __wakeup() {
        // Include the database connection data
        include("inc_LadleDB.php");
        $this->DBConnect = $DBConnect;
    }
    
    // Event adding method
    // ...
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal