2014-04-03 41 views
0

嗨這種形式是爲了檢查數據庫的用戶名和密碼,並驗證登錄。 此登錄頁面正常工作,但卡住了一個小錯誤。在login.js的函數ListDBValues()中,Loop檢查數據庫以匹配用戶名和密碼。在成功匹配時,它會提醒「登錄成功」,但隨後出現「登錄失敗」,我給了休息但知道使用。我錯在哪裏?爲什麼在第一個標準匹配時執行else條件?登錄驗證循環執行其他條件'登錄失敗'後'登錄成功'

的Index.html

<html> 
<head> 
    <title>PhoneGap</title> 
    <link rel = "stylesheet" href="css/theme.min.css"/> 
    <link rel="stylesheet" href="css/jquery.mobile-1.2.1.css"/> 
    <script type="text/javascript" charset="utf-8" src="js/jquery-1.6.1.min.js"></script> 
    <script type="text/javascript" charset="utf-8" src="cordova.js"></script> 
    <script type="text/javascript" charset="utf-8" src="js/jquery.mobile-1.2.1.min.js"></script> 
    <script type="text/javascript" src="login.js"></script> 
</head> 

<body onLoad="onBodyLoad()"> 

    <div data-role="page" id="page1" data-theme="b"> 
     <div class="header" id="header" data-role="header"> 

      <h3>Registration</h3> 
     </div> 
     <div data-role="content"> 
      <div class="username" data-role="fieldcontain"> 
       <label for="username"> Username </label> 
       <input name="username" id="username" placeholder="Enter Username" value="" type="text"> 
      </div> 
      <div class="password" data-role="fieldcontain"> 
       <label for="password">Password</label> 
       <input name="password" id="password" placeholder="Enter Password" value="" type="password"> 
      </div> 
      <input id="login" value="login" type="button" onClick="validationcheck()"> 
      <input id="register" value="register" type="button" onClick="register()"> 
     </div> 
    </div> 
</div> 
</body> 
</html> 

Login.js

var db; 
var shortName = 'WebSqlDB'; 
var version = '1.0'; 
var displayName = 'WebSqlDB'; 
var maxSize = 65535; 

function successCallBack() { 
    alert("DEBUGGING: success"); 

} 

function onBodyLoad(){ 
    alert("DEBUGGING: we are in the onBodyLoad() function"); 
    if (!window.openDatabase) { 
     alert('Databases are not supported in this browser.'); 
     return; 
    } 
    db = openDatabase(shortName, version, displayName,maxSize); 
    db.transaction(function(tx){ 
     tx.executeSql('CREATE TABLE IF NOT EXISTS Contacts(UserId INTEGER NOT NULL PRIMARY KEY, fname TEXT NOT NULL, lname TEXT NOT NULL,age INTEGER NOT NULL,username TEXT NOT NULL,password TEXT NOT NULL)',[],nullHandler,errorHandler); 
    },errorHandler,successCallBack); 
} 

/*The problem is in this function*/ 
function ListDBValues() { 
    if (!window.openDatabase) { 
     alert('Databases are not supported in this browser.'); 
     return; 
    }  
    db.transaction(function(transaction) { 
     transaction.executeSql('SELECT * FROM Contacts;', [], 
      function(transaction, result) { 
       for (var i = 0; i < result.rows.length; i++) { 
        var row = result.rows.item(i); 
        var username1 = $('#username').val(); 

        var password1 = $('#password').val(); 

        var uname=row.username; 
        var pasw=row.password; 
        if(username1==uname && password1==pasw){ 
         alert("Login Success"); 
         login(); 
         break; 


        } 

        else 

        { 
         var status=1; 
        } 
       } 
       if(status==1) 
       { 
        alert("login failed"); 
       } 
      },errorHandler); 
    },errorHandler,nullHandler); 

    return; 
} 

function errorHandler(transaction, error) { 
    alert('Error: ' + error.message + ' code: ' + error.code); 

} 

function nullHandler(){}; 

function login(){ 
    window.location="file:///android_asset/www/front.html"; 
}; 
function validationcheck(){ 
    if($("#username").val() == ""){ 
     alert("please enter username"); 
     $("#username").focus(); 
    } 
    else if ($("#password").val() == "") { 
     alert("Please enter password"); 
     $("#password").focus(); 
    } 
    else 
    { 
     success(); 
    } 
} 
function success(){ 
    ListDBValues(); 
} 

function register(){ 
    window.location="file:///android_asset/www/register.html"; 
} 

回答

0

讓我們想象一下,從表中第一行不符合要求的用戶名和密碼。與「if-else」中的「else」相比,狀態變爲等於1.因此,是否會找到正確的行,狀態已經是1,並且將顯示警報。最短的修復將在「if」子句中添加

status = 0; 

。例如:

login(); 
status = 0; 
break; 

不直接與問題的建議連接:這不是好來獲取所有表來檢查用戶密碼。在循環中訪問相同的$(「#id」)也不好。我修改你的功能,以顯示我的意思:

function ListDBValues() { 
    if (!window.openDatabase) { 
     alert('Databases are not supported in this browser.'); 
     return; 
    }  
    db.transaction(function(transaction) { 
     var username1 = $('#username').val(); 
     var password1 = $('#password').val(); 
     transaction.executeSql('SELECT * FROM Contacts WHERE username = ? AND password = ?', [username1, password1], function(transaction, result) { 
      if (result.rows.length > 0) { 
       alert("Login Success"); 
       login(); 
      } else { 
       alert("login failed"); 
      } 
     }, errorHandler); 
    }, errorHandler, nullHandler); 
} 
+0

嗨,感謝一噸。它的工作和非常感謝這個想法,欣賞很多。我明白了一切,但這個功能(交易,結果)是什麼呢? –

+0

@ user2861229我們選擇有合適用戶名和密碼的行。如果至少有一個這樣的行(實際上,由於獨特的對用戶密碼,通常只有一行,但由於某種原因,可能有多行具有相同的用戶密碼),因此登錄是成功的。如果沒有這些用戶名和密碼的行,那麼登錄失敗 – Regent

+0

謝謝..非常多 –