Pourquoi est-ce que je reçois une erreur « Appel à une fonction membre préparer() sur un non-objet » en PHP ?

Patricia Arquette
Libérer: 2024-11-25 20:07:12
original
507 Les gens l'ont consulté

Why am I getting a

Appel à une fonction membre Prepare() sur une erreur non-objet en PHP

En PHP, l'"Appel à une fonction membre Prepare() sur une erreur non-objet en PHP" -object" se produit lorsque vous tentez d'appeler la méthode prepare() sur une variable qui n'est pas un objet. Cela se produit généralement lorsque la variable ne fait pas référence à une instance de la classe mysqli ou lorsque l'objet mysqli n'a pas été initialisé correctement.

Comprendre le problème

Dans votre code fourni, la variable $DBH n'est pas initialisée en tant qu'objet de la classe mysqli lorsque vous appelez la fonction selectInfo(). C'est pourquoi vous rencontrez l'erreur. Pour résoudre ce problème, vous pouvez utiliser l'une des approches suivantes :

Approche 1 : Utiliser la portée globale

global $DBH;
function selectInfo($limit, $offset) {
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}
Copier après la connexion

Cette approche déclare $DBH en tant que variable globale , vous permettant d'y accéder dans la fonction selectInfo(). Cependant, cela n'est pas considéré comme une bonne pratique car cela peut conduire à une pollution variable globale.

Approche 2 : Passer l'objet en tant que paramètre

function selectInfo($DBH, $limit, $offset) {
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}
selectInfo($DBH, 10, 20);
Copier après la connexion

Cette approche passe directement l'objet mysqli comme paramètre de la fonction selectInfo(). Elle est plus explicite et garantit que l'objet est correctement initialisé.

Approche 3 : Utiliser une fonction d'assistance de base de données

function getDBH() {
    static $DBH = null;
    if (is_null($DBH)) {
        $DBH = new mysqli("host", "test", "123456", "dbname");
    }
    return $DBH;
}

function selectInfo($limit, $offset) {
    $DBH = getDBH();
    $stmt = $DBH->prepare("SELECT * FROM information LIMIT ?,?");
}
Copier après la connexion

Cette approche utilise une fonction d'assistance pour récupérer l'objet mysqli et initialisez-le si nécessaire. Il garantit que l'objet est toujours disponible lors de l'appel de selectInfo().

Approche 4 : Utiliser une classe de base de données

class Database {
    private $DBH;

    public function __construct($host, $user, $pass, $dbname) {
        $this->DBH = new mysqli($host, $user, $pass, $dbname);
    }

    public function prepare($sql) {
        return $this->DBH->prepare($sql);
    }
}

$db = new Database("host", "test", "123456", "dbname");
$stmt = $db->prepare("SELECT * FROM information LIMIT ?,?");
Copier après la connexion

Cette approche encapsule la connexion à la base de données dans un classe. Il fournit un moyen propre et structuré d'accéder et de préparer des déclarations.

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