Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.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
Php 创建基本登录必需页面_Php_Html_Login - Fatal编程技术网

Php 创建基本登录必需页面

Php 创建基本登录必需页面,php,html,login,Php,Html,Login,我在这里的意图是创建一个页面,它最初显示一个基本表单,由输入密码的文本字段和提交按钮组成。提交后,表单会将值发送回同一页面,并在该页面上进行检查。这发生在PHP文件中,而不是数据库中。如果密码正确,将显示相关的HTML。这就是我所拥有的: <?php ini_set('display_errors',1); ini_set('display_startup_errors',1); error_reporting(-1); if(isset($_POST["l

我在这里的意图是创建一个页面,它最初显示一个基本表单,由输入密码的文本字段和提交按钮组成。提交后,表单会将值发送回同一页面,并在该页面上进行检查。这发生在PHP文件中,而不是数据库中。如果密码正确,将显示相关的HTML。这就是我所拥有的:

<?php
    ini_set('display_errors',1);
    ini_set('display_startup_errors',1);
    error_reporting(-1);
    if(isset($_POST["logout"])){
        session_destroy();
    }elseif(isset($_POST["auth"])){
        if($_POST["auth"]=="password"){
            session_start();
            $_SESSION["admin"]="true";
        }
    }
    if(!isset($_SESSION["admin"])){
?>
    <form action="/admin.php" method="post">
        <input type="text" name="auth"><input type="submit">
    </form>
<?php
    }elseif($_SESSION["admin"]="true"){
?>
<section>
<!--HTML goes here-->
</section>
<section>
    <form action="/admin.php" method="post">
        <input type="hidden" name="logout" value="logout">
        <input type="submit">
    </form>
</section>
<?php }else{echo "Incorrect password";}?>
…其中第13行只是
session_start()


虽然我已经读到在PHP文件中存储密码存在安全问题,但这似乎不是一个主要问题,因为只有不到两个人会使用这个页面,其中包含一些工具,用于处理那些如果被弄乱或删除而不是主要问题的东西。但是,如果这是一个比我想象的更大的安全问题,请告诉我。

建议将
会话\u start()
作为代码的第一行,您可以与所有用户启动会话,但是使用会话变量中存储的一些其他数据来验证和授权访问。

对于下面的警告,您可以在页面顶部添加
。这样做可能会使您摆脱这些警告。

在会话标题后添加包含的文件。我看不到问题中发布的php代码中包含的文件有任何用途,猜测它们在该页面中是需要的。因此,只需在会话标题后添加它们,这将很可能解决您的问题

将此行添加到您的
php.ini

PHP文档建议将设置为一个数字,而不是仅仅打开>>

.htaccess中的添加:

来源: 当密码不正确时,除非使用正确的密码发布表单,否则不会执行这行代码


将该行放在顶部,然后将其从现在的位置移除。

以下是一些基于原始代码的代码

它经过测试

您的一个原始测试中有一个bug,它的值为“=”而不是“=”

当您使用PHP选择要包含的HTML的不同部分时,我使用了“Alternate Control”语法,因为它读起来更好

代码中有很多注释。请随意移除它们:-)



为什么有
会话_destroy()
会话_start()之前?您是否已搜索错误消息(这里是堆栈溢出)?看一看,它看起来像是包含了一个page top.php,它在会话开始之前输出。php是包含导航栏的每个页面上的一个段。您可以尝试使用
ob_start()看看这是否有帮助。有什么原因我需要它吗?我只想在用户拥有正确密码的情况下启动会话。除非我遗漏了什么,否则不需要为任何人设置会话,只要加载页面并返回初始表单,对吗?@Hiigaran我不是说这是最好的方法,而是一个简单有效的解决方案。否则,您可能会缓冲输出。对不起,我无意听上去有争议。只是想在这个过程中理解。无论如何,我现在已经做到了。我以前收到的警告现在一直存在,因此我将研究其他人建议的一些解决方案。@Hiigaran过程是,会话通过HTTP头处理,一旦开始创建HTTP响应主体,就不能再次设置头,因此,在回应任何事情之前使用这些方法总是一个好主意;否则你需要缓冲输出。我试着在PHP网站上读到这方面的内容,但我仍然感到困惑。这是做什么的,为什么有用?从我收集的信息来看,它会关闭脚本的任何输出…不管这意味着什么。是的,它是一个临时缓冲区,保存脚本的输出。您也可以在php文件末尾使用ob_flush()刷新它。这解决了你的问题吗?没有,我只是把session_start()放在页面的最顶端,在我的任何一个include之前。这解决了第二个问题,但我还没有尝试解决其他人发布的主要问题。等我有时间的时候,我得去做那件事。无论如何,谢谢。我没有访问该文件的权限,因为我的服务器权限受到限制。但是,我可以使用其他人建议的ob_start()实现相同的效果吗?如果ob_start工作正常,那么它就可以了,或者从source@Hiigaran是的,您可以通过
ob\u start
获得相同的效果,也可以使用
ini\u set()
用于临时更改该请求的PHP配置。如果存在ob_启动,是否意味着存在ob_停止或类似情况?据我所知,它应该关闭脚本输出。甚至不知道这意味着什么,但这是否意味着它只是隐藏错误而不是修复错误?如果是这样的话,难道我不能通过删除显示错误消息的三行代码来获得相同的结果吗?编辑:刚刚添加了ob_start();但它仍然显示消息。在会话头之后添加包含的文件。我看不到问题中发布的php代码中包含的文件有任何用途,猜测它们在该页面中是需要的。因此,只需在会话头之后添加它们,这将很可能解决您的问题
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at D:\xampp\htdocs\top.php:28) in D:\xampp\htdocs\admin.php on line 13
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\xampp\htdocs\top.php:28) in D:\xampp\htdocs\admin.php on line 13
output_buffering = On
php_value output_buffering On
session_start();
<?php
// PHP 5.1.18 on windows XP (XAMPP) -- i use buffered output    
session_start(); // assume we always have sessions -- can be destroyed later if required

/*
 * Using Alternate Control syntax for control structures
 *
 * This is 'cos we are using PHP to show different portions of HTML
 */

$passwordError = false; // assume password is ok


// I have these already in my development enviroment
//    ini_set('display_errors',1);
//    ini_set('display_startup_errors',1);
//    error_reporting(-1);

    if (isset($_POST["logout"])) { // logout form submitted...
        session_destroy();
        die(__FILE__ .' : i am done...');

    } elseif (isset($_POST["auth"])) { // hard coded password! fine for testing!
        if ($_POST["auth"] == "password") { 
             $_SESSION["admin"] = "true";
        } else {
             $passwordError = true; // failed password check
        }
    }
?>

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Q22131957</title>
  </head>

  <body>
    <h1>Q22131957 Login screen</h1>

  <?php if (!isset($_SESSION["admin"]) || $_SESSION['admin'] != "true"): // need the admin login form to be shown?>

    <form action="" method="post"> <!-- the form must come back to this script for checking... -->
        <input type="text" name="auth"><input type=submit value="admin login">
     </form>

     <?php if ($passwordError): ?>
        <strong> Incorrect password</strong>
     <?php endif; ?>

   <?php endif;  // end of admin attempt to login... ?>


  <?php if (isset($_SESSION["admin"]) && $_SESSION["admin"] == "true"): // admin is logged in successfully ?>

  <!--
    /*
     * Normally, you would just redirect to a different URL where
     * all the admin actions live.
     *
     * Here i just drop through to the 'logged in admin' part of the script
     * as the original script did.
     *
     */
  -->
<section>
 <!--HTML goes here-->
  <p> we logged in as ADMIN! </p>
</section>
<section>
    <!-- this form returns to this script! -->
    <form action="" method="post">
        <input type="hidden" name="logout" value="logout">
        <input type="submit" value="logout">
    </form>


    <!-- divert to admin.php screen via a form -- testing only -->
    <form action="admin.php" method="post">
        <input type="hidden" name="continue" value="continue">
        <input type="submit" value="continue to admin.php...">
    </form>

</section>
<?php endif; // end of successful logged in admin ?>

</body>
</html>