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 :
-
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.
-
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.
-
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 :
- Supprimer le symbole @ à partir de l’instanciation de l’objet de connexion. Gérez les erreurs de manière plus robuste.
- 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.
- 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!