2011-01-20 223 views
1

的那一刻,我是从表单POST取信息,并把它传递给它运行他们通过这个功能的login.php页面:PHP/MySQL的登录系统

function verify_Username_and_Pass($un, $pwd) { 

    $query = "SELECT * 
      FROM users 
      WHERE username = ? AND password = ? 
      LIMIT 1"; 

    if($stmt = $this->conn->prepare($query)) { 
     $stmt->bind_param('ss', $un, $pwd); 
     $stmt->execute(); 

     if($stmt->fetch()) { 
      $stmt->close(); 
      return true; 
     } 
    } 

} 

目前,唯一的这个检查的是匹配的记录是否存在,进而将用户与此有关secret.php重定向:

function validate_user($un, $pwd) { 
    $mysql = New Mysql(); 
    $ensure_credentials = $mysql->verify_Username_and_Pass($un, $pwd); 

    if($ensure_credentials) { 
     $_SESSION['status'] = 'authorized'; 
     header("location: ../secret.php"); 
    } else { 
     header("location: ../index.php"); 
    } 

} 

但我需要做的是不是一个秘密页面,有一个PHP页面数据库中的每个用户(只会是一对夫妇),所以我需要该函数返回用户名称,如果成功ssful并将它们重定向到[username] .php,并在其中设置用户名的会话,因此在秘密页面上,我可以检查合适的用户是否进入正确的页面?有道理?

+1

我得到的都是'秘密'页面,为什么你需要为每个用户创建一个?为什么不使用会话和一个'秘密'页面? – 2011-01-20 09:45:30

+0

请参阅Matt Lowdens的评论回答 – benhowdle89 2011-01-20 09:48:59

回答

1
function validate_user($un, $pwd) { 
    $mysql = New Mysql(); 
    $ensure_credentials = $mysql->verify_Username_and_Pass($un, $pwd); 

    if($ensure_credentials) { 
     $_SESSION['status'] = 'authorized'; 
     $_SESSION['username'] = $un; 
     header("location: ../secret.php"); 
    } else { 
     header("location: ../index.php"); 
    } 

} 

secret.php

<?php 
session_start(); //important; 

if($_SESSION['status'] != 'authorized') { 
    header("Location: ../index.php"); // not logged in 
} 

/* user specific stuff.. */ 
echo '<h1>' . $_SESSION['username'] . '</h1>'; 

$query = 'SELECT * FROM `user_profile` WHERE `username`="' . $_SESSION['username'] . '"'; 
//etc 

编辑 如果你坚持在具有特定的网页,有这样的事情:

罗斯。PHP

<?php 
session_start(); 
if($_SESSION['username'] != 'Ross') { die('you shouldn\'t be here..'); } 

// ok it's Ross, carry on 
?> 

大概都使用DB +会话

0

您可以拥有一个名为member.php的页面,并将用户名作为参数传递。

例如member.php?username=benhowdle89

这样就够了吗? “秘密”页面上的内容是什么?

如果你真的需要为每一个单独的页面,那么你可以这样做:

if(!is_file($username.'.php')){ 
    $user_file = fopen($username.'.php', 'w'); 
    fwrite($user_file, '<p>User content</p>'); 
} 

header('Location:'.$username.'.php', true, 302); 
exit; 

它仍然似乎不是解决这一问题的最佳解决方案。我个人的用户ID /名称只是保存到会话,如:

session_start(); 
$_SESSION['user_id'] = 23; 

然后我可以建立动态每个用户的页面内容,根据该值。

+0

我明白了你的观点,但每页都会有略微不同的内容。一个用户不需要看到另一个用户页面就势在必行。但我不能告诉这些页面上还会有什么,所以为什么我要为每个用户创建一个页面 – benhowdle89 2011-01-20 09:47:36

1

我不讨论这是否是正确和明确的实施。我只是尝试“修理”你的代码:

function validate_user($un, $pwd) { 
    $mysql = New Mysql(); 
    $ensure_credentials = $mysql->verify_Username_and_Pass($un, $pwd); 

    if($ensure_credentials) { 
     $_SESSION['status'] = 'authorized'; 
     $_SESSION['username'] = $un; 
     header("location: ../{$un}.php"); 
    } else { 
     header("location: ../index.php"); 
    } 

} 

进入<username>.php您可以检查是否$_SESSION['username']是等于文件名减去扩展名为.php

但是!也许有更好的实现...例如,而不是具有N PHP文件(onece用户),您可以只有一个PHP文件,将根据$_SESSION['username']

更新的加载正确的数据: 在头<username> .PHP

<?php 
session_start(); 
if ($_SESSION['status'] == 'authorized' && preg_match("/^{$_SESSION['username']}\\.php$/",__FILE__)){ 
    echo "OK";! 
}else{ 
    header("location: ../index.php"); 
} 
?> 
+0

感谢您给我一个可行的解决方案,我希望只有一个页面,但我喜欢我说的每个网页都会有不同的内容。 – benhowdle89 2011-01-20 09:50:58

+0

看看我的更新 – 2011-01-20 09:58:09

0

重定向他们更好地做头secret.php?USER = $未

0

这有一定道理,它是可行的,虽然我没有看到你为什么想要做那样复杂的事情? 首先你需要从你的查询中返回数据而不是true,我不知道你在使用什么库,尽管$ stmt-> fetch()的东西应该返回一个数组,对象,对象数组,所以做这样的事情$ data = $ stmt-> fetch();返回$ data;把一个print_r($ data)看看里面是什么。从上面的aswer使用与member.php的东西。

2

或者不通过用户名作为参数获得,但保存的用户名在会话:

if($ensure_credentials) { 
    $_SESSION['status'] = 'authorized'; 
    $_SESSION['username'] = $un; 
    header("location: ../secret.php"); 
} 

secret.php

if ($_SESSION['username'] == 'Jack') { 
    echo 'Hey Jack!'; 
} 
elseif ($_SESSION['username'] == 'Jill') { 
    echo 'Hello Jill!'; 
} 
else { 
    // die/send 404 
} 

或匹配用户名与数据库中的自定义页面内容。