繁体   English   中英

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

[英]Fatal error: Call to a member function query() on a non-object Error

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

致命错误:第 9 行在 C:\\xampp\\htdocs\\members\\includes\\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,里面的一切都很好。

我不明白为什么,我第一次尝试它的时候我猜它可以工作,现在出现这种错误。

我还有用于连接 MYSQL 的 db.php,里面的一切都很好..有人能解释一下为什么我一直面临这个错误吗?

我来推测一下。 我推测您有一个单独的文件(可能称为db.php ),它“处理”数据库连接的设置。 我将进一步推测您有一系列文件,这些文件被require() (或include() )放入您的网络应用程序中。

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

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

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

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

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

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

从您提供的代码示例中,实际上很难判断您可能使用的是哪种连接对象,但我认为可以说在您的情况下它可能是PDOmysqli

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

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

尽管您确实应该使用所谓的准备好的语句,因为正如 wally 已经说过的那样,您现在的代码很容易受到 SQL 注入。

我会链接沃利的答案,并为您提供与准备好的声明相关的 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 = 新数据库();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM