запрашивать базу данных mysql внутри класса

Я пытаюсь запустить запрос в базу данных MySQL из класса, и он почему-то не работает. У меня есть класс в отдельном файле, с которым я связываюсь с функцией require_once() .

вот как выглядит главный .php-файл:

 <?php require_once("connect.php"); require_once("theClass.php"); $a = new theClass; $a->runQuery(); } 

connect.php:

 <?php //connect to mySQL database $mysqli = new mysqli("host", "user", "password", "db"); if ($mysqli->connect_errno) { echo "<br><h1>Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error . "</h1><br>"; } 

theClass.php:

 <?php require_once('connect.php'); class theClass { //class variables and other functions here function runQuery() { $query = "SELECT col_1 FROM db.table"; $stmt = $mysqli->prepare($query); stmt->execute(); $stmt->bind_result($r); while($stmt->fetch()) { echo $r . "<br>"; } } }; в <?php require_once('connect.php'); class theClass { //class variables and other functions here function runQuery() { $query = "SELECT col_1 FROM db.table"; $stmt = $mysqli->prepare($query); stmt->execute(); $stmt->bind_result($r); while($stmt->fetch()) { echo $r . "<br>"; } } }; 

Я пробовал копировать класс в основной .php-файл, и он все еще не работает; однако я использовал тот же самый код (запрос, подготовить, выполнить, bind_result и fetch part) во внешнем файле .php, а также внутри основного .php-файла, и он работал оба раза. Это заставляет меня думать, что вы не можете запускать запросы внутри класса или что есть другой способ сделать это. Может ли кто-нибудь указать мне в правильном направлении?

благодаря

Передайте его самому методу

Вы должны передать объект базы данных методу, потому что они не находятся в одной области:

 function runQuery($mysqli) 

и назовите его

 $a = new theClass; $a->runQuery($mysqli); 

Передайте его конструктору

Если ваш класс делает много вызовов в базе данных, вы можете просто передать его в конструкторе и сохранить его как приватную переменную для последующего использования:

 class theClass { private $mysqli; function __construct($mysqli) { $this->mysqli = $mysqli; } function runQuery() { $query = "SELECT col_1 FROM db.table"; $stmt = $this->mysqli->prepare($query); stmt->execute(); $stmt->bind_result($r); while($stmt->fetch()) { echo $r . "<br>"; } } }; в class theClass { private $mysqli; function __construct($mysqli) { $this->mysqli = $mysqli; } function runQuery() { $query = "SELECT col_1 FROM db.table"; $stmt = $this->mysqli->prepare($query); stmt->execute(); $stmt->bind_result($r); while($stmt->fetch()) { echo $r . "<br>"; } } }; 

и назовите его

 $a = new theClass($mysqli); $a->runQuery(); 

Оба метода дают понять, что зависимость вашего класса – это объект mysqli, который хорош для будущего обслуживания и удобочитаемости.

Вам нужно либо передать $ mysqli в качестве параметра, либо использовать глобальный $ mysqli

 <?php require_once('connect.php'); class theClass { //class variables and other functions here function runQuery() { global $mysqli; $query = "SELECT col_1 FROM db.table"; $stmt = $mysqli->prepare($query); stmt->execute(); $stmt->bind_result($r); while($stmt->fetch()) { echo $r . "<br>"; } } }; в <?php require_once('connect.php'); class theClass { //class variables and other functions here function runQuery() { global $mysqli; $query = "SELECT col_1 FROM db.table"; $stmt = $mysqli->prepare($query); stmt->execute(); $stmt->bind_result($r); while($stmt->fetch()) { echo $r . "<br>"; } } };