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 ?,?"); }
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);
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 ?,?"); }
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 ?,?");
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!