PHP会话的问题

时间:2012-04-01 19:59:10

标签: php session

我正在尝试在3个php页面之间创建一个非常简单的会话:index.php,validate.php和target.php 的index.php

<?php
session_start();
$_SESSION['uid'] = 'test';
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Start A Session</title>
</head>  
<body>
<h1>Welcome to Heaven</h1>
<form method="POST" action="validate.php">
Your Name: <input type="text" name="name" value="" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

和validate.php为:

<?php
session_start();
$err="Not Allowed";
if(($_POST['name']) == $_SESSION['uid']){
header ("Location: heaven.php");}
else
{echo $err; }
?>

最后将target.php改为

<?php
session_start();
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Start Email with PHP</title>
</head>
<body>
<h1>Welcome to Targer <?php echo $_SESSION['uid'] ?></h1>
<img src="session.jpg">
</body>
</html>

现在我的问题是:

  1. 为什么用户仍然可以访问目标页面,而我已经在页面之间设置了会话(根据我对会话的理解,除非提交了正确的seeion值,否则我无法访问目标页面但我可以访问单击wamp索引列表中的页面链接页面!回显$ err;!)
  2. 我试图通过使用isset()验证$ _SESSION值,但它没有通过!你可以告诉我如何使用isset()而不是if(($ _ POST ['name'])== $ _SESSION ['uid'])comarison来修改validate.php吗?
  3. 您能告诉我如何在一个页面中合并两个(index.php和validate.php)吗?我的意思是我如何验证index.php中的会话并减少文件的两个索引和目标?在这种情况下,我需要在索引页面内处理错误的登录。
  4. 最后,您能告诉我如何从用户输入中为$ _SESSION分配值吗?我的意思是代替没有硬编码的部分,如$ _SESSION ['uid'] ='test';让会话值以用户输入开始!我知道这在这里看起来毫无意义,但我想知道在相同的索引页面中创建验证码
  5. 感谢您提前的时间

2 个答案:

答案 0 :(得分:1)

这应该正常工作,只有2个文件。你甚至可以将它压缩成1个文件,如果你真的想要它(它更难理解),请求它,我可以做到。

的index.php:

<?php
session_start();
$_SESSION['uid'] = 'test';
?>
<!DOCTYPE HTML>
<html>
    <head>
    <title>Start A Session</title>
    </head>  
    <body>
    <h1>Welcome to Heaven</h1>
    <form method="POST" action="heaven.php">
        Your Name: <input type="text" name="name" value="" />
        <input type="submit" value="Submit" />
    </form>
    </body>
</html>

另一个文件,heaven.php

<?php
session_start();
if (!empty($_SESSION['uid'])&&$_POST['name']==$_SESSION['uid'])
    {
    ?>
    <!DOCTYPE HTML>
    <html>
    <head>
    <title>Start Email with PHP</title>
    </head>
    <body>
    <h1>Welcome to Targer <?php echo $_SESSION['uid'] ?></h1>
    <img src="session.jpg">
    </body>
    </html>
    <?php
    }
else
    {
    ?>
    <!DOCTYPE HTML>
    <html>
    <head>
    <title>Access denied</title>
    </head>
    <body>
    Sorry, you have no permission to access this page.
    </body>
    </html>
    <?php
    }
?>

'验证'只是在字符串匹配时显示所需的消息,或者如果它们不匹配则显示“你看不到这个页面”。

需要设置!empty()。另外,想象如果有人在没有首先访问index.php的情况下访问'heaven.php'页面会发生什么。你要比较2个空字符串!所以它会得到验证。另一种方法是将$ _SESSION ['uid'] ='test';在天堂的开头。也是。

我没有按顺序回答你的问题(在我把第二和第三个文件放在一起而不是第一个和第二个文件时我作弊的第二个问题),但是我的代码应该涵盖你所有的问题。对于最后一部分,它只是$ _SESSION ['uid'] = $ _ POST ['name']; ,但在验证用户时这样做是没有意义的。验证必须来自某个地方,通常来自mysql数据库。

如果有效,请开始接受您的问题的答案(在向上/向下按钮下方)。

答案 1 :(得分:0)

1)分配正确的会话值是什么意思? “heaven.php”是一个文件,如果您不检查该文件中的访问权限,任何人都可以访问该文件。

2)不确定你的意思。如果您需要检查两个变量是否存在并匹配,则需要if ( (isset($_POST['name']) && isset($_SESSION['uid'])) && (($_POST['name']) == $_SESSION['uid']) )

之类的内容

3)如果不需要将文件缩减为minumun,最好在各自的文件中保持验证,表单处理等功能。如果你想在“index.php”中保存会话和表单值,你可以先检查这些值是否存在然后按照你喜欢的方式对它们进行操作。 (如上面2中所述。)

4)您可以使用表单为变量分配用户输入的值。这就是你目前使用表单所做的事情。在处理文件/功能时,您可以执行以下操作:

if(isset($_POST['submit']){
  $_SESSION['uid'] == $_POST['name'];
}

上面的例子很简单。

最后。你没有真正验证任何东西,你只需检查两个值是否匹配。验证意味着您确保值符合指定的标准,例如,当用户提交的值应为整数时(当插入数据库或以其他方式使用时),它是一个整数。我认为在创建生产环境中的任何内容之前,您应该看一些关于表单处理和用户输入验证的教程。