任何人都可以指导我在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适度不熟悉的人来说,文档似乎过于复杂。
有没有人有链接到页面解释如何连接/准备语句/执行查询和所有内容或者可以将其放在答案中?
谢谢。
答案 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) {