致命错误:在非对象错误上调用成员函数 query()



我有一个小问题。我正在尝试使用会话制作一个简单的注册/登录系统,但出现此错误:

致命错误:在第 9 行的 C:\xampp\htdocs\members\include\login.inc.php 中对非对象调用成员函数 query((

这是相关的代码行:

$result = $conn->query($sql);

我第一次尝试它正在工作。

代码的其余部分:

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$email      = $_POST['email'];
$password   = md5($_POST['password']);
$sql = "SELECT email, password FROM member WHERE email = '$email' AND password = '$password'";
$result = $conn->query($sql);

我还有 db.php,它用于连接 MYSQL,里面的一切都很好。

我不

明白为什么,我第一次尝试它时我想它正在工作,现在出现了这种错误。

我也有数据库.php它用于连接MYSQL,里面的一切都很好..有人可以解释为什么我一直面临此错误吗?

我要推测一下。我推测您有一个单独的文件(可能称为db.php(,用于"处理"数据库连接的设置。 我进一步推测您有一连串文件,这些文件require()(或include()(到您的 Web 应用程序中。

我见过的次数比我记得的要多。 这是一种非常老式的方法,将代码分成PHP中的逻辑块 - 需要保留在过去。

我推测您之前在此代码之前包含(或必需(的另一个脚本中定义了$conn。 一个全局变量,在代码执行的后期具有依赖关系。 对声明它的文件不可见。

这就是问题所在。 快速/hack 修复是重命名$conn或恢复它的原始声明,并确保它是全局的,并确保在运行此代码之前包含它。

正确的解决方法(恕我直言(是查看使用框架(Laravel,Lumen,CodeIgniter,Yii,有很多 - 任你选择(并阅读依赖注入,自动加载和命名空间的主题。 想想为什么全局变量声明会导致代码不可维护。

如果你真的不愿意使用一个完整的框架,至少看看一些数据库抽象库,如doctrine(它是子库dbal(,它可以很容易地通过composer自动加载到你的项目中。

正如 Sascha 已经指出的那样,$conn可能根本没有定义,或者它不是一个对象(因此出现错误消息(。

从您提供的代码示例中,实际上很难判断您可能正在使用哪种连接对象,但我认为在您的情况下可能是 PDO 或 mysqli 是省钱的。

为了简单起见,让我们坚持使用 mysqli。基于 mysqli 的工作代码示例如下所示(从上面引用的文档中提取的缩短示例(:

$conn   = new mysqli("localhost", "my_user", "my_password", "world");
$result = $conn->query($sql);

虽然你真的应该选择所谓的预准备语句,因为你现在的代码很容易被SQL注入,正如Wally已经说过的那样。

我会链接 wally 的答案,并为您提供与准备好的语句相关的 PHP 文档的链接,但显然,我缺乏声誉点不允许我这样做,所以只需在 Google 上快速搜索 PHP 和准备好的语句。

必须在文件的开头添加数据库连接文件。

目前的格式很容易。

<?php  $mysqli = new mysqli("localhost", "Userid", "password", "database name"); if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; }
?>

开头:

需要"db.php"; $conn = 新数据库((;

最新更新