2012-02-21 32 views
1

我問了一個非常類似的問題,我批准了一個答案,因爲我認爲它已經完成了這項工作,但它沒有!對於我的生活,我不明白爲什麼這不會工作!當用戶登錄時,我希望HTML中的表單消失!我的代碼到目前爲止! (我不會顯示所有代碼的HTML是過長...但我認爲這是培訓相關,請記住我在PHP的早期初級階段):PHP和HTML - 當用戶登錄時隱藏<form>

我有這個在我的頁面的頂部:

<?php 
if (isset($_GET['showerror'])) 
$errorcode = $_GET['showerror']; 
else 
$errorcode = 0; 
?> 

然後代碼試圖隱藏表單,如果用戶名/密碼不正確,顯示錯誤:

<?php 
if ($errorcode == 1) 
    { 
    echo "<h3>Your login has failed. Try again</h3>"; 
    } 
?> 

<?php 
session_start(); 

if (!isset($_SESSION['is_logged_in'])) { 
?> 

<form id="login" name="login" action="logincheck.php" method="post"> 
      User Name: 
      <input type="text" name="username"></input> 
      Password: 
      <input type="password" name="password"></input> 
      <input type="submit" name="submit" value="login"></input> 
      <a href="javascript: void(0)" onclick="popup('register.html')" > (Register)</a> 
      <br /><br /><br /> 
     </form> 
<? 
} 
?> 

下面的代碼是我寫的檢查,如果登錄憑據是正確的,爲了讓我們回到index.html頁面,我給errorcode指定了一個值,這樣我就可以顯示出來了錯誤消息,如果憑據是錯誤的,我將值分配給is_logged_in以隱藏表單,如果它們是正確的。在這兩種情況下,我們轉去index.html的,但希望或者與上顯示的形式和eroor消息,或沒有形式和無信息:(dbconn.php是我連接到MySQL數據庫)

<?php 
session_start(); 
require "dbconn.php"; 

$username = $_POST['username']; 
$password = $_POST['password']; 

$sql = "SELECT * FROM person WHERE name ='".$username."' AND password='".$password."'"; 

$result = mysql_query($sql) or die(mysql_error()); 

$row = mysql_fetch_array($result); 

if ($row != null) 
    { 
    $_SESSION['username'] = $row['name']; 
     header("Location: index.html?is_logged_in=1?"); 
    exit(); 
    } 
else 
    { 
    header("Location: index.html?showerror=1"); 
    exit(); 
    } 
?> 

但問題是,兩種結果都沒有,我沒有得到任何錯誤信息,也沒有隱藏的表單,因爲沒有發生任何事情,所以我很難判斷我哪裏出錯了!

謝謝sooooo提供任何幫助......我花了很多時間設置好xampp並準備好學習很多東西,但我一直在這裏待了好幾個小時!

編輯:仍然在與此代碼編輯握手!沒有顯示一些代碼,但我認爲它現在完成了!

+0

無論如何,你應該使用mysql_real_escape_string()作爲$ username和$ password! – Dion 2012-02-21 00:33:32

+0

我會查找它,我是絕對的初學者,所以沒有硬加密或任何東西....只是試圖掌握基本功能! – Phil 2012-02-21 00:34:54

+1

我看到兩件看起來很腥的東西,但我不確定他們想要發佈一個答案......反正:1)不會session_start()總是必須在每個php的最頂端它用於?嘗試將它移動到所用的所有頁面的頂部,並且2)'header(「Location:index.html?is_logged_in = 1?」)的第二個問號;'看起來也是錯誤的。如果你改變這兩件事會發生什麼? – davogotland 2012-02-21 00:35:30

回答

1

您沒有設置會話變量is_logged_in,把

$_SESSION["is_logged_in"] = 1; 

到登錄文件(括號如果$行之間!= NULL)

0

當您想要隱藏表單時檢查會話時,您正在尋找$_SESSION['is_logged_in'],但您在用戶登錄時沒有設置會話 - 只是會話變量爲username。您需要添加類似:

$_SESSION['is_logged_in'] = 1; 
0

嗯,

我想你可能會丟失設置的$ _SESSION值的聲明在驗證成功後運行你的邏輯[「is_logged_in」]。

添加在

$_SESSION['is_logged_in'] = "1"; 

到您,如果($行!= NULL)條件應該做的伎倆。 =)

原因是您正在檢查名爲is_logged_in的Session變量,但它不存在,因爲它尚未由您的代碼設置。

或者,您可以在'isset'if語句中檢查「$ _SESSION ['name']」。

在旁註中,它是一種很好的做法,用於轉義您將用作SQL語句一部分的字符串。使用PHP,一個簡單的方法就是通過PHP中內置的mysql_real_escape_string函數。允許用戶輸入直接傳遞到您的SQL語句中可能會導致SQL Injection攻擊,這是非常危險的事情。= d

0

您可以使用樣式隱藏你形式:

.form 
{ 
display:block; 
} 

.form error 
{ 
display:none; 
} 

使用小竅門使用jQuery通過使用這個API addClass()來添加一個新的類爲您的表單可以將其隱藏。

但我建議當用戶輸入錯誤的密碼或錯誤的用戶名時,應將錯誤放在表單旁邊,用戶可以再次輸入用戶名和密碼。

0

嘗試改變:

if (!isset($_SESSION['is_logged_in'])) 

要:

if (!empty($_GET['is_logged_in'])) 

但話又說回來,你要明白這是驗證用戶憑據非常不安全的方式。你不應該在URL參數傳遞這些類型的變量監守用戶可以簡單地僞造自己的日誌中寫像一個網址:

www.site.com?is_logged_in=lolhacked 
0

試試這個:

重要用途上所有的用戶輸入mysql_real_escape_string ,或者你可以非常容易地從丹Kanze評論。但它更好地學習MYSQLI擴展Prepared Statements,它更容易更清潔和更安全 這裏是一個例子。 http://mattbango.com/notebook/web-development/prepared-statements-in-php-and-mysqli/

而且這個代碼是不是很安全,使用戶可以設置$ _GET [「is_logged_in」]!= =「1」 manuell,你也許應該一個cookie添加到用戶的PC,具有獨特的價值,該用戶登錄,並且該值匹配他的用戶/通行證對,您存儲在您的數據庫中。

只是谷歌安全登錄形式的PHP或類似的東西。

<?php 


require "dbconn.php"; 


if(@$_GET['showerror'] == "1"){ 
    echo "Your login has failed. Try again"; 
    exit; 
} 


if(!empty($_POST['username']){ 
    $username = mysql_real_escape_string($_POST['username']); 
    $password = mysql_real_escape_string($_POST['password']); 
    $sql = "SELECT * FROM person WHERE name ='".$username."' AND password='".$password."'"; 
    $result = mysql_query($sql) or die(mysql_error()); 
    $row = mysql_fetch_array($result); 
    if(!empty($row)){ 
     $_SESSION['username'] = $row['name']; 
     header("Location: index.html?is_logged_in=1?"; 
     exit(); 
    }else{ 
     header("Location: index.html?showerror=1"); 
     exit(); 
    } 
} 

if(@$_GET['is_logged_in'] !== "1"){ 
    // DISPLAY FORM 
}else{ 
    // DO YOUR STUFF 
} 

?> 
+0

mysql_real_escape_string被depricated,可用於盲sql注入攻擊。不要使用這個。 – 2012-02-21 00:42:03

+0

哦,我不再使用它,只有準備好的語句,我編輯我的答案。感謝知道。 – user1015314 2012-02-21 00:43:50

0

那麼,我很新的PHP,仍然在學習自己。我可以告訴你的一件事是,你將需要加密你的密碼。使用「md5($ password);」還有其他的加密算法,但對我來說,似乎md5是最常用的。

至於登錄腳本,我從其他程序員那裏學到的一件事是在需要時使用$ _GET []。像?Page =,?viewphoto =等。不要將「登錄」的狀態存儲在URL中。使用cookies! :)

另一件事,「mysql_real_escape_string()」你將需要使用它們!!!!!!或者黑客會輕鬆運行Sql注入腳本。看看如何使用它們的PHP頁面。

我不是說我的代碼是正確的(對於php來說,仍然很新)。

if(!count($err)) 
{ 
    $_POST['username'] = mysql_real_escape_string($_POST['username']); 
    $_POST['password'] = mysql_real_escape_string($_POST['password']); 
    $_POST['rememberMe'] = (int)$_POST['rememberMe']; 

    // Escaping all input data 

    $row = mysql_fetch_assoc(mysql_query("SELECT id,usr FROM {$bd_prefix}Members WHERE usr='{$_POST['username']}' AND pass='".md5($_POST['password'])."'")); 

    if($row['usr']) 
    { 
     // If everything is OK login 

     $_SESSION['usr']= $row['usr']; 
     $_SESSION['id'] = $row['id']; 
     $_SESSION['rememberMe'] = $_POST['rememberMe']; 
     $_SESSION['logged'] = true; 

這只是我登錄腳本的開始,我再次編碼了一年。我知道一些代碼可能沒有被正確編碼,並且可能有更好的方法來做這件事。但當時它適用於我。