我有一个小问题。我试图用会话创建一个简单的注册/登录系统,我收到了这个错误:
致命错误:在第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,里面的一切都很好。
答案 0 :(得分:1)
我无法理解为什么,我第一次尝试它是在工作,我猜,现在这种错误。
我还有用于连接MYSQL的db.php,内部的一切都很好..有人可以解释一下为什么我一直面临这个错误吗?
我要推测。我推测你有一个单独的文件(可能叫db.php
),其中&#34;处理&#34;设置数据库连接。我进一步推测,您有require()
(或include()
)进入您的网络应用的文件链。
我已经看过这个次数比我想起的要多。它是一种非常老式的方法,可以将代码分离到PHP中的逻辑块中 - 这需要留在过去。
我推测您之前在此代码之前包含(或需要)的另一个脚本中定义了$conn
。一个全局变量,后来在代码执行中具有依赖性。对其声明的文件不可见。
问题。快速/黑客修复是重命名 正确修复(恕我直言)是看一下使用框架(Laravel,Lumen,CodeIgniter,Yii,还有很多 - 请你选择)并阅读有关依赖注入的主题,自动加载和命名空间。想一想为什么全局变量声明会产生不可维护的代码。 如果你真的不愿意使用完整的框架,至少要看一些像$conn
或恢复它的原始声明,并确保它是全局的,并确保在运行此代码之前将其包含在中。< / p>
doctrine
这样的数据库抽象库(以及它的子库{{1} }})可以通过dbal
轻松自动加载到您的项目中。
答案 1 :(得分:0)
正如Sascha已经指出的那样,$conn
可能根本没有定义,或者它不是对象(因此错误消息)。
从您提供的代码示例中,实际上有点难以分辨您可能使用的是什么类型的连接对象,但我认为除了您的情况之外它可能是PDO或mysqli。
为了简单起见,让我们坚持使用mysqli。基于mysqli的工作代码示例如下所示(缩写示例取自上面引用的文档):
$conn = new mysqli("localhost", "my_user", "my_password", "world");
$result = $conn->query($sql);
虽然你真的应该选择所谓的预准备语句,因为你现在的代码很容易像我们已经说过的那样注入SQL。
我会将wally的答案联系起来,并为您提供与准备好的陈述相关的PHP文档的链接,但显然,我的信誉不足不允许我这样做,所以只需快速做一下谷歌搜索PHP&amp;准备好的陈述
答案 2 :(得分:0)
必须在文件的开头添加数据库连接文件。
当前格式很简单。
<?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; }
?>
答案 3 :(得分:-1)
一开始:
要求&#39; db.php&#39 ;; $ conn = new db();