if和else语句,测试用户帐户状态

时间:2016-05-29 20:32:15

标签: php mysql

我想对用户帐户的状态进行测试。 如果帐户处于有效状态,我会将其重定向到用户页面 如果帐户未激活,我会再次将其重定向到登录页面并显示错误

这是我的代码

<?php

require('conexion.php');

$username = '';
$password = '';

if (isset($_POST['username']) || !empty($_POST['username']))
    $username = $_POST['username'];
if (isset($_POST['password']) || !empty($_POST['password']))
    $password = $_POST['password'];

$q1 = "select * from user where username='" . $username . "' and password='" . $password . "' ";
$r1 = $db->query($q1);
$i = 0;
echo $q1;

while ($d1 = $r1->fetch()) {
    $i++;
    //$id_perso = $d1['id_perso'];
    $type = $d1['type'];
    $nom = $d1['nom'];
    $prenom = $d1['prenom'];
    $statut = $d1['statut'];
    $user_id = $d1['id_user'];
} 

if ($i == 1) { // START IF
    session_start ();
    $_SESSION['username'] = $_POST['username']; 
    $_SESSION['password'] = $_POST['password']; 
    $_SESSION['type'] = $type;
    $_SESSION['nom'] = $nom;
    $_SESSION['prenom'] = $prenom;
    $_SESSION['statut'] = $statut;
    $_SESSION['user_id'] = $user_id;

    if ($statut = 'actif') { 
        if ($_SESSION['type'] == 'admin') {
            $path = "admin/index.php";
        }
        if ($_SESSION['type'] == 'professeur') {
            $path = "professeur/index.php";
        }
        if ($_SESSION['type'] == 'doctorant') {
            $path = "doctorant/index.php";
        }

        header("Location:".$path);
    } elseif ($statut = 'inactif') {
        header("location:login.php?inactif");  
    } 
} else {
    header("location:login.php?error=1"); 
}

?>

3 个答案:

答案 0 :(得分:0)

为什么不使用布尔值,应该更容易。

/*
1. Get Status from Database
2. When the user is active, you set the boolean true, else false. */
$booleanVar = false;

if($booleanVar) {
// user is active
} else {
// user is inactive
}

编辑: 使用标题重定向就像这样,我相信它的Case Insensitive:

header('Location: somesite.php?abc');

此外,您还必须使用&#34; ==&#34;来检查值。 (等于)或&#34; ===&#34; (相同)

答案 1 :(得分:0)

如果您使用简单查询执行此操作,则可以获得相同的结果:

您检查密码和用户名是否匹配并检查帐户是否已被激活。

$sql = 'SELECT `id` FROM `user` WHERE `username` = '$username' AND `password` = '$password' AND `statut` = 1'

然后,您可以运行查询并检查行数是否大于0.

$sql = $db->query($sql);
$results = $sql->fetch();

if (count($results) > 0) {
    // Account is activated
} else {
    header("location: login.php");
    exit;
}

通过将变量直接插入到查询中,您也容易受到SQL注入攻击,Edhurtig注意到了!预先插入SQL注入的最佳方法是使用PDO预处理语句。

答案 2 :(得分:0)

首先:不要存储PLAINTEXT中的密码。对安全散列算法(不是md5)进行一些研究,或者使用Google,Facebook,Github等第三方认证服务。

第二:此代码很容易通过$ _POST [&#39;用户名&#39;]和$ _POST [&#39;密码&#39;]

进行SQL注入

还有点不清楚被问到的是什么,但我觉得指出上述问题很重要,因为它们对安全至关重要。

这是我能够清理的。我强烈建议使用第三方身份验证服务

<?php
require('conexion.php');
$salt = "random_string";

$username='';
$password='';
if (isset($_POST['username'])||!empty($_POST['username']))     $username = $_POST['username'];
if (isset($_POST['password'])||!empty($_POST['password']))     $password = $_POST['password'];

$hashed_password = some_hashing_function_1000_times($password, $salt);

$q1="SELECT * FROM user WHERE `user`.`username` = '%s' AND `user`.`password` = '%s' LIMIT 1";

// I hope that $db has a prepare function, it prevents SQL injections from $_POST['username'] and $_POST['password']
$sql = $db->prepare($q1, $username, $hashed_password);

$r1= $db->query($q1);

$user = $r1->fetch();

if( $user ) { // START IF
  session_start();
  $_SESSION['username'] = $_POST['username']; 
  $_SESSION['password'] = $_POST['password']; 
  $_SESSION['type'] = $type;
  $_SESSION['nom'] = $nom;
  $_SESSION['prenom'] = $prenom;
  $_SESSION['statut'] = $statut;
  $_SESSION['user_id'] = $user_id;

  if($statut == 'actif'){ 
    if($_SESSION['type']=='admin') { $path="admin/index.php"; }
    if($_SESSION['type']=='professeur'){ $path="professeur/index.php"; }
    if($_SESSION['type']=='doctorant') { $path="doctorant/index.php";  }
    header("Location: " . $path);
    exit();
  }
  else if ($statut == 'inactif') {
     header("Location: login.php?inactif");
     exit();
  } 
}

header("Location: login.php?error=1"); 
exit();

// No Closing PHP tag at end of file