将MySQL连接传递给函数

时间:2010-07-12 21:56:28

标签: php mysql function mysqli

我正在尝试在主脚本中设置MySQL连接,然后根据我想要的操作调用各种函数。我无法将连接信息传递给函数。

我有一个类“查询”,其中包含各种函数,所有函数都返回一个数组。这是代码在我的主脚本中的样子(调用函数normal)

$mysqli = new mysqli($db_host, $db_user, $db_pass, $db_name) or die (mysql_error());
$stats = $queries->normal($mysqli);

然后在查询资源中,我有这个代码:

class queries {
    function normal($mysqli) {
        $query = "SELECT number, first, last FROM roster";
        $roster = $mysqli->query($query);

然后我继续做我需要的事情。我不能让这个工作。我收到了错误

Call to a member function normal() on a non-object

在我在主文件中调用该函数的行上。

这与这些问题类似,但我无法弄明白。
Passing database connection by reference in PHP
Ensuring MySQL connection works in PHP function

谢谢

5 个答案:

答案 0 :(得分:5)

$queries不是对象,更不是queries对象。找出你分配给它的东西,然后为它分配正确的东西:)

啊,我想我现在明白了。 queries是一个类,而不是一个对象。您需要创建一个对象,该对象是该类的实例。

$queries_obj = new queries;
$queries_obj->normal($mysqli);

答案 1 :(得分:2)

“在非对象上调用成员函数normal()”意味着您试图在不是对象的变量上调用normal()。可能你打算这样做:

$queries = new queries();
$stats = $queries->normal($mysqli);

答案 2 :(得分:1)

将您的类定义视为食谱,将对象视为您使用该食谱制作的实际菜肴。

正如其他人所说,您可能没有实例化(创建)该类的对象。

答案 3 :(得分:0)

我真的不建议像这样构建你的代码。传递mysql连接可以使您的函数签名非常混乱。另外两个选择是:

  • Singleton Pattern:将数据库交互函数封装到一个类中,然后每次需要调用其中一个时,就可以获取该类的实例。这种方法的优点在于,您始终可以获得相同的数据库连接,而不是打开许多请求。如果你没有使用大量的OO(许多程序性的PHP,或许多全局函数),这真的很有帮助。例如:
public function foo() {  
  $results = Db::getInstance()->query("SELECT * FROM bar");  
  // Do other stuff
  return $results;
}
  • 继承:如果您正在使用类似MVC的东西,或者您需要让对象共享功能,那么这种模式非常有用。结合单例,每个请求保持一个数据库连接,并在成员变量中轻松访问数据库实例。
class DB {
  public function __construct() {
    $this->conn = Db::getInstance();
  }
}


class Foo extends DB {
  public function foo() {
    $this->conn->query("SELECT * FROM bar");
  }
}

答案 4 :(得分:0)

虽然我同意在方法/函数中传递数据库处理程序可能不是最好的想法,但是通过构造函数将数据库对象传递给类并不脏,特别是如果你有多个连接。