关于mysqli准备的问题

时间:2011-03-06 17:39:29

标签: php mysqli

我在单独的文件中有以下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);
    }

我在想:

  1. 为什么我需要加入global $mysqli;在类中的每个函数内部,如果我不包含,我会收到如下错误消息:

    致命错误:在...中的非对象上调用成员函数prepare()

  2. $stmt->store_result();做了什么?如果我不包含它,则返回0行。

  3. 每次查询后是否需要使用$stmt->close();? (例如,我在该函数下面有其他函数,我是否需要在每个函数的末尾或类中最后一个函数的结尾使用它?
  4. 感谢。

1 个答案:

答案 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服务器知道你已经完成了使用该语句和结果集。