2013-12-09 63 views
0

在你這麼說之前:我知道密碼應該被加密/散列化,但我想先弄明白: 我有這個登錄函數和一個SQL數據庫。然而,登錄功能似乎不起作用,我不知道爲什麼。我可能錯過了一些愚蠢的東西,但一段時間以來一直在苦苦掙扎。任何幫助,將不勝感激!需要關於PHP/SQL登錄功能的幫助

注意:文件db_connect.php真的只是一個基本的連接到數據庫,沒有錯也

FUNCTION.PHP:

<? 
function login($username, $password, $con) 
{  
    $myQuery = "SELECT * FROM Members WHERE Username = '$username' and Password = '$password';"; 
    $result = mysqli_query($con, $myQuery); 

    if (mysql_num_rows($result) == 0) 
    { 
     return false; 
    } 
    else 
    { 
return true; 
    } 
} 
?> 

PROCESS-的login.php:

<?php 
include 'db_connect.php'; 
include 'functions.php'; 

if (isset($_POST['username'], $_POST['pword'])) { 
    $username = $_POST['username']; 
    $password = $_POST['pword']; // The hashed password. 

    if (login($username, $password) == true) { 
     // Login success 
     header('Location: welcome.html'); 
    } 
    else 
    { 
     // Login failed 
     header('Location: index.html'); 
    } 
} 
else { 
    // The correct POST variables were not sent to this page. 
    echo 'Invalid Request'; 
} 
?> 
+0

獲得成習慣,在_every_使用數據庫調用時,測試過程的階段。當你連接時,測試連接。準備查詢時,測試結果。當您運行查詢時,測試結果。當你獲取結果時,也要測試它!如果有問題,函數mysqli_query返回false。 – halfer

回答

1

您正在將MySQL imysqli_query)與MySQL(mysql_num_rows) - 決定任何一個(最好是前者)。

如果您使用的是MySQL,則mysql_query的參數順序錯誤。

除此之外,您無法將連接作爲參數傳遞給login(如WoLfulus mentioned)。


一些額外的信息,你似乎是學習:

  • loginreturn語句可以簡化爲return mysql_num_rows($result) == 1;。如果找到一條記錄,則這將返回TRUE,否則FALSE - 此處不需要if/else聲明,則您已擁有所需的邏輯。
  • 現在任何人都可以在沒有登錄的情況下訪問welcome.html,只需在瀏覽器中輸入地址即可。這可以通過使用sessions來避免。
  • 由於您沒有正確地轉義用戶輸入(哪一個不應該信任!),您很容易受到SQL注入的影響。 mysql_real_escape_string是一個開始,但no 100% solution。如果您在另一方面使用了prepared statements,則無需擔心。
+0

感謝您的迴應,但它仍然無法正常工作。我添加了$ con並標準化爲mysql_ *。仍然不起作用... – picardisbetterthankirk

+0

「不起作用」非常模糊。儘可能地在對你的問題的評論中說出halfer的含義,並嘗試儘可能地進行調試。使用'mysql_error()'以及 – kero

+0

抱歉。沒有錯誤被返回。調試被證明是無益的。 – picardisbetterthankirk

1

您沒有爲登錄功能提供$ con參數。

function login($username, $password, $con) 

要調用它作爲

login($username, $password) 

嘗試提供連接參數,看看它是否工作。

另請注意kingkero的答案。您正在使用不同庫中的函數。

0

我在回答,因爲我沒有足夠的聲望來評論你的問題。但你應該保持你的變量在引號之外,並添加mysql_real_escape_string()來防止mysql注入。

$myQuery = "SELECT * FROM Members WHERE Username = '$username' and Password = '$password';"; 

應該是:

$myQuery = "SELECT * FROM Members WHERE Username = '". mysql_real_escape_string($username) ."' and Password = '". mysql_real_escape_string($password) ."';"; 
+0

爲什麼?在雙引號裏面可以有變量,不是嗎? – kero

+0

不!這不是 - 看看準備好的語句或轉義:http://php.net/manual/de/mysqli.prepare.php – Philipp

+0

@Philipp我的評論是關於它在查詢內部的串聯contra(正如halfer提到的)。此外['mysql_real_escape_string'不能完全防範SQL注入](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) – kero

1

有些事情,我注意到

  • 您是否使用表單中的method="POST"
  • 你的SQL查詢很容易受到SQL注入
  • 您的混合mysql_ *與mysqli_ *功能
  • 失蹤$con參數登錄功能