将 MySQL 连接传递给函数

Posted

技术标签:

【中文标题】将 MySQL 连接传递给函数【英文标题】:Pass MySQL connection to function 【发布时间】:2011-03-15 00:58:24 【问题描述】:

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

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

$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

谢谢

【问题讨论】:

$queries 是如何创建的? 你在设置 $queries = new queries() 吗? 【参考方案1】:

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

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

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

【讨论】:

你到底是什么意思?你是说我可能已经为 $queries 分配了一个变量? @phoffer 你给变量 $queries 赋值了吗? @phoffer 这意味着您应该已经创建了一个查询实例作为 $queries,即根据您对问题的评论 - $queries = new queries() @Scott Saunders - 谢谢,在初始编辑后的几秒钟内修复了它;) @Matchu 这绝对是有道理的(在编辑之后),这正是问题所在。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我真的不建议您像这样构建您的代码。绕过 mysql 连接会使你的函数签名变得非常混乱。另外两个选项是:

单例模式:将您的数据库交互函数封装到一个类中,然后每次需要调用其中一个时,您就获取该类的一个实例。这种方法的好处是你总是得到 same 数据库连接,而不是打开许多请求。如果您不使用繁重的 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");
  

【讨论】:

【参考方案5】:

虽然我同意在方法/函数中传递数据库处理程序可能不是最好的主意,但通过构造函数将数据库对象传递给类并不脏,尤其是在您有多个连接的情况下。

【讨论】:

以上是关于将 MySQL 连接传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

您将如何“即时”连接文本+整数并将其传递给函数? [复制]

如何将@liaoliaots/nestjs-redis redis 连接传递给全局保护构造函数

实体框架 MySQL DbContext 无法连接

将 vars 传递给 mysql.connector.connect

将连接字符串传递给代码优先的 DbContext

将蓝牙连接传递给新的 Activity