2017-08-15 114 views
0

我有一个小问题。我试图与会话一个简单的注册/登录系统,我得到这个错误:致命错误:调用一个非对象的成员函数query()错误

Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\members\includes\login.inc.php on line 9

这是代码的相关行:

$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

_ $ conn_ defined是哪里? –

+0

无论您使用的是哪种数据库库,显然都不会在发生错误时抛出异常。 (强制性注释:请谷歌关于SQL注入和密码散列。) –

+0

寻求调试帮助的问题(“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误以及重现它所需的最短代码在问题本身。没有明确问题陈述的问题对其他读者无益。请参阅:如何创建[mcve]。使用“编辑”链接来改善你的*问题* - 不要通过评论添加更多信息。谢谢! – GhostCat

回答

1

I cannot understand why, the first time I tried it was working I guess and now this kind of error.

I'm also having the db.php which is used to connect the MYSQL and everything inside is fine.. could someone explain me why I keep facing this error ?

我打算推测。我在猜测你有一个单独的文件(可能叫db.php),它可以“处理”数据库连接的设置。我进一步猜测,你的文件链是require()(或include())'d到您的网络应用程序。

我见过这个比我还记得更多的次数。这是一种非常古老的将代码分离成PHP内部逻辑块的方式 - 这些方式需要留在过去。

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

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

适当修复(恕我直言)是看使用框架(Laravel,流明,笨,Yii中,有很多人 - 你挑)和依赖注入,自动加载和命名空间的主题阅读起来。想想为什么全局变量声明会导致不可维护的代码。

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

-1

开头:

需要'db.php'; $ conn = new db();

0

由于Sascha已经指出,$conn可能根本没有定义,或者它不是一个对象(因此是错误信息)。

从您提供的代码示例中,实际上很难分辨出您可能使用的连接对象类型,但我认为只是说您的情况可能是PDOmysqli

为了简单起见,让我们坚持使用mysqli。基于mysqli的一个工作代码示例是这样的(从文档采取缩短上面的例子举):

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

虽然你真的应该去为所谓的预处理语句,因为你的代码现在的问题是容易产生SQL正如wally所说的那样。

我会链接wally的答案,并提供一个链接到PHP文档有关准备的语句,但显然,我缺乏声誉点不允许我,所以只是做一个PHP的快速谷歌搜索&准备好的陈述

相关问题