正确使用MySQLi

时间:2010-08-30 15:04:29

标签: php oop class mysqli

任何人都可以指导我在PHP中使用MySQLi扩展的正确方法吗?我之前总是使用过程MySQL函数,并希望进行更改,但我发现PHP.net和其他网站上的示例太复杂了。似乎有多种方法可以做同样的事情。我想在以下方法中使用它:

function checkCredentials($username, $password)
{
    $q = $db->prepare("SELECT id FROM `users` WHERE username=? AND password=? LIMIT 1");
    $q->bind_param('ss', $username, $password);
    $q->execute();
}

就PHP34的例子而言,我已经得到了这个错误:

  

致命错误:调用成员函数   prepare()在非对象上   C:\ XAMPP \ htdocs中\类\ user.class.php   第14行

$db变量是我的用户类中的句柄,工作正常)

对于那些以前从未使用过的人来说,以及那些对班级和OOP适度不熟悉的人来说,文档似乎过于复杂。

有没有人有链接到页面解释如何连接/准备语句/执行查询和所有内容或者可以将其放在答案中?

谢谢。

3 个答案:

答案 0 :(得分:1)

$ db未声明为全局。 将global $db放在函数中:

function checkCredentials($username, $password)
{
    global $db;
    $q = $db->prepare("SELECT id FROM `users` WHERE username=? AND password=? LIMIT 1");
    $q->bind_param('ss', $username, $password);
    $q->execute();
}

虽然这不是一个好的OOP风格。

答案 1 :(得分:1)

您获得的错误意味着$db不是对象。

一种可能性是您在函数调用之外初始化了$db ,但是正在尝试使用 in 函数 - 在这种情况下您需要使用global关键字从全局命名空间导入它。 PHP中的全局变量在函数内部不会自动显示 - 您必须告诉PHP使全局变量可见:

function foo() {
    global $db;
    // do stuff with $db
}

另一种可能性是FALSE,如果您从mysqli_connect()分配值,则可能是您的连接信息有拼写错误或类似内容。

答案 2 :(得分:1)

问题是$db不在范围内(因此它被初始化为null)。如果你有错误报告到E_ALL,你会看到关于尝试使用未初始化变量$db的通知......你需要以某种方式将$db带入函数范围:

如果它是全球可变的:

function checkCredentials($username, $password) {
    global $db;

如果它是一个成员变量(该函数实际上是一个对象中的方法):

function checkCredentials($username, $password) {
    $q = $this->db->prepare();

如果是其他内容,您可能希望将其传递给:

function checkCredentials($username, $password, $db) {