2015-06-19 3 views
1

Я пытаюсь, чтобы моя страница входа позволяла пользователям вводить логин, используя либо свое имя пользователя, либо адрес электронной почты.Войти, используя имя пользователя или адрес электронной почты

До сих пор он разрешал пользователям регистрироваться с помощью электронной почты. Мне нужны свежие глаза, я не могу найти проблему. Я попытался удалить все упоминания о входе в систему с помощью электронной почты, но все равно не повезло, и имя пользователя, и поле электронной почты в таблице уникальны, они чередовались вокруг. Кто-нибудь поможет?

Войти Форма:

<?php 
ini_set('display_errors', '1'); 
require_once '../includes/conn.php'; 

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

if(isset($_POST['login'])){ 
    $username = $_POST['username_email']; 
    $email = $_POST['username_email']; 
    $password = $_POST['password']; 

    if($user->login($usrename,$email,$password)){ 
     $user->redirect('./index.php'); 
    }else{ 
     $error = "Login details provided do not match out records.<br /><br />"; 
    } 
} 
?> 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <title>EpicOwl UK | CMS Admin Panel Login</title> 
    <meta charset="utf-8"> 
    <link rel="shortcut icon" href="../images/favicon.ico" type="image/x-icon" /> 
    <link rel="stylesheet" type="text/css" href="../css/main.css"> 
</head> 
<body> 
<div id="header"> 
    <a href="index.php"><img id="logo" src="../images/logo.png" /></a> 
    <div id="navigation"> 
     <ul> 
      <a href="../index.php"><li>Home</li></a> 
      <a href="../users/profile.php"><li>My Profile</li></a> 
      <a href="./index.php"><li>Admin Panel</li></a> 
     </ul> 
    </div> 
</div> 
<div id="content"> 
<form method="post"><br /><br /> 
    <h2>Administrator Login</h2> 
    <?php 
    if(isset($error)){ 
    ?> 
    <em><?php echo $error; ?></em> 
    <?php 
    } 
    ?> 
    <input type="text" name="username_email" placeholder="Username/Email" required /><br /><br /> 
    <input type="password" name="password" placeholder="Password" /><br /><br /> 
    <button type="submit" name="login">Login</button><br /><br /><br /> 
    <label>Don't have an account? Why not register one by clicking <a href="./register.php">HERE</a></label><br /><br /><br /><br /> 
</form> 
</div> 
<div id="footer"> 
    <p class="copyright">&copy; EpicOwl UK. All Rights Reserved.</p> 
</div> 
</body> 
</html> 

Класс файла:

<?php 
ini_set('display_errors', '1'); 
class USER{ 
    private $db; 

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

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

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

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

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

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

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

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

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

таблицы SQL:

-- phpMyAdmin SQL Dump 
-- version 4.0.7 
-- http://www.phpmyadmin.net 
-- 
-- Host: localhost 
-- Generation Time: Jun 19, 2015 at 11:52 AM 
-- Server version: 5.5.42 
-- PHP Version: 5.3.28 

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@COLLATION_CONNECTION */; 
/*!40101 SET NAMES utf8 */; 

-- 
-- Database: `cl47-dbuser-1yz` 
-- 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `users` 
-- 

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(25) NOT NULL, 
    `email` varchar(50) NOT NULL, 
    `password` varchar(60) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `username` (`username`), 
    UNIQUE KEY `email` (`email`), 
    UNIQUE KEY `id` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ; 

Регистрация является плавник e, имя пользователя, адрес электронной почты & пароль все вставить. Спасибо, что посмотрели.

+1

'bindparam' вам нужно использовать' bindParam' с прописными буквами P и убедитесь, что вы запустили сеанс –

+1

другую вещь; убедитесь, что столбец пароля достаточно длинный, чтобы разместить хэш. 60 иногда недостаточно. Увеличьте его до 255 для использования в будущем, что рекомендуется. –

+2

также опечатка здесь 'login ($ usrename' –

ответ

3

Проблема с этой линии:

if($user->login($usrename,$email,$password)){ 
       ^^^^^^^^^ 

написано неправильно и должен читаться как $username, поэтому он только что позволяет использовать электронную почту для входа.

Согласно вашей функции входа:

public function login($username,$email,$password) 
         ^^^^^^^^^ 

Sidenote:

Убедитесь, что колонка пароль достаточно долго, чтобы приспособить хэш. 60 иногда недостаточно. Увеличьте его до 255 для будущего использования, который рекомендуется в соответствии с пособием по password_hash()

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

Также добавьте error_reporting(E_ALL); выше ini_set('display_errors', 1);

+0

Спасибо, мне нужны были свежие глаза, это была ночь Не знаю, почему я установил это на 60. Спасибо за помощь! –

+1

@ DanielMinett Добро пожаловать, Daniel. –

-1

Прежде всего, вам нужно сделать обе таблицы Unique (имя пользователя) и (электронная почта), чем добавить следующие строки в MySQL Query,

$username = $_POST['username']; 
$password = $_POST['password']; 
$query="SELECT email,username from members WHERE username='".mysql_real_escape_string($username)."' OR email='".mysql_real_escape_string($username)."' and password='".mysql_real_escape_string($password)."' LIMIT 1"; 

чем если рассчитывать больше строк, чем «0» начать сеанс ,

+0

' mysql_real_escape_string'? Они используют PDO –

+0

Я только что предложил запрос, поэтому они могут изменить их соответственно. –

+0

ваше предложение неверно. 'mysql_' и PDO не смешиваются –

1

Вам просто нужно управлять состоянием if, который проверяет поле имя пользователя/электронную почту.

как: Рассмотрим $username_email & $password наш поле ввода

Шаг 1: мы должны стрелять выберите запрос в функции входа:

"SELECT * FROM users WHERE username=$username_email OR email=$username_email LIMIT 1" 

Шаг 2: После того как мы получим деталь пользователя нам нужно подтвердить пароль этого пользователя с помощью $password (Примечание: необходимо проверить пароль зашифрован или нет)

H ope это поможет вам

+0

Спасибо за это :) –

+0

Мое удовольствие ............. ... –

Смежные вопросы