2015-08-05 3 views
0

Пожалуйста, помогите, я попытался создать систему входа в систему. Кажется, что нет ошибки, но когда я попытался войти с использованием имени пользователя и пароля, он сказал, что это неверно. Вот код.Ошибка входа. PHP PDO

CREATE TABLE IF NOT EXISTS `login` (
`idlogin` int(2) NOT NULL, 
`username` varchar(20) NOT NULL, 
`password` varchar(30) NOT NULL, 
`nama` varchar(20) DEFAULT NULL, 
`email` varchar(30) DEFAULT NULL, 
`telepon` varchar(13) DEFAULT NULL, 
`level` varchar(13) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; 

config.php

?php 
session_start(); 

$DB_host = "localhost"; 
$DB_user = "root"; 
$DB_pass = "pwd"; 
$DB_name = "dataseminar"; 

try 
{ 
    $DB_con = new PDO("mysql:host={$DB_host};dbname={$DB_name}",$DB_user,$DB_pass); 
    $DB_con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} 
catch(PDOException $e) 
{ 
    echo $e->getMessage(); 
} 
include_once 'class_user.php'; 
$user = new USER($DB_con); 
?> 

newlogin.php

<?php 
require_once 'config.php'; 

if($user->is_loggedin()!="") 
{ 
    $user->redirect('home.php'); 
} 

if(isset($_POST['loginsbtn'])) 
{ 
    $username = $_POST['usrname']; 
    $password = $_POST['pass']; 

    if($user->login($username,$password)) 
    { 
     $user->redirect('home.php'); 
    } 
    else 
    { 
     $error = "Invalid username or password "; 
    } 
} 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"> 
<link rel="stylesheet" href="menubarcss.css"> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <style type="text/css"> 
    h1{ 
     font-family:Arial black; 
     text-align: center; 
     color:grey; 
    } 
    h3{ 
     font-family:Arial black; 
     text-align: center; 
     color:grey; 
    } 
    </style> 
<title>Login</title> 
</head> 
    <body> 
    <h1>APLIKASI PENGELOLA DATA SEMINAR DAN PELATIHAN</h1> 
    <div class="container"> 
     <br/><br/><br/> 
     <h2 align="center">Silahkan Login terlebih dahulu</h2> 
     <table class="table table-striped table-bordered table-condensed" align="center"> 
     <form method="post"> 
     <hr /> 
      <?php 
      if(isset($error)) 
      { 
        ?> 
        <div class="alert alert-danger"> 
         <i class="glyphicon glyphicon-warning-sign"></i> &nbsp; <?php echo $error; ?> ! 
        </div> 
        <?php 
      } 
      ?> 
      <tr> 
      <td>Username</td> 
      <td><input type="text" name="usrname" placeholder="Username" required></td> 
      </tr> 
      <tr> 
      <td>Password</td> 
      <td><input type="password" name="pass" placeholder="Password" required></td> 
      </tr> 
      <tr> 
      <td colspan="2"> 
        <input type="submit" class="btn btn-block btn-primary" name="loginsbtn" value="LOGIN"> 
        <input type="reset" class="btn btn-block btn-primary" name="clearbtn" value="CLEAR"> 
      </td> 
      </tr> 
      </form> 
      <label>Belum punya akun ? <a href="createlogin.php">Sign Up</a></label> 
     </table> 
    </div> 
</body> 
</html> 

class_user.php

<?php 
class USER 
{ 
    private $db; 

    function __construct($DB_con) 
    { 
     $this->db = $DB_con; 
    } 

    public function register($username,$password,$nama,$email,$telepon,$level) 
    { 
     try 
     { 
      $new_password = password_hash($password, PASSWORD_DEFAULT); 

      $stmt = $this->db->prepare("INSERT INTO LOGIN(username,password,nama,email,telepon,level) 
                 VALUES(:username, :password, :nama, :email, :telepon, :level)"); 

      $stmt->bindparam(":username", $username); 
      $stmt->bindparam(":password", $new_password); 
      $stmt->bindparam(":email", $email); 
      $stmt->bindparam(":nama", $nama); 
      $stmt->bindparam(":telepon", $telepon); 
      $stmt->bindparam(":level", $level);    
      $stmt->execute(); 

      return $stmt; 
     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     }  
    } 

    public function login($username,$password) 
    { 
     try 
     { 
      $stmt = $this->db->prepare("SELECT * FROM login WHERE username=:username LIMIT 1"); 
      $stmt->execute(array(':username'=>$username)); 
      $userRow=$stmt->fetch(PDO::FETCH_ASSOC); 
      if($stmt->rowCount() > 0) 
      { 
      if(password_verify($password, $userRow['password'])) 
      { 
       $_SESSION['user_session'] = $userRow['idLogin']; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
      } 
     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     } 
    } 

    public function is_loggedin() 
    { 
     if(isset($_SESSION['user_session'])) 
     { 
     return true; 
     } 
    } 

    public function redirect($url) 
    { 
     header("Location: $url"); 
    } 

    public function logout() 
    { 
     session_destroy(); 
     unset($_SESSION['user_session']); 
     return true; 
    } 
} 
?> 

Это было 3 дня, так как я пытаюсь решить эту проблему. Я буду признателен за решение. Спасибо.

+1

и как вы пробовали отладить это? У вас есть многочисленные кодеки в вашем 'login()', где он может вернуть значение null, которое вы не учитываете. –

+0

Какая отладка вы сделали? Вызывается функция 'login'? Правильно ли генерируется SQL? Сколько строк возвращает ваш запрос?Какая часть кода не работает? – andrewsi

+0

Спасибо. Я нашел ответ на эту проблему. Но теперь возникает новая проблема, она не будет перенаправляться на home.php. Любое предложение? –

ответ

4

Проблема здесь из-за этого varchar(30), который установлен для вашего столбца пароля.

`password` varchar(30) NOT NULL, 

Длина не достаточно долго, чтобы приспособить хэш сгенерированный password_hash().

Alter вашей колонки, чтобы быть varchar(255)

, которая является причиной, почему он молча терпит неудачу.

Если я ошибаюсь в этом, то он играет важную роль в этом.

Вы также должны убедиться, что никакие пробелы не включены нигде.

Кроме того, вы можете увеличить длину некоторых из ваших других столбцов.

Ссылка:.

«Обратите внимание, что эта константа предназначена для изменения с течением времени, как новые и более сильные алгоритмы будут добавлены в PHP По этой причине, длина результат использования этого идентификатора может меняться со временем. Поэтому рекомендуется сохранять результат в столбце базы данных, который может расширяться до 60 символов (255 символов будут хорошим выбором) ».

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a 
          ^stops there at 30 

Вытащил из руководства:

/** 
* We just want to hash our password using the current DEFAULT algorithm. 
* This is presently BCRYPT, and will produce a 60 character result. 
* 
* Beware that DEFAULT may change over time, so you would want to prepare 
* By allowing your storage to expand past 60 characters (255 would be good) 
*/ 

Plus, bindparam Я видел это много раз терпеть неудачу со строчной "р". Вы можете использовать bindParam с капиталом «P».

Обратите внимание на комментарии, оставленные на ваш вопрос тоже.

+0

Спасибо, за размер столбца для пароля, которые исправляют проблему. Но теперь возникает новая проблема, она не перенаправляется на home.php. Любое предложение? –

+0

@TeddyMapandin Добро пожаловать. * Hm ... *, вы можете выводить перед заголовком (добавьте 'exit;' после заголовков также, это лучше всего). Добавьте отчет об ошибках в начало вашего файла (ов) сразу после открытия PHP-тега , например '

+0

еще раз спасибо за добавление выхода; но это ничего не меняет. все еще не может перенаправить. И я попытался добавить отчет об ошибках, но ошибка не появляется. –