2017-04-08 73 views
0

真的不能完成我的项目,因为这种情况。我的项目是一个登录页面。 它总是继续第一个条件,但它是其他条件。我只是现在才开始学习这个PHP,虽然它上周正在教给我们。php - 如果其他条件的变量连接到数据库的情况下无法获得正确的

的login.php

<?php 
session_start(); 
include 'register/dbconnect.php'; 

$uid = $_POST['uid']; 
$pwd = $_POST['pwd']; 

$sql = "SELECT * FROM user WHERE uid='$uid' AND pwd='$pwd'"; 
$result = mysqli_query($connect, $sql); 

if (!$row = mysqli_fetch_assoc($result)) { 
    header("Location: index.php"); 
} else { 
    header("Location: login/home/home.php"); 
} 
?> 

的index.php(在登录表单部分)

<form action="login.php" method="POST"> 

    <input type="text" name="uid" class="loginField" placeholder="Enter your username" required><br /> 

    <input type="password" name="pwd" id="passss" class="loginField" placeholder="Enter your password" required> 

    <img src="withAcc/img/blindeye.png" onMouseOver="showPass()" onMouseOut="hidePass()" id="eye1" class="eyes"><br /><br /> 

    <p><input type="checkbox" id="keepSigned" value=""> <label for="keepSigned">Stay signed in</label> &nbsp;&nbsp;&nbsp;&nbsp; 

    Forgot <a href="" style="color: #AA7F03">password</a>?</p> 

    <input type="Submit" value="Login" id="logInBut" ><br /> 

    <p>Do you have an account? <a href="register/register.php" style="color: #AA7F03">Register</a></p> 

</form> 

被修改的login.php

if (!$row = $result->fetch_assoc()) { 
    header("Location: index.php"); 
} else { 
    header("Location: login/home/home.php"); 
} 

我编辑它像这样,但它既不可行。它总是去index.php,尽管用户名和密码存储在数据库中。

+0

这是一个非常奇怪的“if”条件。检查返回的行数是否更直观?另外,你的代码对SQL注入是开放的,并且在执行查询之后你不会检查错误。 – David

+0

哦,我真的很抱歉。我新来这个PHP和SQL。 我只想做一个登录表单,可以检查帐号是否存在。我只是从网上收集这些代码。不知道什么SQL注入是 –

+0

没问题,现在是一个很好的学习时间。 Stack Overflow在这个主题上已经有了一组相当不错的答案:http:// stackoverflow。com/questions/60174/how-can-i-prevent-sql-injection-in-php这不一定直接与你现在遇到的问题直接相关,但总的来说它会非常有用。 (作为额外的好处,准备好的语句更容易调试和维护,因此开始时出现的问题更少。) – David

回答

0

这是一个非常奇怪的情况:

if (!$row = mysqli_fetch_assoc($result)) { 

我不禁想,如果运算符优先级和查询一些成功的组合/失败都将在这里静静地产生意想不到的效果。我想这样做的更直观的方法是检查number of rows in the query result

if (mysqli_num_rows($result) > 0) { 

然而,也有你应该也圆了这一点,好一点的一对夫妇的其他改进。首先,如上面对上述问题的评论所述,您一定要使用准备好的语句avoid SQL injection。这不仅对于安全性,而且对于代码的一般稳定性和调试都很重要。 (直接使用输入作为您当前的代码,使您对该代码的语法更负责任,这往往会导致错误。)

此外,在执行查询之后(并在检查该查询的结果之前,在您的if声明之前),您应该检查查询是否成功。如果不成功,您的$result变量将为null。因此,检查$result是否为null,如果是,则不要尝试使用它登录。而应该使用examine the error from the database。事情就这么简单:

echo mysqli_error($connect); 

而且,这是非常重要,你目前存储明文用户密码。这是一件非常非常糟糕的事情。用户密码应该总是被散列,以便他们不能以以原始形式检索。 PHP has some built-in functionality to help with this

+0

感谢您的帮助,但我认为行数不是我需要的。相反,数据存储在我的数据库中。 如何获取数据库中的数据,并将其与用户输入进行比较是我想解决的问题。 –

+0

@ M.Fajardo:这是对你在代码中做什么的一个非常根本的改变,也是你在问题中提出的问题。为此我想我所能做的就是推荐你看看PHP/MySQL上的一些教程。现在你基本上问“如何从数据库读取数据”,这对于堆栈溢出问题来说有点过于宽泛。我们可以帮助解决具体问题,例如问题中的问题。但我们并没有提供完整的教程。 – David

+0

好吧,我明白了,我会再试一次。 –

相关问题