2013-04-11 107 views
-2

我在登錄功能時遇到了一些麻煩。我一直在尋找幾個小時,我無法找到任何問題。我希望你們能幫助我。 我想獲取用戶的登錄名並檢查它是否存在於我的數據庫中。問題是它不斷返回我:「密碼可能不正確!」。 我試過一個「echo($ count)」,它不會返回任何東西。 「echo($ result)」是同樣的東西。PHP登錄和MySql查詢

我幾乎失去了正確的,我不明白爲什麼這不工作...

PS:我是法國人,所以你可能會看到一些法語單詞。

這裏是我的登錄表單:

<?php 
    session_start(); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Applications</title> 
    <!--Chargement des feuilles de style--> 
    <link rel="stylesheet" type="text/css" href="./css/style.css" /> 
    <link rel="stylesheet" type="text/css" href="./css/styleLogin.css" /> 
    <script src="./js/login/modernizr.custom.63321.js"></script>  
</head> 
<body> 
    <div class="container"> 


     <header></header> 

     <section class="main"> 
      <form class="form-2" id="loginForm" action="./controller/checkLogin.php" method="post"> 
       <h1><span class="log-in">Se connecter</span></h1> 
       <p class="float"> 
        <label for="loginLabel"><i class="icon-user"></i>Nom d'utilisateur</label> 
        <input type="text" name="login" id="login"> 
       </p> 
       <p class="float"> 
        <label for="passwordLabel"><i class="icon-lock"></i>Mot de passe</label> 
        <input type="password" name="password" class="showpassword" id="password"> 
       </p> 
       <p class="clearfix">  
        <input type="submit" name="submit" value="Se connecter"> 
        <input type="button" name="submitVisit" value="Accès utilisateur"> 
       </p> 
      </form>​​ 
     </section> 

    </div> 
</body> 

這是我的checkLogin.php:

<?php 

session_start(); 

try {   
    $bdd = new PDO('mysql:host=localhost;dbname=stage','root',''); 
    } 
    catch (Exception $e){ //en cas d'erreur de connexion, afficher le message   
    die('Erreur : '.$e->getMessage()); 
    } 

if(isset($_POST['submit'])){ 
    // username and password sent from form 
    $login = $_POST['login']; 
    $pass = $_POST['password']; 

    $qry = "SELECT login FROM users WHERE login = 'admin'"; 
    $result = mysql_query($qry); 


    // Mysql_num_row is counting table row 
    $count = mysql_num_rows($result); 

    if($count == 0){ 
     die("Password was probably incorrect!"); 
    } 
    // If result matched $myusername and $mypassword, table row must be 1 row 
    elseif($count == 1){ 

     // Register $myusername, $mypassword and redirect to file "login_success.php" 
     $_SESSION['login'] = $login; 
     header("location: ./login_success.php"); 
    } 

    else { 
     echo "Wrong Username or Password"; 
    } 
} 

mysql_close($bdd); 
?> 

我想這對夫妻登錄:行政/管理。

預先感謝您。

+1

你爲什麼使用PDO然後mysql _ *? – Class 2013-04-11 07:35:08

+0

混淆:S其中是mysql_select_db,爲什麼混合使用PDO和mysql,而且mysql_query已被棄用! – Vimalnath 2013-04-11 07:37:22

+0

OMG你的代碼是一種混亂..你正在使用mysql_ *與pdo和登錄沒有使用id和密碼和登錄每個用戶提交,甚至沒有驗證輸入.. – 2013-04-11 07:41:59

回答

2

您的腳本存在一些問題。

首先,您首先使用PDO連接到數據庫,然後使用mysql_*函數(已棄用,堅持PDO !!!)。另外,您沒有正確地轉義數據,並且您的代碼可能容易受到SQL注入的攻擊。

其次,您正在使用的查詢是...不好。

// this is not checking for either the user input data !!! 
$qry = "SELECT login FROM users WHERE login = 'admin'"; 

您的驗證碼應該是這樣的:

$ps = $bdd->prepare("SELECT COUNT(*) FROM users WHERE login = :login AND pass = :password"); 
$params = array("login" => $_POST['login'], "password" => $_POST['password']); 
$ps->execute($params); 

$status = (bool) $ps->fetchColumn(0); 

if ($status) { 
    // login successful 
} else { 
    // login failed 
} 

閱讀上PDOprepared statements(它們會自動逃脫你的數據,所以你不必)。

注:

如果不使用在未來的代碼編寫的語句,記得要經常逃避用戶信息的輸入和幾乎任何其他來源。

+0

我想這是我需要的,謝謝。 – Zhob 2013-04-11 07:49:17

+0

好好做好vlad ...好的答案.. +1 – Ihsan 2013-04-11 07:52:47

0

1)你在混合mysql和PDO這是一場災難。 Mysql_接口已被棄用使用的mysqli或PDO請...

2)

"SELECT login FROM users WHERE login = 'admin'"; 

發現只有登錄管理員用戶......所以,你必須

"SELECT login FROM users WHERE login = '$login'"; 

3)$ _ POST變量不安全。如果你使用的mysqli然後

$login = mysqli_real_escape_string($_POST['login']); 

消毒登錄進入和做密碼相同太用戶可以將惡意代碼注入...

例如。

+0

我對此很新,所以謝謝你,我想我永遠不會再混合起來。 – Zhob 2013-04-11 07:48:01

-1

的問題是,你是混合mysql_ *函數和PDO ..代碼應該是這樣的:

注意準備結合參數,以您的SQL查詢功能 - 它可以防止SQL注入。

session_start(); 

try {   
    $pdo = new PDO('mysql:host=localhost;dbname=stage','root',''); 
    } 
    catch (Exception $e){ //en cas d'erreur de connexion, afficher le message   
    die('Erreur : '.$e->getMessage()); 
    } 

if(isset($_POST['submit'])){ 
    // username and password sent from form 
    $login = $_POST['login']; 
    $pass = $_POST['password']; 

    $sql = "SELECT login FROM users WHERE login = :login AND password = :password"; 
    $params = array('login' => $login, 'password' => $pass); 
    $sqlprep = $pdo->prepare($sql); 

    if($sqlprep->execute($params)) { 
     $count = $sqlprep->rowCount(); 
     if($count != 1){ 
      die("Incorrect login!"); 
     } else { 
      $_SESSION['login'] = $login; 
      header("location: ./login_success.php"); 
     } 
    } 
} 
0

因爲大家介紹了一般問題的意見,我切入正題

變化:

$login = $_POST['login']; 
    $pass = $_POST['password']; 

    $qry = "SELECT login FROM users WHERE login = 'admin'"; 

假設保存到數據庫字段中輸入密碼IST名爲 「passwort」 到:

 $login = $_POST['login']; 
     $pass = $_POST['password']; 

     $qry = "SELECT login FROM users WHERE login = '".mysql_real_escape_string($login)."' and password= '".mysql_real_escape_string($password)."'"; 

mysql_real_escape_string讓你免受黑客攻擊,數據庫查詢現在使用這些值從帖子...

+0

一般問題建議:不要使用mysql_接口.... – Ihsan 2013-04-11 07:56:57