Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用用户名或电子邮件登录_Php_Html_Mysql - Fatal编程技术网

Php 使用用户名或电子邮件登录

Php 使用用户名或电子邮件登录,php,html,mysql,Php,Html,Mysql,我正在尝试让我的登录页面允许用户使用他们的用户名或电子邮件地址登录 到目前为止,它只允许用户使用电子邮件登录。我需要一些新鲜的眼睛,我找不到问题。我尝试过删除所有关于使用电子邮件登录的内容,但仍然没有成功,表中的用户名和电子邮件字段都是唯一的,我尝试过交替使用。有人帮忙吗 登录表单: <?php ini_set('display_errors', '1'); require_once '../includes/conn.php'; if($user->is_loggedin()!=

我正在尝试让我的登录页面允许用户使用他们的用户名或电子邮件地址登录

到目前为止,它只允许用户使用电子邮件登录。我需要一些新鲜的眼睛,我找不到问题。我尝试过删除所有关于使用电子邮件登录的内容,但仍然没有成功,表中的用户名和电子邮件字段都是唯一的,我尝试过交替使用。有人帮忙吗

登录表单:

<?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;
    }
}
?>
-- 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 @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@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 ;

注册是罚款,用户名,电子邮件和密码都插入。感谢您的关注。

首先,您需要使两个表都唯一(用户名)和(电子邮件),然后将以下内容添加到mysql查询中:

$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”,则启动会话。

此行存在问题:

if($user->login($usrename,$email,$password)){
                ^^^^^^^^^
拼写错误,应读为
$username
,这就是为什么它只允许您使用电子邮件登录

根据您的登录功能:

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

旁注:

确保password列足够长以容纳散列。60英镑有时是不够的。将其增加到255以备将来使用,建议按照
password\u hash()

因此,建议将结果存储在可扩展到60个字符以上的数据库列中(最好选择255个字符)

还添加
错误报告(E_ALL)以上
ini\u集('display\u errors',1)

  • 您不会因此而收到任何错误,这将通过未定义的usrename变量通知捕获到错误


您只需管理
if
条件,该条件检查字段用户名/电子邮件

<> >:考虑<代码> $USENAMEYEMAIL < /COD> >代码> $密码<代码>是我们的输入字段

步骤1:我们需要在登录功能中启动选择查询:

"SELECT * FROM users WHERE username=$username_email OR email=$username_email LIMIT 1"
步骤2:获得用户详细信息后,我们需要使用
$password
验证该用户的密码(注意:必须检查密码是否加密


希望这将帮助您

bindparam
您需要将
bindparam
与大写的p一起使用,并确保您启动了另一个会话;确保password列足够长以容纳散列。60英镑有时是不够的。建议将其增加到255以备将来使用。这里还有一个输入错误
login($usrename
谢谢Fred,我不知道为什么我设置为60…随时Daniel,干杯
mysql\u real\u escape\u string
?他们正在使用PDO我刚刚建议了查询,所以他们可以相应地更改查询。你的建议是错误的。
mysql\u
和PDO不要混在一起同意,这是错误的。不过感谢你的时间!谢谢,我需要fresh eyes,这是一份通宵工作。不知道我为什么把它设为60。谢谢你的帮助!@DanielMinett不客气,丹尼尔。我很高兴。。。。。。。。。。。。。。。。