2014-04-23 38 views
-1

用戶登錄我正在開發一個網站,用戶可以登錄,但我不能讓它工作,我已經試過了這麼多,但它這麼想的幫助......我找不到在我的代碼中的任何錯誤,但也許你可以:) 這裏是我的代碼:Session時,在PHP

<?php 
require_once 'core/database/connect.php'; 
mb_internal_encoding("UTF-8"); 
mb_http_output("UTF-8"); 
ob_start("mb_output_handler"); 
session_start(); 

if (isset($_POST['username']) && isset($_POST['password'])) { 

    $usname = mysql_real_escape_string(trim($_POST['username'])); 
    $paswd = mysql_real_escape_string($_POST['password']); 

    $query = mysql_query("SELECT id, username, password, name FROM users WHERE       username = '$usname'"); 

    $row = mysql_fetch_row($query); 
    $usid = $row['0']; 
    $dbUsname = $row['1']; 
    $dbPassword = $row['2']; 
    $dbName = $row['3']; 
    if ($usname == $dbUsname && md5($paswd) == $dbPassword) { 
     session_start(); 
     $_SESSION['username'] = $dbUsname; 
     $_SESSION['id'] = $usid; 
     $_SESSION['name'] = $dbName; 
     header("Location: user.php"); 
    } else { 
     echo "<h2>Oops, that username or password was incorrect. Please try again. Be aware of capital letters!</h2>"; 
    } 
} 
?> 
+0

一般注意事項:請你幫個忙,並編寫新的代碼時,不要使用'mysql_ *'功能。他們正在被棄用,並將在未來版本的PHP中被刪除。改用'mysqli_ *'或PDO。 –

+0

你好,作爲傑拉德施耐德寫道,mysql_ *函數是由新版本過時了,所以只檢查出來的版本,phpinfo()函數會得到你的你的PHP,MySQL和Apache的細節和otehr細節的全部細節,以及。所以只需先檢查一下,然後嘗試使用mysqli_ *或PDO連接。 – KinjalMistry

回答

1

從mysql列值檢索時,不要使用引號:

$usid = $row['0']; 
$dbUsname = $row['1']; 
$dbPassword = $row['2']; 
$dbName = $row['3']; 

嘗試,而不是:

$usid = $row[0]; 
$dbUsname = $row[1]; 
$dbPassword = $row[2]; 
$dbName = $row['3']; 

這將引用列中的順序,而您使用它的方式將引用列名稱。

0

爲什麼你再次啓動會話,請不要使用引號從mysql列檢索值時也 更好的解決方案,你需要通過線 打開你的php.ini和調試代碼行通知和錯誤嘗試

<?php 
require_once 'core/database/connect.php'; 
mb_internal_encoding("UTF-8"); 
mb_http_output("UTF-8"); 
ob_start("mb_output_handler"); 
session_start(); 

if (isset($_POST['username']) && isset($_POST['password'])) { 

    $usname = mysql_real_escape_string(trim($_POST['username'])); 
    $paswd = mysql_real_escape_string($_POST['password']); 

    $query = mysql_query("SELECT id, username, password, name FROM users WHERE username = '$usname'"); 
    if(mysql_num_rows($query) > 0) { 
    $row = mysql_fetch_row($query); 
    $usid = $row[0]; 
    $dbUsname = $row[1]; 
    $dbPassword = $row[2]; 
    $dbName = $row[3]; 
    if ($usname == $dbUsname && md5($paswd) == $dbPassword) { 
     $_SESSION['username'] = $dbUsname; 
     $_SESSION['id'] = $usid; 
     $_SESSION['name'] = $dbName; 
     header("Location: user.php"); 
    } else { 
     echo "<h2>Oops, that username or password was incorrect. Please try again. Be aware of capital letters!</h2>"; 
    } 
    } 
    else { 
     echo 'NO record found'; 
    } 
} 
?> 
+0

可以假定密碼在數據庫中存儲爲md5散列。不需要雙重散列。 –

+0

@GeraldSchneider謝謝您更新 –

+0

我已嘗試刪除qoutes,但無法登錄! – RasmusBS

0
$row['0'] 

會工作,如果你用的形式"namedKey" => someValue的關聯數組工作,但要取的第一個值$row[0],第二個值$row[1]

刪除引號,你應該沒問題。

請注意,您正在使用mysql_*其已被廢棄,極不安全。改爲使用mysqliPDO

另外請注意,你不逃避你的投入也不是你使用準備好的語句,這意味着它很容易注入你的數據庫,甚至刪除它,這兩者都推薦,但後者就足夠了。