我在单独的文件中有以下mysqli配置设置:
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
现在,我在另一个文件的类中有一些函数。 就像:
function username_exists($username){
global $mysqli;
if ($stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?")) {
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->store_result();
$count=$stmt->num_rows;
$stmt->close();
}
return ($count > 0 ? true : false);
}
我在想:
为什么我需要加入global $mysqli
;在类中的每个函数内部,如果我不包含,我会收到如下错误消息:
致命错误:在...中的非对象上调用成员函数prepare()
$stmt->store_result();
做了什么?如果我不包含它,则返回0行。
$stmt->close();
? (例如,我在该函数下面有其他函数,我是否需要在每个函数的末尾或类中最后一个函数的结尾使用它?感谢。
答案 0 :(得分:1)
第一个问题:如果您的对象引用$mysqli
是在函数外定义的,那么它必须作为参数传递给函数,如function username_exists($username, $mysqli)
或引用global
个关键字。函数参数方法可能更可取,以避免在函数范围的上下文中使用全局范围变量。如果您不执行其中任何一项,则函数内部不知道$mysqli
,因为函数无法在其自身范围之外看到。
如果您想避免引用全局$mysqli
,我建议将MySQLi对象包含为您的类的成员。传入现有MySQLi对象后,您可以在每个函数中将其引用为$this->mysqli
class My_Class()
{
public $mysqli;
// everything else
function some_func()
{
$this->mysqli->prepare();
// etc
}
}
$x = new My_Class();
$x->mysqli = $mysqli; // or new mysqli("localhost", "my_user", "my_password", "world");
第二个问题: $stmt->store_result()
从execute()
调用的已完成查询中检索完整结果集。没有它,MySQLi还没有请求从MySQL服务器返回任何结果,即使查询可能已经成功。只有返回行的SELECT
查询才有必要。
第三个问题:如果在循环中反复调用相同的SQL语句,则每次迭代后都不需要调用$stmt->close()
。在其他情况下调用$stmt->close()
是一个好主意,释放内存并让MySQL服务器知道你已经完成了使用该语句和结果集。