2016-08-20 8 views
0

私は、PHPを使用して自分の役割に基づいてユーザーを別のページにリダイレクトしたいと考えています。しかし、問題は、誰でも、いつも同じページ(最初のif文が参照されたページ)にリダイレクトされることです。ユーザーロールベースのログインは常に同じページにリダイレクト

はここので、コード

<?php 
include("config.php"); 
session_start(); 

if($_SERVER["REQUEST_METHOD"] == "POST") { 

    $myusername = mysqli_real_escape_string($db,$_POST['username']); 
    $mypassword = mysqli_real_escape_string($db,$_POST['password']); 

    $sql = "SELECT * FROM user WHERE username = '$myusername' and password = '$mypassword'"; 
    $result = mysqli_query($db,$sql); 
    $row = mysqli_fetch_array($result,MYSQLI_ASSOC); 
    $active = isset($row['active']); 
    $count = mysqli_num_rows($result); 

    $role = isset($row['role']); 

    if($role == 'admin'){ 
     $link = 'admin.php'; 
    } 
    elseif($role == 'user'){ 
     $link = 'user.php'; 
    } 
    elseif($role == 'expert'){ 
     $link = 'expert.php'; 
    } 
    else{ 
     $link = '404.php'; 
    } 

    if($count == 1) { 
    $_SESSION['username'] = $myusername; 

    header("Location: ".$link.""); 
    exit(); 
    }else { 
    $error = "Your Login Name or Password is invalid"; 
    } 
} 
?> 

だ、私は別のページであれば最初の文にadmin.phpを交換した場合、ユーザーがリダイレクトされます。私は別のケースの解決策に従ったが、それは仕事をしなかった。

+0

でも、 "="を "=="に変更しても同じですが、最初のif文では同じページにリダイレクトされます。私が "==="に変更すると、404.phpにリダイレクトされます。 –

答えて

2

このライン

$role = isset($row['role']); 

設定true$roleまたは多分falseそれは間違いなく$row['role']

の内容に設定していない私は、その行を削除することをお勧めあなたの場合と同様に、完全には必要ありません/ elseif/elseはすべての可能なオプションをきちんとカバーしています。

とてもこれは次のようになりスカラー変数に$row配列から値を移動させることも全くunnecesaryある単純

//$role = isset($row['role']); 

if($row['role'] == 'admin'){ 
    $link = 'admin.php'; 
} elseif($row['role'] == 'user'){ 
    $link = 'user.php'; 
} elseif($row['role'] == 'expert'){ 
    $link = 'expert.php'; 
} else{ 
    $link = '404.php'; 
} 

残念ながら、私はそれを言及する必要があります:あなたのスクリプトがSQL Injection Attack の危険にさらされていますそれはまた、非常にdangerouでも if you are escaping inputs, its not safe! 使用prepared parameterized statements

Little Bobby Tablesに何が起こったのかを見てみましょうデータベースに平文のパスワードを格納しています。データベースの最も可能性の高い攻撃ベクトルは社内スタッフです。したがって、すべてのパスワードがハッシュされます。 PHPはpassword_hash()password_verify()を提供しています。

+0

展開するには、次のようにします。 'if(isset($ row ['role']))$ role = $(row ['role']);' –

+0

@Devrim通常、列の存在を解く必要はありません。データベースクエリ結果セット。 – RiggsFolly

+1

私は以前3つの等号でその質問を閉じて、コメント/編集に基づいてそれを再開しました。残っているのは 'isset'だけです。 lordie、彼らは自分のために物事を把握することはできませんか? * sigh/groan *のようには見えません。 –

関連する問題