php - 从 SQL 打印到 PHP?

标签 php mysql sql

我一直在尝试编写一个 PHP 程序,使用户能够注册帐户并在注册后登录。我设法阻止了多个用户名的注册,并将所有已注册的用户名和相应的密码存储在 SQL 表中,但我试图通过验证密码来使登录正常工作,而 PHP 似乎无法从 SQL 中识别任何内容.我已经尝试了 mysqli_fetch_arraymysqli_fetch_assoc 的无数变体,但都无济于事。下面发布了完整的 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>

最佳答案

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

在您的例子中,您使用了 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 也不是该变量的最佳名称,因为它包含一整行,其中包含名称和密码。

另外,我注意到查询根本不返回姓名或电子邮件,因此验证它们的循环可能也不起作用。因此,再仔细观察一下,甚至重新开始,也许是个好主意。毕竟,您一直在进行试验,尽管这提供了很多信息,但它也会使代码变得一团糟。有时最好重新开始并将您获得的知识用于构建新的改进版本。

关于php - 从 SQL 打印到 PHP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363208/

相关文章:

php - `sentry/sdk 2.x`-如何注册错误/异常处理

java - Android/IOS app与网关(后端服务器)之间数据传输框架

php - JOIN 从错误的表中获取 id 值

sql - 转换为 PostgreSQL 后备份还原时出错

java - 从一个txt文件导入数据到android数据库

mysql - sql,从所选数据中插入随机数据

javascript - 使用适用于 iOS 应用程序的 php 在没有网页的情况下加载 URL

c++ - 使用 Qt 从 mysql 查询构建二维 vector

PHP+MySQL join 语句将多个值排列为 mysql_fetch 数组中的行

php - 包含类别和子类别的下拉菜单无法正常工作