Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从SQL打印到PHP?_Php_Mysql_Sql - Fatal编程技术网

从SQL打印到PHP?

从SQL打印到PHP?,php,mysql,sql,Php,Mysql,Sql,我一直在尝试编写一个PHP程序,让用户能够注册帐户并在注册后登录。我设法阻止了多个用户名的注册,并将所有注册的用户名和相应的密码存储在一个SQL表中,但我试图通过验证密码来让登录正常工作,PHP似乎无法识别SQL中的任何内容。我尝试了无数的mysqli\u fetch\u数组和mysqli\u fetch\u assoc变体,但都没有成功。PHP代码的全部内容发布在下面,注释指定了最相关的部分 <?php session_start(); ?> <html> <he

我一直在尝试编写一个PHP程序,让用户能够注册帐户并在注册后登录。我设法阻止了多个用户名的注册,并将所有注册的用户名和相应的密码存储在一个SQL表中,但我试图通过验证密码来让登录正常工作,PHP似乎无法识别SQL中的任何内容。我尝试了无数的
mysqli\u fetch\u数组
mysqli\u fetch\u 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>";
}
$new=mysqli\u fetch\u数组($result);
如果($pass==$new)
{
打印“欢迎回来,$mail!

”; }
应该是

if ($name['user_password'] == $pass) 
{
  print "<font color='red'><p>Welcome back, $mail!</p></font>";
}
if($name['user\u password']==$pass)
{
打印“欢迎回来,$mail!

”; }
$name
是一个变量,您可以在其中读取与电子邮件地址匹配的行,因此,按照我的建议更改代码会使代码使用匹配的最后一个密码

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

另外,
$name
不是该变量的最佳名称,因为它包含一整行,其中包含名称和密码


另外,我注意到查询根本不返回名称或电子邮件,因此验证它们的循环可能也不起作用。所以,也许再仔细看看,甚至从头开始是个好主意。毕竟,您一直在进行实验,尽管这非常有用,但它也会把代码弄得一团糟。有时最好重新开始,把所获得的知识用于构建一个新的和改进的版本。

< P>只是为了补充GolezTrol给出的答案,我认为你应该考虑阅读准备好的语句,这是一个简单的方法来防止SQL注入,这是你的代码中的一个主要威胁。 您只需执行以下查询即可检查组合email:password是否存在:

SELECT email FROM logins WHERE email=? AND user_password=?
如果结果中有任何行,则登录凭据是正确的。有了这个查询,您就可以做准备好的陈述,阅读。

以及由提供的附加信息,您就可以很好地回答这个问题了。我只是想谈谈其他一些事情,到目前为止可能不会造成挫折,但最终可能会


首先-以下代码行中的
标记顺序不正确:

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

<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>

测试表








第三-在代码块中,挂起的
加粗不起作用。我认为加粗代码不是一个好主意。也许你可以在之前添加一条评论,说这是与问题最相关的部分,但是用stackoverflow的代码格式,这并不能使它非常可读。哇,这太尴尬了。表中找到的SQL查询结果的实例数“/”。到最后,这是真正相关的,是否有其他方式来表示这一点?我删除了粗体显示的尝试,最相关的部分会被注释。我真的不理解这段代码。SQL查询只选择密码,但尝试从返回的数据构建电子邮件地址数组。然后,当您读取了所有数据后,您尝试从结果集中读取密码,这将失败,因为没有留下任何数据。最后,将试图从结果集中获取的数组与用户提供的字符串进行比较。非常感谢。你说得对,这段代码经过多次迭代,有点混乱,但主要问题是我将整个数组与用户提供的密码进行了比较。我修复了它,现在它正在做我想做的事情。再次感谢。
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>");
<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>