PHP无法回忆会话

时间:2012-07-21 09:47:57

标签: php session login

最近我尝试为我的项目创建一个登录网页。 所以有index.html,这个人必须登录的登录页面。它将查询发送给 checklogin.php是这个:

<?php
ob_start();
$host="localhost"; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name="test"; // Database name 
$tbl_name="members"; // Table name 

// Connect to server and select databse.
mysql_connect("wordshare.zxq.net", "754319_guest", "guest")or die("cannot connect"); 
mysql_select_db("wordshare_zxq_users")or die("cannot select DB");

// Define $myusername and $mypassword 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 

// To protect MySQL injection (more detail about MySQL injection)
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
$sql="SELECT * FROM members WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){

// Register $myusername, $mypassword and redirect to file "login_success.php"
session_start();
session_register("myusername");
session_register("mypassword"); 
header("location:main.php");
}
else {
    header("location:index.html");
}
ob_end_flush();
?>

然后主页面检查会话,如果您没有登录,它会将您重定向到index.html,代码如下:

<?php
// Connects to your Database
mysql_connect("wordshare.zxq.net", "754319_guest", "guest")or die("cannot connect");
mysql_select_db("wordshare_zxq_users")or die("cannot select DB");
//checks cookies to make sure they are logged in
session_start();
session_start();
if(!session_is_registered(myusername)){
header("location:index.html");
}
?>

问题是,如果我直接转到main.html,我不会被重定向回主页面。 我已经尝试使用echo来确定会话是否被记录,并返回undefined。 令我感到困惑的是,即使我试图打印出类似单词的东西,它也会让我“未定义”。 谁能帮我?

3 个答案:

答案 0 :(得分:4)

您的代码存在许多问题。无论你把它复制到哪里,都是一个非常糟糕的例子。我有一些业余时间,所以我强调我能看到的,最重要的是:

  • 您可以在数据库中存储纯文本密码。这非常严重,因为如果有人破解您的数据库,可以轻松检索用户名和密码信息。这是一个非常常见的错误,但非常糟糕。而是使用phpass library哈希密码。该网站很好地解释了这是什么。因此,如果您想学习,该网站不仅具有代码,还提供了非常好的通用描述。

  • 代码期望启用get_magic_quotes_gpc相反,如果启用了它,则应该拒绝工作。假设启用魔术引号是一个安全问题,因为它会阻止您编写安全代码

    您的代码:

    $mypassword=$_POST['mypassword'];
    
    // To protect MySQL injection (more detail about MySQL injection)
    $myusername = stripslashes($myusername);
    

    建议:

    if (get_magic_quotes_gpc()) {
        throw new UnexpectedValueException('get_magic_quotes_gpc must be off.');
    }
    $mypassword = $_POST['mypassword'];
    

    (不再需要stripslashes

  • 您使用其他过时的语言功能。这只是一个sympton,无论您复制了哪些代码,您都没有采用最先进的代码。你遇到的一些问题:

    • mysql_*函数。请改用PDO。它使用起来更简单,功能更强大。它可以通过提供所谓的预准备语句(也称为参数化查询)来主动防止SQL注入。了解它,使用它。
    • session_registersession_is_registered个功能。这些用于在会话中注册全局变量。它们不安全并且已被弃用。而是使用$_SESSION超全局,就像您已经使用$_POST超全局一样。
  • 一长串代码。您没有使用子程序。虽然他们对你很有帮助。了解如何编写your own functions,因为您可以像编写文本一样进行编程。

示例:

<?php
require('my-functions.php');

$location = 'index.html';

if ($user = user_form_submitted() && user_is_valid($user)) {
    user_login_into_session_($user);
    $location = 'main.php';       
}

redirect($location);
?>

正如您所看到的,这很容易阅读。然后定义完成工作的函数,例如:

/**
 * redirect request
 *
 * @param string $location
 */
function redirect($location) {
    if (!headers_sent()) {
        header("Location: " . $location);
    }
    printf('Moved <a href="%1$s">here</a>.', htmlspecialchars($location));
}

这只是一个例子。所以你可以开始编程,甚至不用考虑所有荣耀的不同细节是如何工作的。

关于使用和提取功能以及使用PDO的相关答案:

答案 1 :(得分:1)

我想你错过了这一行的引用:if (!session_is_registered(myusername)) {

应该是:if( !session_is_registered("myusername")) {

答案 2 :(得分:0)

您有两个会话(名称相同),这意味着第二个会话将覆盖第一个会话。

当手册说

时,为什么要使用session_register
  

自PHP 5.3.0开始,此函数已被弃用,自PHP 5.4.0起已被删除。

<强>相反:

输入$_SESSION['myusername'] = $usr;$_SESSION['mypassword'] = $pswd;

删除 main.php 中的第二个session_start()

键入if (isset($_SESSION['myusername'])而不是session_is_registered()