2015-07-12 32 views
1

我一直在试图编写一个PHP程序,使用户能够注册一个帐户和登录后才能登录。我已经设法阻止多个用户名的注册,并将所有注册的用户名和相应的密码存储在一个SQL表中,但我试图通过验证密码来登录工作,并且PHP似乎没有从SQL中识别任何东西。我试过mysqli_fetch_arraymysqli_fetch_assoc无数的变化无济于事。 PHP代码的全部内容在下面发布,其中注释说明了最相关的部分。从SQL打印到PHP?

<?php session_start(); ?> 
<html> 
<head> 
    <title>Test Form</title> 
</head> 

<body> 
<link rel="stylesheet" type="text/css" href="main.css" /> 

<?php 
include('mydbinfo.php'); 

$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 
if ($conn->connect_error) { 
    echo("<font color='red'><p>Unable to connect to the database system</font>"."<font color='red'>Please try later.</font></p>"); 
    exit(); 
} 

if($_POST["email"].value == "" or $_POST["password"].value == "") { 
    print("<font color='red'><p>Sorry, you must enter values into each field.</font></p>"); 
} else { 
    $mail = $_POST["email"]; 
    $_SESSION["sessUsername"] = $mail; 
    $pass = $_POST["password"]; 
    $query = "SELECT user_password FROM logins WHERE email='$mail'"; 

    $result=mysqli_query($conn,$query); 

    while($name = mysqli_fetch_array($result)) { 
     array_push($names,$name['email']); 

     for($n = 0; $n < count($names); $n++) { 
      if($names[$n] == $name['email']) { 
       $names++; 
      } 
     } 

    } 

    //Number of instances of SQL query result found in table. 
    $count = mysqli_num_rows($result); 

    if($count > 0) { 

     //Supposed to contain password which corresponds to a given user ID. 
     //This is the main issue. 
     $new=mysqli_fetch_array($result); 

     if($pass == $new) { 
      print "<font color='red'><p>Welcome back, $mail!</p></font>"; 
     } else { 
      print "<font color='red'>Your reservation was invalid.</font>"; 
      print($pass); 
      print($result); 
     } 

    } else { 
     echo "<font color='red'>Not found in table.</font>"; 
    } 
} 
?> 

</body> 
</html> 
<?php> 
+0

螺纹在代码块中不起作用。 – GolezTrol

+0

我认为用粗体代码不是一个好主意。也许你可以在之前添加一条评论来说它是与问题最相关的部分,但是它并不能使用stackoverflow的代码格式进行读取。 – nha

+0

哇,这是令人尴尬的。它是“//在表中找到的SQL查询结果的实例数。”到最后才是真正有意义的,有没有其他方式可以表明这一点? – eversomber

回答

2

当您抓取时,您会抓取整行(或整个数据集)。

在你的情况,你用一个while循环,所有行遍历。之后,您再次获取另一行,但这不起作用,因为您已经使用循环提取了所有行。

此外,你比较$pass你得到的阵列(整行),这当然不会工作。

所以,这个片断:

$new=mysqli_fetch_array($result); 
if ($pass==$new) 
{ 
print "<font color='red'><p>Welcome back, $mail!</p></font>"; 
} 

应该只是

if ($name['user_password'] == $pass) 
{ 
    print "<font color='red'><p>Welcome back, $mail!</p></font>"; 
} 

$name是在你阅读的行(或多个)匹配的电子邮件地址,所以通过改变变量我建议的代码使您的代码使用匹配的最后一个密码。

之后,还有解决其他问题。首先,登录时,你不需要一个while循环。希望只有一个帐户匹配,并且您应该采取预防措施以确保您无法首先创建重复帐户。

而且$name是不是该变量的最好的名字,因为它包含了整个行,​​在它的名称和密码。

另外,我注意到,查询完全不返回姓名或电子邮件,以便对其进行验证可能是循环也不起作用。所以,或许重新审视一下,或者重新开始是个好主意。毕竟,你一直在试验,虽然这是非常丰富的,但它也使代码混乱。有时候最好重新开始,并将获得的知识用于构建新的改进版本。

+0

非常感谢。你是对的,这段代码经历了几次迭代,有点麻烦,但主要问题是我将整个数组与用户提供的密码进行比较。我解决了这个问题,现在正在做我想做的事情。再次感谢。 – eversomber

1

只是以补充GolezTrol给出了答案,我想你应该考虑阅读有关准备语句,这是一个简单的方法来防止SQL注入是在你的代码的主要威胁。

你可以简单地检查组合电子邮件:存在通过简单地执行这个查询密码:

SELECT email FROM logins WHERE email=? AND user_password=? 

如果您在您造成的任何行,登录凭证是正确的。通过这个查询,您将被设置为执行准备好的语句,请阅读this

0

GolezTrol's answerjoaomlap's answer提供的附加信息做了很好的回答这个问题。我只是想,我会谈谈其他一些可能不会造成挫折的事情,但最终他们可能会做出。


首先 -<font><p>标签是不正确的代码下面几行命令:

echo("<font color='red'><p>Unable to connect to the database system</font>" 
     ."<font color='red'>Please try later.</font></p>") 

print("<font color='red'><p>Sorry, you must enter values into each field. 
     </font></p>"); 

您应该切换绕开口<font><p>标签看起来像:

echo("<p><font color='red'>Unable to connect to the database system</font>" 
     ."<font color='red'>Please try later.</font></p>") 

print("<p><font color='red'>Sorry, you must enter values into each field. 
     </font></p>"); 

更重要的是,你应该给<p>标签的id<p id='red-text'>和编辑您main.css样式表来改变red-text ID的文本颜色。因此不需要将所有<font>标签都放在一起。


二 -所有<link>标签应位于开闭<head>标签之间和<title>标签下方,如果<title>标签存在。

[该<链接>标签] 也仅限于头部分,但它可以出现在任何的次数。
- 来自:HTML link tag - W3Schools

所以,你的代码:

<head> 
    <title>Test Form</title> 
</head> 

<body> 
    <link rel="stylesheet" type="text/css" href="main.css" /> 
    <!-- more code --> 
</body> 

应改为:

<head> 
    <title>Test Form</title> 
    <link rel="stylesheet" type="text/css" href="main.css" /> 
</head> 

<body>
<link rel="stylesheet" type="text/css" href="main.css" />
<!-- more code -->
</body>


三 -什么跟在晃来晃去<?php标签的了你的代码结束了吗?仅当在纯代码php的文件中使用时,可以收获不关闭<?php标签的好处。

如果文件是纯PHP代码,则最好省略文件末尾的PHP结束标记。这可以防止在PHP结束标记后添加意外空白或新行,这可能会导致不必要的影响,因为当程序员无意在脚本中的该位置发送任何输出时,PHP将开始输出缓冲。 - The PHP Manual