我正在尝试从类中运行对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文件中,但仍然无效;但是,我在外部.php文件中以及主.php文件中使用了完全相同的代码(查询,准备,执行,bind_result和获取部分),并且它已经工作了两次。这让我相信你无法从一个类中运行查询,或者有一种不同的方式来执行此操作。有人能指出我正确的方向吗?
由于
答案 0 :(得分:7)
您必须将数据库对象传递给方法,因为它们不在同一范围内:
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>";
}
}
};
并将其称为
$a = new theClass($mysqli);
$a->runQuery();
这两种方法都清楚地表明你的类的依赖是一个mysqli对象,这有利于将来的维护和可读性。
答案 1 :(得分:2)
您需要将$ 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>";
}
}
};