2013-06-03 191 views
6

无法让我的会话正常运行。过去几个小时我一直在查看我的代码,我看不到它发生了什么问题。我遇到的问题是,我每次输入用户名和密码时,它都会将我重定向到登录页面,以便在显示securedpage.php时再次键入信息。简单登录会话php

这是我的代码:

loginproc.php页 - 本页面if语句步骤,并通过直接转到别的

<?php 

// Inialize session 
session_start(); 

// Include database connection settings 
include('../../model/database.php'); 

// Retrieve username and password from database according to user's input 
$login = mysql_query("SELECT * FROM user WHERE (username = '" . mysql_real_escape_string($_POST['username']) . "') and (password = '" . mysql_real_escape_string($_POST['password']) . "')"); 

// Check username and password match 
if (mysql_num_rows($login) == 1) { 
// Set username session variable 
$_SESSION['username'] = $_POST['username']; 
// Jump to secured page 
header('Location: securedpage.php'); 
} 
else { 
// Jump to login page 
header('Location: index.php'); 
} 

?> 

securedpage.php页

<?php 

// Inialize session 
session_start(); 

// Check, if username session is NOT set then this page will jump to login page 
if (!isset($_SESSION['username'])) { 
header('Location: index.php'); 
} 

?> 
<html> 

<head> 
<title>Secured Page</title> 
</head> 

<body> 

<p>This is secured page with session: <b><?php echo $_SESSION['username']; ?></b> 
<br>You can put your restricted information here.</p> 
<p><a href="logout.php">Logout</a></p> 

</body> 

</html> 

database.php中页面

<?php 
$dsn = 'mysql:host=localhost;dbname=sports_db'; 
$username = ''; 
$password = ''; 
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); 

try { 
    $db = new PDO($dsn, $username, $password, $options); 
} catch (PDOException $e) { 
    $error_message = $e->getMessage(); 
    include 'errors/db_error_connect.php'; 
    exit; 
} 

function display_db_error($error_message) { 
    global $app_path; 
    include 'errors/db_error.php'; 
    exit; 
} 
?> 
+1

确认是否有前科,'DB'或取不是给定的用户名和密码 –

+0

你可以为'$ login'做一个var_dump吗? – Cjueden

+0

那么'mysql_num_rows($ login)'返回什么值?打印它以进行调试 –

回答

8

不能混合PDO和MySQL。您在PDO创建查询和使用mysql_* 试着改变你的代码

<?php 

// Inialize session 
session_start(); 

// Include database connection settings 
include('../../model/database.php'); 

// Retrieve username and password from database according to user's input 
$stmt = $db->prepare("SELECT * FROM user WHERE (`username` = :username) and (`password` = :password)"); 

$result = $stmt->execute(array(':username'=>$_POST['username'],':password'=>$_POST['password'])); 
$num_rows = $stmt->rowCount(); 
// Check username and password match 
if ($num_rows > 0) { 
// Set username session variable 
$_SESSION['username'] = $_POST['username']; 
// Jump to secured page 
header('Location: securedpage.php'); 
} 
else { 
// Jump to login page 
header('Location: index.php'); 
} 

?> 

看到reference

+0

完美!谢谢,我完全理解,我不能混用PDO和mysql_ * – user2446521

+0

@ user2446521谢谢你没有理由..很高兴帮助你:) – alwaysLearn

0

问题可能就出在这里:

if (mysql_num_rows($login) == 1) {

使用三联式,如果你要检查整数1。最有可能的,虽然是登录/通过失败。

这:

$_SESSION['username'] = $_POST['username'];

是不好的做法,即使你得到一个有效的响应。

+1

为什么?为什么? – gkalpak

+0

不确定你要求我做什么 – user2446521

+0

那么,正如你在上面写的那样,你会得到mysql_num_rows($ login)== 0,这意味着登录/通过失败。 – Sven

0

我要给你一个建议:

1)不要把用户给定的数据直接到您的会话变量存储。

2)首先检查您的表中是否存在用户凭据,获取相应的行,然后将获取的数据存储在会话变量中。