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
795 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!

source:php.cn
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