[英]Fatal error: Call to a member function query() on a non-object in (CodeIgniter)
[英]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
可能根本没有定义,或者它不是一个对象(因此是错误消息)。
从您提供的代码示例中,实际上很难判断您可能使用的是哪种连接对象,但我认为可以说在您的情况下它可能是PDO或mysqli 。
为了简单起见,让我们坚持使用 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.