2013-06-01 15 views
1

我編寫的登錄系統和我正在寫的php代碼沒有錯誤消息,當我使用錯誤的密碼時,仍然沒有錯誤或成功消息。我有一種感覺,PHP沒有閱讀SQL,但是你們中的一個人能否指出這一點並告訴我如何解決這個問題?我的PHP/SQL查詢有什麼問題(不會從SQL讀取)(登錄系統)

<?php 
    $accounts = mysql_connect("localhost" , "root" , "placeholder") or die (mysql_error()); 
    $loginname = $_POST['loginname']; 
    $password = $_POST['password']; 
    $needle = '@'; 
    $search = strpos($loginname, $needle); 

    if (isset($loginname)) 
    { 
     mysql_select_db("nematznetwork", $accounts); 
     //$username = "test <br>"; 
     //$password = 'pass'; 
     //$accounts; 
     //echo $loginname . "<br>"; 
     //echo $password; 


     if($search === FALSE) 
     { 
      //USERNAME 
      $username = $loginname; 
      $usernamesql = "SELECT * FROM users WHERE username='" . $username . "'"; 
      $usernameresults = mysql_query($usernamesql, $accounts); 
      while($usernamerow = mysql_fetch_array($usernameresults)) 
      { 
       $usernamecorrect = 'yes'; 
       $dbpassword = $usernamerow['password']; 
      } 
     } 
     else 
     { 
      //EMAIL 
      $email = $loginname 
      $emailsql = "SELECT * FROM users WHERE email='" . $email . "'"; 
      $emailresults = mysql_query($emailsql, $accounts); 
      while($emailrow = mysql_fetch_array($emailresults)) 
      { 
       $usernamecorrect = 'yes'; 
       $dbpassword = $emailrow['password']; 
      } 
     } 

     if($dbpassword == $password) 
     { 
      //COOKIE GOES HERE 
      //NO COOKIE YET 
     } 
     else 
     { 
      //PASSWORD ERROR GOES HERE 
      $error = 'true'; 
     } 
    } 
    else 
    { 
     //NO USER NAME VARIABLE GOES HERE 
     $error = 'true'; 
    } 

    if (isset($usernamecorrect)) 
    { 
    } 
    else 
    { 
     //WRONG USER NAME VARIABLE GOES HERE 
     $error = 'true'; 
    } 

    if (isset($error)) 
    { 
     //ERROR MESSAGE FOR INCORRECT USERNAME/EMAIL/PASSWORD 
     echo "<script type='text/javascript'>\n"; 
     echo "alert('The Username/Email or Password you entered was incorrect.');\n"; 
     echo "window.location = 「http://www.google.com;\n"; 
     echo "</script>"; 
    } 
    else 
    { 

    } 

?> 
+0

棄用具有u運行在本地主機腳本(網頁)... – NULL

+2

你的主要問題是有裂開開闊[SQL注入攻擊] (http://bobby-tables.com)漏洞,讓你徹底放棄讓你的服務器被破壞。 –

+0

Aminul-Yes,Marc B-你是什麼意思,我剛剛開始 – rn10950

回答

0

很難給出明確的答案,因爲有很多原因可能導致您無法獲得答案或錯誤。

計算機的麻煩是他們做你告訴他們的事情。

首先,不要將非轉義的用戶輸入發送到服務器是非常重要的,特別是像這樣。有'通用密碼'可以輕鬆解鎖這個系統。 確保您使用mysqli_real_escape_string或準備好的語句。

其次,請使用mysqli_ *或PDO而不是mysql_ *來啓動正確的方式,這將很快被移除。

第三,考慮將密碼存儲爲散列。

要進行調試,您需要測試每個級別。迴應你的SQL並回應查詢的結果。很快,您從數據庫收到的數據與您所期望的數據不匹配的地方會很明顯。總的來說,我可能會把這個代碼稱爲deader,然後重新開始。更安全,更值得你花時間。

+0

是mysqli_ *的語法與mysql_ *相同嗎? – rn10950

0

我推薦使用函數來檢查登錄,這樣你可以使用「return FALSE;」到處都出現了問題。

下面是一個例子,還添加了一個DEBUG常量,可以是TRUE或FALSE,具體取決於您希望調試輸出還是僅使用該函數。

<?php 

    define('DEBUG', TRUE); 

    if(login($_POST['loginname'], $_POST['password'])) 
    { 
     // cookies and stuff 
    } 
    else 
    { 
     // error message and stuff 
    } 

    function login($username, $password) 
    { 
     $database_link = mysql_connect("localhost" , "root" , "placeholder"); 

     if(!$database_link) 
     { 
      if(DEBUG) 
      { 
       die("Failed to connect to database: " . mysql_error()); 
      } 
      return FALASE; 
     } 

     mysql_select_db("nematznetwork", $database_link); 

     if(strpos($username, '@')) 
     { 
      $search_field = 'email'; 
     } 
     else 
     { 
      $search_field = 'username'; 
     } 

     $query = "SELECT * FROM useres WHERE {$search_field} = '" . mysql_real_escape_string($_POST['loginname']) ."'"; 
     $resource = mysql_query($query, $database_link); 

     if(!$resource) 
     { 
      if(DEBUG) 
      { 
       die("Failed to query database: " . mysql_error()); 
      } 
      return FALASE; 
     } 

     $result = mysql_fetch_assoc($resource); 

     if(!$result) 
     { 
      if(DEBUG) 
      { 
       die("Username not found"); 
      } 
      return FALSE; 
     } 

     if(!$result['password']) 
     { 
      if(DEBUG) 
      { 
       die("User have no password"); 
      } 
      return FALSE; 
     } 

     if($result['password'] == $password) 
     { 
      return TRUE; 
     } 
     else 
     { 
      if(DEBUG) 
      { 
       die("Wrong password"); 
      } 
      return FALSE; 
     } 
    } 

?> 

正如羅伯茨說,mysql_函數在PHP 5.5

+0

這將工作與我目前的設置?我必須做什麼mod來測試它? – rn10950

+0

是的,只需在頂部的註釋中添加somthing,大部分代碼都是從oringinal重新排列的行,重命名處理數據庫的varas以描述它包含的內容:datbase_link,query,resource,result,並添加了一些debugoutput。 –