2

データベースで与えられた役割に基づいて、ユーザーを別のページにリダイレクトする必要があります。ログインページでは、ユーザー名とパスワードのみが送信されます。次のようなデータベースからロールをフェッチする必要があります。

username  |  password  |  role
xxxxxx       xxxxxx       admin
xxxxxx       xxxxxx       trainer
xxxxxx       xxxxxx       trainer
xxxxxx       xxxxxx       Line Manager

これが私のコードです:

// Connect to server and select databse.
mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form 
$myusername=$_POST['myusername']; 
$mypassword=$_POST['mypassword']; 


$sql="SELECT * FROM login WHERE username='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){

     // Register $myusername, $mypassword and redirect to file "login_success.php"
     $role = mysqli_fetch_array($result);


      if($role == "Admin"){
        header("location:index.php");
            exit();
      }
      elseif($role['role'] == "Trainer"){
  header("location:index1.php");
        exit();
     }
      elseif($role['role'] == "Line Manager"){
  header("location:index2.php");
        exit();
     }
      elseif($role['role'] == "Client"){
  header("location:client.php");
        exit();
     }


  }
     else {
        echo "Wrong Username or Password"; 
     }
?>
4

1 に答える 1

3

コードでは、最初のifステートメントがチェック$roleし、他のステートメントがチェックし$role['role']ます。私の推測では、「管理者」としてログインしようとしており、それが機能していないのです。

アップデート

あなたのコードには、私が最初に気付いたよりもはるかに多くの問題がありました。

  1. mysql_* 関数と mysqli_* 関数を混在させています。これは間違っているだけでなく、mysql_* 関数は廃止されました。今後は使用しないでください

  2. select ステートメントで POST 変数を直接使用すると、SQL インジェクションの危険にさらされます。これを修正する方法は、準備済みステートメントを使用することです。

免責事項:私はかなり長い間 mysqli を使用していないため、ここに示すコードにはエラーが含まれている可能性があります。

<?php
// Connect to server and select database.
$db = new mysqli($host, $username, $password, $db_name);

if( $db->connect_errno ){
    die('Unable to connect to database [' . $db->connect_error . ']');
}

// username and password sent from form 
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

if ($stmt = $db->prepare("SELECT role FROM login WHERE `username`=? and `password`=?")) {
    /* bind parameters for username and password */
    $stmt->bind_param('ss', $myusername, $mypassword);

    /* execute query */
    $stmt->execute();
    
    // If result matched $myusername and $mypassword, table row must be 1 row
    if ($stmt->affected_rows == 1) {
        // bind the result to a variable
        $stmt->bind_result($role);
        $stmt->fetch();
        
        switch( $role ){

            case 'Admin':
                header("location:index.php");
                exit();

            case 'Trainer':
                header("location:index1.php");
                exit();

            case 'Line Manager':
                header("location:index2.php");
                exit();

            case 'Client':
                header("location:client.php");
                exit();

            default:
                echo "Wrong Username or Password";
        }
    
    }

    $stmt->close();
}

$db->close();

?>

個人的にはPDOの方が好きです (下図)。私はコードをテストしていないので、完全に正確ではないかもしれませんが、正しい道をたどるはずです。

<?php
// username and password sent from form 
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

try {
    // Connect to server and select database.
    $db = new PDO("mysql:host=$host;dbname=$db_name", $username, $password);
    $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    
    $stmt = $db->("SELECT *, COUNT(*) as count FROM login WHERE `username`=:user and `password`=:pass");
    $stmt->bindParam(':user', $myusername);
    $stmt->bindParam(':pass', $mypassword);
    
    if ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
        $count = $row['count'];
        
        // If result matched $myusername and $mypassword, table must be 1 row
        if ($count == 1) {        
            switch( $row['role'] ){

                case 'Admin':
                    header("location:index.php");
                    exit();

                case 'Trainer':
                    header("location:index1.php");
                    exit();

                case 'Line Manager':
                    header("location:index2.php");
                    exit();

                case 'Client':
                    header("location:client.php");
                    exit();

                default:
                    echo "Wrong Username or Password";
            }
        }
    }
    
    $db = null;
}

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

?>

PDO の詳細については、データベース アクセスに PHP の PDO を使用する必要がある理由を参照してください。

于 2013-07-26T09:16:27.163 に答える