我有一个小问题。我正在尝试使用会话制作一个简单的注册/登录系统,但出现此错误:
致命错误:在第 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 = 新数据库((;