2015-07-12 31 views
1

我一直在試圖編寫一個PHP程序,使用戶能夠註冊一個帳戶和登錄後才能登錄。我已經設法阻止多個用戶名的註冊,並將所有註冊的用戶名和相應的密碼存儲在一個SQL表中,但我試圖通過驗證密碼來登錄工作,並且PHP似乎沒有從SQL中識別任何東西。我試過mysqli_fetch_arraymysqli_fetch_assoc無數的變化無濟於事。 PHP代碼的全部內容在下面發佈,其中註釋說明了最相關的部分。從SQL打印到PHP?

<?php session_start(); ?> 
<html> 
<head> 
    <title>Test Form</title> 
</head> 

<body> 
<link rel="stylesheet" type="text/css" href="main.css" /> 

<?php 
include('mydbinfo.php'); 

$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname); 
if ($conn->connect_error) { 
    echo("<font color='red'><p>Unable to connect to the database system</font>"."<font color='red'>Please try later.</font></p>"); 
    exit(); 
} 

if($_POST["email"].value == "" or $_POST["password"].value == "") { 
    print("<font color='red'><p>Sorry, you must enter values into each field.</font></p>"); 
} else { 
    $mail = $_POST["email"]; 
    $_SESSION["sessUsername"] = $mail; 
    $pass = $_POST["password"]; 
    $query = "SELECT user_password FROM logins WHERE email='$mail'"; 

    $result=mysqli_query($conn,$query); 

    while($name = mysqli_fetch_array($result)) { 
     array_push($names,$name['email']); 

     for($n = 0; $n < count($names); $n++) { 
      if($names[$n] == $name['email']) { 
       $names++; 
      } 
     } 

    } 

    //Number of instances of SQL query result found in table. 
    $count = mysqli_num_rows($result); 

    if($count > 0) { 

     //Supposed to contain password which corresponds to a given user ID. 
     //This is the main issue. 
     $new=mysqli_fetch_array($result); 

     if($pass == $new) { 
      print "<font color='red'><p>Welcome back, $mail!</p></font>"; 
     } else { 
      print "<font color='red'>Your reservation was invalid.</font>"; 
      print($pass); 
      print($result); 
     } 

    } else { 
     echo "<font color='red'>Not found in table.</font>"; 
    } 
} 
?> 

</body> 
</html> 
<?php> 
+0

螺紋在代碼塊中不起作用。 – GolezTrol

+0

我認爲用粗體代碼不是一個好主意。也許你可以在之前添加一條評論來說它是與問題最相關的部分,但是它並不能使用stackoverflow的代碼格式進行讀取。 – nha

+0

哇,這是令人尷尬的。它是「//在表中找到的SQL查詢結果的實例數。」到最後纔是真正有意義的,有沒有其他方式可以表明這一點? – eversomber

回答

2

當您抓取時,您會抓取整行(或整個數據集)。

在你的情況,你用一個while循環,所有行遍歷。之後,您再次獲取另一行,但這不起作用,因爲您已經使用循環提取了所有行。

此外,你比較$pass你得到的陣列(整行),這當然不會工作。

所以,這個片斷:

$new=mysqli_fetch_array($result); 
if ($pass==$new) 
{ 
print "<font color='red'><p>Welcome back, $mail!</p></font>"; 
} 

應該只是

if ($name['user_password'] == $pass) 
{ 
    print "<font color='red'><p>Welcome back, $mail!</p></font>"; 
} 

$name是在你閱讀的行(或多個)匹配的電子郵件地址,所以通過改變變量我建議的代碼使您的代碼使用匹配的最後一個密碼。

之後,還有解決其他問題。首先,登錄時,你不需要一個while循環。希望只有一個帳戶匹配,並且您應該採取預防措施以確保您無法首先創建重複帳戶。

而且$name是不是該變量的最好的名字,因爲它包含了整個行,​​在它的名稱和密碼。

另外,我注意到,查詢完全不返回姓名或電子郵件,以便對其進行驗證可能是循環也不起作用。所以,或許重新審視一下,或者重新開始是個好主意。畢竟,你一直在試驗,雖然這是非常豐富的,但它也使代碼混亂。有時候最好重新開始,並將獲得的知識用於構建新的改進版本。

+0

非常感謝。你是對的,這段代碼經歷了幾次迭代,有點麻煩,但主要問題是我將整個數組與用戶提供的密碼進行比較。我解決了這個問題,現在正在做我想做的事情。再次感謝。 – eversomber

1

只是以補充GolezTrol給出了答案,我想你應該考慮閱讀有關準備語句,這是一個簡單的方法來防止SQL注入是在你的代碼的主要威脅。

你可以簡單地檢查組合電子郵件:存在通過簡單地執行這個查詢密碼:

SELECT email FROM logins WHERE email=? AND user_password=? 

如果您在您造成的任何行,登錄憑證是正確的。通過這個查詢,您將被設置爲執行準備好的語句,請閱讀this

0

GolezTrol's answerjoaomlap's answer提供的附加信息做了很好的回答這個問題。我只是想,我會談談其他一些可能不會造成挫折的事情,但最終他們可能會做出。


首先 -<font><p>標籤是不正確的代碼下面幾行命令:

echo("<font color='red'><p>Unable to connect to the database system</font>" 
     ."<font color='red'>Please try later.</font></p>") 

print("<font color='red'><p>Sorry, you must enter values into each field. 
     </font></p>"); 

您應該切換繞開口<font><p>標籤看起來像:

echo("<p><font color='red'>Unable to connect to the database system</font>" 
     ."<font color='red'>Please try later.</font></p>") 

print("<p><font color='red'>Sorry, you must enter values into each field. 
     </font></p>"); 

更重要的是,你應該給<p>標籤的id<p id='red-text'>和編輯您main.css樣式表來改變red-text ID的文本顏色。因此不需要將所有<font>標籤都放在一起。


二 -所有<link>標籤應位於開閉<head>標籤之間和<title>標籤下方,如果<title>標籤存在。

[該<鏈接>標籤] 也僅限於頭部分,但它可以出現在任何的次數。
- 來自:HTML link tag - W3Schools

所以,你的代碼:

<head> 
    <title>Test Form</title> 
</head> 

<body> 
    <link rel="stylesheet" type="text/css" href="main.css" /> 
    <!-- more code --> 
</body> 

應改爲:

<head> 
    <title>Test Form</title> 
    <link rel="stylesheet" type="text/css" href="main.css" /> 
</head> 

<body>
<link rel="stylesheet" type="text/css" href="main.css" />
<!-- more code -->
</body>


三 -什麼跟在晃來晃去<?php標籤的了你的代碼結束了嗎?僅當在純代碼php的文件中使用時,可以收穫不關閉<?php標籤的好處。

如果文件是純PHP代碼,則最好省略文件末尾的PHP結束標記。這可以防止在PHP結束標記後添加意外空白或新行,這可能會導致不必要的影響,因爲當程序員無意在腳本中的該位置發送任何輸出時,PHP將開始輸出緩衝。 - The PHP Manual