2010-08-30 232 views
3

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

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(); 
} 

这是据我已经得到了由PHP.net例子去,但我得到这个错误:

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\classes\user.class.php on line 14

(该$db变量一个在我的用户类处理,并且正常工作)

这似乎只是文档远的人谁之前的人谁是适度的新类和OOP从未使用entention太复杂了。

有没有人有链接到页面解释如何连接/准备语句/执行查询和一切,或可以把它放在答案?

谢谢。

+2

您可能还想看看使用PDO扩展进行数据库访问。它有很多优点。 – Erik 2010-08-30 15:08:21

回答

2

问题是$db不在范围内(所以它被初始化为null)。如果你已经使用error_reporting到E_ALL你会看到有关尝试使用未初始化的变量$db通知......你需要以某种方式把$db到功能范围:

如果它是一个全球性的varaible:

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

如果它是一个成员变量(这功能是真正的对象的方法):

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

如果是别的东西,你可能需要将其传递:

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

啊啊。使用'$ this-> db-> prepare()'在我的数据库句柄通过我的类的构造函数中工作。谢谢 :) – Will 2010-08-30 16:35:22

2

$ 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风格虽然。

+0

那么,新的答案然后:) – Lekensteyn 2010-08-30 15:10:51

+0

当然其相关。你不能在你的函数中访问一个名为$ db的对象,这就是它导致错误的原因。 - > prepare是不会导致错误的,事实上$ db不是你函数范围内的对象就是错误。 '调用成员函数prepare()在*非对象*' – Erik 2010-08-30 15:11:23

+0

@Erik:该评论与原始答案(在编辑之前)有关,它表示'$ q'不是一个对象...目前的编辑是正确的(因此我已经删除了我可能引起混淆的评论)... – ircmaxell 2010-08-30 15:13:14

2

您遇到的错误意味着$db不是一个对象。

一种可能性是,你已经初始化$db一个函数调用,但尝试使用它里面一个功能 - 在这种情况下,你需要从使用global关键字的全局命名空间导入。在PHP中全局变量是不会自动可见的内部功能 - 你必须告诉PHP做一个全局变量可见:

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

另一种可能性是,它是FALSE如果你从mysqli_connect()分配给它的价值 - 机会是你的连接信息有一个错字或类似的东西。

+0

@ircmaxell - 通常OP不会发布完整的内容,所以我提供了两种可能的解释。 – Amber 2010-08-30 15:13:48

+0

够公平的(因此,我删除了我的评论)...编辑解释得很好(我原来的评论是在原始编辑中,不再适用)... +1 – ircmaxell 2010-08-30 15:15:00