2013-06-03 285 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)首先檢查您的表中是否存在用戶憑據,獲取相應的行,然後將獲取的數據存儲在會話變量中。