我有这个php功能
function showfeed($query_){
$query = $con->query($query_);
while ($row=$query->fetch_row()) {
...
}
这就是我运行此功能的方式
showfeed("SELECT * FROM uploads WHERE uploads.username = '$NameId' OR uploads.username IN(
SELECT username FROM followers WHERE uploads.username = followers.following)ORDER BY `Date` DESC LIMIT 0,100");
但是当我尝试运行该功能时,我收到此错误
Call to a member function query() on null
答案 0 :(得分:3)
$con
未在showFeed
函数范围内定义。
您应该将$con
作为参数传递给函数
function showFeed($con, $query) {
$query = $con->query($query);
...
}
或使用全局变量
function showFeed($query)
global $con;
$query = $con->query($query);
...
}
警告:取决于全局变量,很多会让你的程序变得非常非常糟糕。你应该尽可能地避免使用全局变量。
但是,对于单例(例如数据库连接$con
),通常使用全局变量。一个常见的解决方法是使用可能看起来像这样的单例类
class Db {
static private $con;
static connection() {
// if no connection exists
if (!self::$con)
// store a reference to a new connection here
// mysqli_connect is an example here; your code might differ for creating $con
self::$con = mysqli_connect(...);
// return the connection reference
return self::$con;
}
}
现在,因为PHP总是允许你在任何函数中引用Db
类(在同一个namespace中),所以你不必再使用全局变量了
function showFeed($query) {
$query = Db::connection()->query($query);
}
在这种情况下,为query
课程制作Db
静态方法也是有意义的。
class Db {
static private $con;
static public connection() {
if (!self::$con)
self::$con = mysqli_connect(...);
return self::$con;
}
static public query($query) {
// we can get the connection from ourself!
return self::connection()->query($query)
}
}
现在你的功能可以简化了
function showFeed($query) {
$query = Db::query($query);
}
当然,你不想过分夸大它。我不知道您的特定示例中是什么$con
- 您使用的任何库/适配器都可能内置了一些这些内容。这些仅作为示例帮助您以不同方式思考问题。 / p>
答案 1 :(得分:0)
这是因为$ con在你的函数中没有范围,你需要传入它或通过类I.e $this->conn
使其范围可见。