2014-09-21 4 views
0

사용자를 등록 할 수는 있지만 로그온 할 때 2 가지 문제가 있습니다.내 로그인이 작동하지 않음

사용자 이름을 사용하여 로그인 할 수 있지만, 암호 입력 섹션에서 원하는 항목을 입력하고 데이터베이스에있는 실제 암호를 확인하지 않습니다.

2 : 전자 메일과 암호를 함께 사용하려고하면 기록 할 수 없습니다. -in, 오류 메시지 만받습니다.

내 문제가 내 $query select FROM members bla bla ... 안에 있다고 생각하고 있지만 확실하지 않습니다.
그런 멍청한 녀석 인 것에 대해 유감스럽게 생각합니다.

는 register.php

<form method="post" action=""> 

<input type="text" name="username" placeholder="USERNAME"> 

<input type="password" name="password1" placeholder="PASSWORD"> 

<input type="password" name="password2" placeholder="CONFIRM PASSWORD"> 

<input type="text" name="email" placeholder="E-MAIL"> 

<input type="date" name="age" id="age" > 


<input type="radio" value="male" name="gender" checked> 
<input type="radio" value="female" name="gender"> 


<input type="submit" value="SIGN UP" name="create_member"> 
</form> 



<?php 

require_once ("core/connect.php"); 

if(isset($_POST['create_member'])) 
{ 
    $username = mysqli_real_escape_string($dbc, trim ($_POST['username'])); 
    $password1 = mysqli_real_escape_string($dbc, trim ($_POST['password1'])); 
    $password2 = mysqli_real_escape_string($dbc, trim ($_POST['password2'])); 
    $email = mysqli_real_escape_string($dbc, trim ($_POST['email'])); 
    $age = mysqli_real_escape_string($dbc, trim ($_POST['age'])); 
    $gender = mysqli_real_escape_string($dbc, trim ($_POST['gender'])); 

    if($password1 != $password2) 
    { 
     echo 'THE TWO PASSWORDS ARE NOT THE SAME'; 
    } 

    $hash = hash('sha256', $password1); 

    function createSalt() 
    { 
     $text = md5(uniqid(rand(), true)); 
     return substr($text, 0, 3); 
    } 

    $salt = createSalt(); 
    $password = hash('sha256', $salt . $hash); 

    if(!empty($username) && !empty($email) && !empty($password) && !empty($age) && !empty($gender)) 

    { 
     $query_ind = "INSERT INTO members VALUES ('', '$username', '$password', '$email', '$age' , '$gender', '$salt', NOW())"; 
     mysqli_query($dbc, $query_ind); 

    } 
    else 
    { 
     echo "FILL OUT THE FORM PLEASE"; 
    } 
} 
?> 

이며,이

<?php 

$error_msg = ''; 

    if (isset($_POST['member_login'])) 
    { 
     // Grab the user-entered log-in data 
     $member_username = mysqli_real_escape_string($dbc, trim($_POST['username'])); 
     $member_email = mysqli_real_escape_string($dbc, trim($_POST['username'])); 
     $member_password = mysqli_real_escape_string($dbc, trim($_POST['password'])); 


     if (!empty($member_username) && !empty($member_password)) 
     { 
      // Look up the username and password in the database 
      $query = "SELECT * FROM members WHERE member_username = '$member_username' OR member_email = '$member_email' AND member_password = '$member_password'"; // SHA('$member_password')"; 

      $data = mysqli_query($dbc, $query); 

      if (mysqli_num_rows($data) == 1) 
      { 
       // The log-in is OK so set the user ID and username session vars (and cookies), and redirect to the home page 
       $row = mysqli_fetch_array($data); 

       $_SESSION['member_id'] = $row['member_id']; 
       $_SESSION['member_username'] = $row['member_username']; 
       $_SESSION['member_email'] = $row['member_email']; 

       setcookie('member_id', $row['member_id'], time() + (60 * 60 * 24 * 7)); // expires in 7 days 
       setcookie('member_username', $row['member_username'], time() + (60 * 60 * 24 * 7)); // expires in 7 days 
       setcookie('member_email', $row['member_email'], time() + (60 * 60 * 24 * 7)); // expires in 7 days 

       header('Location: ' . $_SERVER['PHP_SELF'] . '?page=mlog_in'); 


      } 
      else 
      { 
       // The username/password are incorrect so set an error message 
       $error_msg = ' INCORRECT INFOMATION, TRY AGAIN. '; 
      } 
     } 
     else 
     { 
     // The username/password weren't entered so set an error message 
     $error_msg = ' INCORRECT INFOMATION, TRY AGAIN. '; 
     } 
    } 

    mysqli_close($dbc); 

if(!isset($_SESSION['member_id'])) 
{ 
    ?> 
      <div class="sixteen columns"> 
      <h2>LOGIN</h2> 
      <form action="<?php echo $_SERVER['PHP_SELF']?>" method="post" class="sixteen columns"> 

      <input required type="text" name="username" placeholder="USERNAME/E-MAIL"/> 
      <input required type="password" name="password" placeholder="PASSWORD" /> 

      <input required type="submit" name="member_login" value="LOGIN" /> 

      <input type="checkbox" name="remember" value="1"><span>REMEMBER ME</span> 

       <?php 
        echo '<p>' . $error_msg . '</p>'; 
       ?> 

      <?php 
      echo '<a href="index.php?page=register" title="CLICK TO SIGN UP">MAKE A PROFILE</a>'; 
      ?> 


     </form> 
     </div> 

    <?php 
} 


    else 
{ 
    $profile = ''; 
    if(isset($_GET['profile'])) 
    { 
     $profile = $_GET['profile']; 
    } 

    ?> 


    <?php 
     switch($profile) 
     { 

      default : 
       require_once 'profile/userpage.php'; 
      break; 

     } 
} 

?> 
+1

암호로 해시를 해시해야합니다. 암호를 확인하기 위해 암호를 다시 계산하지 않습니다. –

+0

비밀번호를 확인하기 위해 "다시 계산"한다는 것은 무엇을 의미합니까? –

답변

0

귀하의 SQL 쿼리 중 하나 member_username = '$member_username' 또는 member_email = '$member_email' AND member_password = '$member_password'

SELECT * 
FROM members 
WHERE member_password = '$member_password' 
AND (member_username = '$member_username' OR member_email = '$member_email'); 
로 변경합니다 일치하는 login.php입니다

m에 대해 Operator Precedence in Mysql을 참조하십시오. 광석 정보.

1

로그인에 두 가지 문제가 있습니다. 둘 다 SELECT와 관련이 있지만 다른 이유가 있습니다.

먼저 논리 연산자 AND 및 OR은 연산자입니다. 수학 연산자와 마찬가지로 연산 순서가 있습니다. 덧셈을하기 전에 곱셈을하는 것과 같은 방법으로 OR 이전에해야합니다.

이제 명확성을 위해 몇 가지 변수를 대신 사용하여 SELECT를 자세히 살펴 보겠습니다.

WHERE username=$username OR email=$email AND password=$password 

"email = $ email AND password = $ password"가 먼저 평가된다는 조작 순서를 따르면. 사용자 이름을 사용하여 로그인하려고하면 사용자 이름이 이메일과 같지 않기 때문에 항상 false가됩니다. 새로운 방정식은 다음과 같습니다 그들은 사용자 이름을 사용하여 로그인을 시도하고 있기 때문에, 표현의 첫 부분이 true로 평가합니다 전체 표현식을 의미 true로 평가합니다

WHERE username=$username OR false 

. 그래서 사용자 이름으로 로그인을 시도 할 때 사용하는 비밀번호는 중요하지 않습니다.

이제 이메일을 사용하여 로그인하려고하면 어떻게 될까요? 이 경우 데이터베이스 암호가 암호 변수와 결코 일치하지 않도록 암호 해시를 잊어 버렸습니다.

희망 사항.

관련 문제