通过函数运行PHP查询

时间:2016-10-11 18:04:55

标签: php

我有这个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

2 个答案:

答案 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使其范围可见。