将 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 或大量全局函数),这真的很有帮助。例如:继承:如果您正在使用诸如 MVC 之类的东西,或者您需要让对象共享功能,则此模式非常有用。结合单例,您可以为每个请求保留一个数据库连接,并在成员变量中轻松访问数据库实例。public function foo() $results = Db::getInstance()->query("SELECT * FROM bar"); // Do other stuff return $results;
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 连接传递给全局保护构造函数