Php 登录页面,在同一页面中检查密码

Php 登录页面,在同一页面中检查密码,php,mysql,login,header,Php,Mysql,Login,Header,我试图建立一个登录页面,但我无法让它工作。我有三个文件:标题、登录和索引页。代码如下: admin_header.php: <html> <head> <title>Project</title> <link type="text/css" rel="stylesheet" href="styles.css"/> </head> <body> <body id

我试图建立一个登录页面,但我无法让它工作。我有三个文件:标题、登录和索引页。代码如下: admin_header.php:

<html>
    <head>
        <title>Project</title>
<link type="text/css" rel="stylesheet" href="styles.css"/>
    </head>
    <body>
    <body id="home">
<div class="top" id="header">
<ul>

        <li><a class="menu" href="index.php">Home</a></li>
        <li><a class="menu" href="search.php">Add an Artist</a></li>
        <li><a class="menu" href="contact.php">List the Artists</a></li>
        <li><a class="menu" href="contact.php">Add a movie</a></li>
        <li><a class="menu" href="contact.php">List the movies</a></li>
        <li><a class="menu" href="contact.php">Add an admin</a></li>
</ul>


</div>
<?php
 $server = 'localhost';
 $user = 'root';
 $pass = 'blablabla';
 $mydb = 'projectdb';
 $movies = 'movies';
 $artists='artists';
 $roll='roll';
 $users='Users';
 $connect = mysqli_connect($server, $user, $pass);
 mysqli_select_db($connect,$mydb)or die("cannot select DB");
session_start();
define('ADMIN',$_SESSION['username']);
if(!$_SESSION['username'])
{
header("location:admin_login.php");
}

?>
</body></html>

项目
管理员登录:

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
<?php

    $login_form = <<<EOD
<form name="login" id="login" method="POST" action="">
<p><label for="username">Please Enter Username: </label><input type="text" size="100" name="username" id="username" value="" /></p>
<p><label for="password">Please Enter Password: </label><input type="password" size="40" name="password" id="password" value="" /></p>
<p><input type="submit" name="submit" id="submit" value="Submit"/> <input type="reset" name="reset" id="reset" value="reset"/></p>
</form>
EOD;
if (isset($_GET['msg']))
{
$msg=$_GET['msg'];
if($msg!='') 
{
echo '<p>'.$msg.'</p>';
}
}
 //If message is set echo it}

echo "<h1>Please enter your Login Information</h1>";
echo $login_form;
ob_start();


       if (!isset($_POST['username'])||($_POST['password']))
       {
       echo "Please, enter your login information";
       }
       else
       {
       $username = $_POST['username']; 
       $password = $_POST['password'];
 if (!$connect)
       {
       echo ("Cannot connect to $server using $user");
       }
       $username = stripslashes($username);
       $password = stripslashes($password);
       $username = mysqli_real_escape_string($connect,$username);
       $password = mysqli_real_escape_string($connect,$password);
       $sql="SELECT * FROM $users WHERE username='".$username."' and password='".$password."'";
       $result=mysqli_query($connect,$sql);
       $count=mysqli_num_rows($result);
       if($count==1)
       {
       session_start();
       $_SESSION["username"]=$username;
       $_SESSION["password"]=$username; 
       header("location:admin_index.php");

       }
       else 
       { 
        $msg = "Wrong Username or Password. Please retry";
        echo $msg;
       }
       }
ob_end_flush();
?>
</body>
</html>

登录
有几个问题:

  • 当您已经将文本输出到浏览器时,您正在使用
    header()
    调用。这是行不通的,在将任何内容输出到浏览器之前,需要将所有php内容(如
    session\u start
    header
    调用)放在脚本的最顶端
  • 永远不要使用纯文本密码,你应该在存储密码之前对它们进行加密和散列

首先,我看不到您要向其提交数据的页面。基本思想是,创建一个接受输入的.html或.php文件,然后将这些输入值发送到另一个页面进行进一步处理,包括验证和数据库输入等。 例如:

User.html

<form name="login" id="login" method="POST" action="authenticate.php">
<input type="text" name="username" />
<input type="password" name="passwrd"/>
<input type="submit" name="Login" value="login"/>
</form>

然后在Authenticate.php上

<?php
if(isset($_POST['Login'])){
$uname=$_POST['uname'];
$pass= $_POST['passwrd'];
// from here on.. you have to also validate the inputs, which could be done with filter_var and then use a password library like Bcrypt available on Github before you send your data to database.
}
?>

第二,尝试分离模型、控制器和视图。。不要混用php和html,这只会增加调试的难度。要打印错误消息,可以通过json数据发送错误消息

第三,PHP手册、Google和Youtube很好地帮助您了解了基础知识

admin\u header.php
中有一个双
标记

替换

...
<link type="text/css" rel="stylesheet" href="styles.css"/>
    </head>
    <body>
    <body id="home">
<div class="top" id="header">
<ul>
...
。。。
    ...

。。。
    ...

这可能无关紧要

action=”“
可能是一个线索,或者它是否会转到当前页面?如果您没有被重定向,会发生什么?另一个注意事项是,看起来您正在数据库中以纯文本形式存储密码。你不应该这样做。相反,您应该在数据库中存储一个hased和salt密码。你可以在这里了解更多。另外,请确保使用更强大的散列算法,如SHA2。如果(!isset($\u POST['username']))|($\u POST['password'])
=如果未设置$\u POST['username']或$\u POST['password']是真实的,则会发现这很麻烦。很确定这不是您想要的,不必使用输出缓冲来掩盖“headers ready sent”错误。所以,我不能像以前那样将两个文件合并到一个文件中?这只会让事情变得困难。当你有这些配置文件页面或其他一些主要依赖于动态生成数据的页面时,这些页面将以最少100行php代码结束,你可以想象一下,当你在其中添加htmls时。。使用print_r()和echos或关闭和打开php标记。然后您的文件变得非常混乱,丢失分号可能需要一整天的时间。所以我的建议是,整合和缩进,就像Bumbolt对标签指出的那样。这些错误只是因为您将View与Controller和Model结合在一起这不是解决问题的方法?@Loko有很多问题,但问题中所述的问题是,
我没有被重定向,
,原因(其中一个原因…)是在
头调用之前输出的。
...
<link type="text/css" rel="stylesheet" href="styles.css"/>
    </head>
    <body>
    <body id="home">
<div class="top" id="header">
<ul>
...
    ...
    <link type="text/css" rel="stylesheet" href="styles.css"/>
        </head>
        <body id="home">
    <div class="top" id="header">
    <ul>
    ...