2013-04-11 104 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