Я пытаюсь запустить запрос в базу данных 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>"; } } };