2013-02-01 106 views
0

我正在嘗試製作一個簡單的用戶登錄系統。但是,我擁有會話的所有內容,並且可以正常工作,但用戶登錄不能與數據庫一起工作。我可以輸入任何用戶名和密碼並登錄。用戶登錄腳本:用戶可以使用任何用戶名和密碼登錄

這是我的登錄頁面:

<?php 
session_start(); 


$db_host = "localhost";    // Place the database host here 
$db_username = "data_user"; // Place the username for the MySQL database here 
$db_pass = "password";   // Place the password for the MySQL database here 
$db_name = "database_name";  // Place the name for the MySQL database here 

if (isset($_POST['username'])) 
{ 
// MySQL Connection 
$db_link = mysql_connect("$db_host","$db_username","$db_pass") or die ("could not connect to mysql. Make sure you have correctly inputed your host, username, and password."); 
mysql_select_db("$db_name") or die ("no database could be found."); 

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

// MySQL Query 
$result = mysql_query("SELECT * FROM users WHERE 
username = '$username' AND password = '$password' "); 

if(!$result) { 
    $_SESSION['error'] = '<span style="color:red">Login Failed</span>'; 
} else 
    { 
    $row = mysql_fetch_assoc($result); 
     $_SESSION['userid'] = $row['id']; 
     $_SESSION['username'] = $username; 
    } 
    mysql_close($db_link); 
} 
header('Location: ./') 
?> 

我使用引導程序登錄。所以這是我的登錄html:

   <div id="login" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 
    <div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 
    <h3 id="myModalLabel">Login</h3> 
    </div> 
    <div class="modal-body"> 

    <form class="form-horizontal" action="login.php" method="post"> 
    <div class="control-group"> 
    <label class="control-label" for="inputUsername">Username</label> 
    <div class="controls"> 
     <input name="username" type="text" id="inputUsername" placeholder="Username"> 
    </div> 
    </div> 
    <div class="control-group"> 
    <label class="control-label" for="inputPassword">Password</label> 
    <div class="controls"> 
     <input name="password" type="password" id="inputPassword" placeholder="Password"> 
    </div> 
    </div> 
    <div class="control-group"> 
    <div class="controls"> 
     <label class="checkbox"> 
     <input type="checkbox"> Remember me 
     </label> 
    </div> 
    </div> 
    </div> 
    <div class="modal-footer"> 
    <button type="submit" class="btn btn-primary">Sign in</button> 
    </form> 
    </div> 
</div> 

這是使用bootstrap的非常基本的登錄。我得到了登出工作正常,所以這很好,但無論如何任何人都可以向我解釋爲什麼它沒有連接到數據庫,你可以用任何你可以想象的用戶名和密碼登錄?

+0

請不要在新代碼中使用不推薦使用的'mysql_ *'函數。 –

+0

你也可以自己調試很多。找出'$ result'返回的原因以及原因。 –

+0

這也聞起來像你的數據庫中有明文密碼。將有人迫不及待地想要得到它!道歉,但如果你哈希客戶端併發送結果。 –

回答

-2

print_r($row);

什麼,當你打印$行一行顯示並返回數據

+1

..care解釋爲什麼? – tradyblix

+0

這給了錯誤: 解析錯誤:語法錯誤,意想不到的T_CONSTANT_ENCAPSED_STRING在/home/pardyco/public_html/login.php線22 –

-3

嘗試編輯以下行

$row = mysql_fetch_assoc($result); 
     $_SESSION['userid'] = $row['id']; 
     $_SESSION['username'] = $username; 
    } 

$row = mysql_fetch_assoc($result); 
     $_SESSION['userid'] = $row[0]['id']; 
     $_SESSION['username'] = $username; 
    } 

只是因爲你已經使用mysql_fetch_assoc結果數組將是一個關聯行和列的數組。

+0

沒有,'mysql_fetch_assoc'返回一行。 –

+0

不,mysql_fetch_array每次在循環中爲相同的結果集使用它時,都會返回1行。但是mysql_fetch_assoc是由select查詢選擇的所有行和列的關聯數組。 –

+0

http://php.net/manual/en/function.mysql-fetch-assoc.php –

2

的SQL語句

SELECT * FROM users WHERE username = '$username' AND password = '$password' 

將在該行的工作價值的$result會不會是假的。

這意味着結果集在發生無效的用戶名/密碼對時沒有行。

+0

那我應該怎麼做呢? –

+1

首先使用mysqli函數或PDO。見http://www.php.net/manual/en/function.mysql-num-rows.php –

5
if(!$result) { 

是錯誤的檢查。即使沒有行,這將返回有效。如果查詢執行失敗,它只會導致錯誤。你應該檢查行數,可能與mysql_num_rows

$num_rows = mysql_num_rows($result); 
if($num_rows!=1) 
{ 
echo "Bad U/P"; 
} 

注意:您停止其使用時間mysql_ *功能和移動到庫MySQLi或PDO

0

使用PDOQuick tutorial »

$sth = $dbh->prepare("SELECT `password` FROM `table` WHERE `username` = ?"); 

$sth->execute(array($username)); 

$returned_password = $sth->fetchColumn; 

...並通過執行查詢像這樣,意味着你不需要WHERE password,意味着你不需要索引password列(效率說)。

-

從結果,比較用戶輸入的密碼:

if ($returned_password == $password) 
    // OK 
else 
    // NOT OK 

...或者如果以前存儲的密碼在某些哈希值這是一個非常好的做法:

if ($returned_password == md5($password)) 
    // OK 
else 
    // NOT OK 

...至於爲什麼你當前腳本允許任何登錄,看到@Hanky Pankyㇱ的答案。

祝你好運!

+2

只是一個建議,不要使用md5。 – itachi

0

這聽起來很傻,

但你真正創建一個名爲「數據庫名稱」和用戶「data_user」數據庫?

$db_host = "localhost"; 
$db_username = "data_user"; 
$db_pass = "password"; 
$db_name = "database_name"; 

我相信你沒有把正確的數據庫的細節。請如果沒有,請告訴我們。

+0

大聲笑,我剛剛放置那些堆棧溢出。不會發出我的密碼,如:P –

+0

當然!我只是想強調它:)我認爲,因爲該行「然而任何人都可以向我解釋爲什麼它沒有連接到數據庫」在你的問題 –