如何在PHP中正确启动会话?

时间:2016-04-23 19:48:45

标签: php session login session-variables deprecated

我最近关注了如何为我的网站制作自定义CMS的教程。我目前正在制作后端,因此用户可以创建和编辑页面。该教程有点陈旧,因此不推荐使用各种功能。我能够解决大部分问题,除了" session_register();"功能。我在许多网站上看到过,包括告诉我使用" $ _ SESSION [' admin'] = $ username;"例如。这对我不起作用,因为我将它应用于许多页面,每个页面都要求我重新输入信息。

以下是我正在使用的文件:

admin_check.php:

<?php
$error_msg="";
if ($_POST['username']){
$username=$_POST['username'];
$password=$_POST['password'];
// Simple hard coded values for the correct username and password
$admin="Admin";
$adminpass="Password";
//connect to mysql here if you store admin username and password in your database
//This would be the prefered method of storing the values instead of hard coding them here into the script
if(($username !=$admin)||($password != $adminpass)){
    $error_msg='<h3 class="text-danger">Login information incorrect, please try again.</h3>';
} else{
    $_SESSION['admin']=$username;
    require_once "index.php";
    exit();
}
}
?>

<?php
if ($_SESSION['admin']!="Admin"){
echo '<div class="container" style="background-color: #FFF ;"><h3><i   class="glyphicon glyphicon-alert text-danger"></i> Solo los administradores
      tienen permiso para ver este directorio. No se admite gente con Lag!        </h3><br/>

      <!DOCTYPE html
<html>
<head>
    <title>Login Administrador</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta charset="UTF-8">       
    <link href="../css/bootstrap.min.css" rel="stylesheet" />
    <link href="../css/styles.css" type="text/css" rel="stylesheet">
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-    glyphicons.css" rel="stylesheet">
     </head>
      <body style="padding-top: 5px; background-color: #EEE ;">
    <div style="max-width: 450px; max-height: 550px; background-color: #CCC; padding-top: 30px; box-shadow: 0 0 15px #DDD; border-radius: 10px" class="container">
        <div class="jumbotron" style="background-color: #fff; max-height: 470px; padding: 10px; border-radius: 2; box-shadow: 0 0 12px #777;">
            <legend class="text-success">LOGIN ADMINISTRATOR</legend>
            <hr />                
            <p style="font-size: 12pt;">Please enter your username and password to login into the admin site.</p>
            <form action="admin_check.php" method="post" target="_self" class="form-group">
                <label class="label label-default">username</label>
                <input type="text" class="form-control" placeholder="username" name="username" id="username">
                <br/>                    
                <label class="label label-default">password</label>
                <input type="password" class="form-control" placeholder="password" name="password" id="password">
                <br/>
                <button class="btn-success" value="submit" type="submit" name="button" id="button" >Submit</button>
            </form><br/>
            '.$error_msg.'
        </div>
    </div>
</body>
</html>

<br/><br/>

         <center> <a href="../" >Click aquí para regresar a un lugar seguro.</a>    </div></center>';


    exit();
    }
    ?>

^正如您所看到的,这是管理员输入用户名和密码的地方,我想以某种方式存储,例如在cookie中,因此他们可以自由导航而无需输入用户名和密码一遍又一遍。

的index.php:

<?php
session_start();
include_once "admin_check.php";?>
<?php
include "admin_header.php";
?>
<body id="home">
    <div class="container" style="background-color: white;">
        <h2 style="color: #FF691F"><i class="fa fa-home fa-2x"></i> Home</h2>
    </div>
</body>        
<?php include "admin_footer.php"; ?>

create_blog.php:

 <?php
session_start();
include_once "admin_check.php";?>
<?php
include "admin_header.php";
?>
<script type="text/javascript">
function validate_form(){
    valid=true;
    if(document.form.pagetitle.value===""){
        alert("Please Enter a Page Title!");
        valid=false;
    }else if{
        alert("Please Enter Keywords about this Page!");
        valid=false;
    }
    return valid;
}
</script>
<script type="text/javascript">
function validate_form1(){
    valid=true;
    if(document.form.pid.value===""){
        alert("Please Enter a Page ID!");
        valid=false;
    }
    return valid;
}
</script>

<body id="blog">
<div class="container" style="background-color: white; box-shadow: 0 -5px 9px 3px #b2b2b2;">
    <br/>
    <h2 style="color: #777 ;"><i class="fa fa-book fa-lg"></i> Upload Blog Entry</h2>
    <p class="text-danger text-center">Title, Body, and Keywords are required to create new post! None should be left blank!</p>
    <a href="mmoAdmin/"><h6 class="text-muted pull-right"><< Back Home</h6>  </a>
    <br/>
    <form id="form1" name="form1" method="post" action="edit_blog.php" onsubmit="return validate_form1();" class="form-inline">
        <div class="form-group">
            <button class="btn-default" type="submit" name="button2" id="button2" value="Edit Post">Edit Post</button>
        </div>
        <input name="pid" type="text" id="pid" size="8" maxlength="11" class="form-control"/>
        <span id="helpBlock1" class="help-block">Enter the ID of the post you want to edit. eg: "blog/article.php?pid=<'this is the id'>"</span>
    </form>
    <br/>
    <form id="form2" name="form2" method="post" action="delete_blog.php" onsubmit="return validate_form2();" class="form-inline">
        <div class="form-group">
            <button class="btn-default" type="submit" id="button3" name="button3" value="Delete Post">Delete Post</button>
        </div>
        <div class="form-group"><input type="text" class="form-control" id="pid" name="pid"/></div>
        <span id="helpBlock2" class="help-block">Enter the ID of the post you want to delete. eg: "blog/article.php?pid=<'this is the id'>"</span>
    </form>
    <br/>
    <form id="form" name="form" method="post" action="congrat_blog.php" onsubmit="return validate_form();">
    <div class="form-group">
        <label>Title</label>
        <input type="text" name="pagetitle" id="pagetitle" class="form-control" placeholder="Title..." value="<?php echo $pagetitle; ?>"/>
        <br/>
        <br/>
        <label>Body</label>
        <textarea name="pagebody" id="pagebody" style="height: 480px; width: 100%" ><?php echo $pagebody; ?></textarea>
        <br/>
        <label>Keywords</label>
        <input type="text" name="keywords" id="keywords" class="form-control" placeholder="blog, mmob, etc..." value="<?php echo $keywords; ?>" />
        <br/>
        <button type="submit" class="btn-success" name="button" id="button"   value="Create this page now">Submit</button>
    </div>
    </form>
</div>

</body>


<?php include "admin_footer.php"; ?>

^像这样我有多个页面,都有php函数&#34; session_start();&#34;在文档的开头,我include_once&#34; admin_check.php&#34;使用&#34; $ _ SESSION [&#39; admin&#39;] = $ username&#34;对所有这些都起作用。

注意:admin_header.php和admin_footer.php只是HTML标题导航栏和页脚,因此我不必更正单个页面的内容。

我对php很新。我是否正确地这样做? 基本上我所尝试的只是一个登录功能,以便管理员可以访问后端,这将允许他们将信息上传到数据库,因此它填充了网站。

以下是我创建此基本CMS的教程系列的链接:

How to Build PHP and MySQL CMS Website Software

谢谢你的时间!

3 个答案:

答案 0 :(得分:2)

因此教程没有提到必须在每个页面中启动会话,但确实如此。

因此session_start();但是成为使用会话的所有文件的一部分。

错误报告可以帮助您:http://php.net/manual/en/function.error-reporting.php

教程可能没有涉及的另一件事是“密码”。

使用以下其中一项:

其他链接:

关于列长的重要说明:

如果您决定使用password_hash()或兼容包(如果PHP <5.5)https://github.com/ircmaxell/password_compat/,请务必注意,如果您当前的密码列的长度低于60 ,它需要更改为(或更高)。手册建议长度为255。

您需要更改列的长度并重新开始使用新哈希才能使其生效。否则,MySQL将无声地失败。

如果您打算稍后使用数据库,请将PDOprepared statementsmysqli_* with prepared statements

一起使用
  • 这只是一个见解。

答案 1 :(得分:0)

查看您的代码,您在PHP文件的开头忘记了session_start(),将它放在PHP文件的顶部是个好主意,这样会话就可以了。这通常设置(或使用已经通过的)cookie,然后识别用户,以便$_SESSION变量起作用。

http://php.net/manual/en/function.session-start.php

答案 2 :(得分:0)

问题:您在代码中设置会话之前忘记启动会话。

解决方案: 用修复后的代码替换你的第一部分代码:

<?php
session_start();
$error_msg="";
if ($_POST['username']){
    $username=$_POST['username'];
    $password=$_POST['password'];
    // Simple hard coded values for the correct username and password
    $admin="Admin";
    $adminpass="Password";
    //connect to mysql here if you store admin username and password in your database
    //This would be the prefered method of storing the values instead of hard coding them here into the script
    if(($username !=$admin)||($password != $adminpass)){
        $error_msg='<h3 class="text-danger">Login information incorrect, please try again.</h3>';
    } else{
        $_SESSION['admin']=$username;
        require_once "index.php";
        exit();
    }
}
?>

注意:在尝试访问session_start()数组或尝试设置一个数据之前,以及在发送任何输出之前,请记住在您的网页上运行$_SESSION语句到浏览器。

参考网址

  

http://php.net/manual/en/session.examples.basic.php