2016-10-02 15 views
0

ログインスクリプトで何か助けが必要です。私はちょうどphpとmysqliを自前で教えようとしていて、これで固執していますので、どんなアドバイスや助けも大歓迎です。ログインが成功したら別のクエリを実行してください

ログインの詳細をチェックする実際の部分は、一致するものが見つかった場合はページを、失敗した場合はログインページに戻るように指示します。

私は、ユーザー名が確認され、セッション 'user'を使用してセッション 'member_type'に応じて、瞳孔または講師のテーブルから同じユーザーを見つけることができます。セッション 'user'はログインテーブルと同じ 'user_id'に設定され、残りの詳細は保存され、両方のテーブルの主キーとなります。

<?php 

include_once ("includes/dbconnect.php"); 
session_start(); 

$error=""; 

if (isset($_POST['btn_signin'])) { 

// username and password received from loginform 
$username=mysqli_real_escape_string($conn,$_POST['username']); 
$password=mysqli_real_escape_string($conn,$_POST['user_password']); 

$sql_checklogin="SELECT * FROM user_logins WHERE username='$username' and password='$password'"; 
$result=mysqli_query($conn,$sql_checklogin); 
$login=mysqli_fetch_array($result,MYSQLI_ASSOC); 
$count=mysqli_num_rows($result); 


// If result matched $username and $password, table row must be 1 row 
if($count==1) 
{ 
// Set Sessions 
$_SESSION['logged_in']=TRUE; 
$_SESSION['user']=$login['user_id']; 
$_SESSION['member_type']=$login['reg_type']; 

} else { 
    header("location:login.php"); 
    $error = "Invalid Username or Password!"; 
} 
} 
//This part to be replaced with code that checks both tables to find the user details 
if (isset($_SESSION['member_type'])) { 
header("Location:mydashboard.php"); 
} 

?> 
//The above code works and allows user to login but sends both member types to same page 

ちょうどこれでうまくいきますが、私はスクリプトの最後のIF部分をこのようなもの(またはより良い提案?)に置き換えたいと思います。

//if (isset($_SESSION['member_type'])=='pupil' { 
//$sql_findpupil="SELECT * FROM pupils WHERE user_id='$_SESSION['user']'"; 
//$result=mysqli_query($conn,$sql_findpupil); 
//$pupil=mysqli_fetch_array($result,MYSQLI_ASSOC); 

この部分に別のカウント機能を追加する必要がありますか?

//header("location:mydashboard.php"); 

//}elseif (isset($_SESSION['member_type'])=='instructor' { 
//$sql_findinstructor="SELECT * FROM instructors WHERE user_id='$_SESSION['user']'"; 
//$result=mysqli_query($conn,$sql_findinstructor); 
//$instructor=mysqli_fetch_array($result,$MYSLQI_ASSOC); 

ここには?

//header("location:control_panel.php"); 
//} 
//} 

私が言ったように 、私は自宅でいくつかの新しいスキルはとてもおそらく、ここでいくつかの基本的な学校の男の子の誤りを犯したと変数が設定されているかどうか

+0

あなたの出口が不足しているためです。あなたのheader()メソッドの後。 – KDOT

+0

パスワードを平文で保存しているようです。PHPは['password_hash()'](http://php.net/manual/en/function.password-hash.php) と['password_verify()']を提供していますhttp://php.net/manual/en/function.password-verify.php)それらを使用してください。 ここにいくつかの[パスワードに関する良いアイデア]があります(https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet) 5.5より前のバージョンのPHPを使用している場合は、[互換パックがあります](https ://github.com/ircmaxell/password_compat) – RiggsFolly

+0

あなたのスクリプトは[SQL Injection Attack]の危険にさらされています(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in- php) [Little Bobby Tables](http://bobby-tables.com/)に何が起こったかを見てください。 [入力を逃れているなら、その安全ではありません!](http://stackoverflow.com/質問/ 5741187/sql-injection-that-gets-around-mysql-real-escape-string) [prepared parameterized statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements)を使用してください。 php) – RiggsFolly

答えて

0

isset()チェック何かを明らかに見逃している自分自身を教えるためにしようとしています、値を確認する必要があります。あなたのif (isset($_SESSION['member_type']))は生徒とインストラクターにとって常に真です。代わりに

if ($_SESSION['member_type'] == 'pupil') { 
    header("Location:mydashboard.php"); 
} 

を試してください。

さらに、データベース設計をリファクタリングしてください。インストラクターとuserIdsを含む瞳孔テーブルを使用するのではなく、2つの行のみを含むuserType-table(瞳孔/インストラクター)を使用し、userTypeIdをユーザーテーブルに追加します。さらに、user.userTypeIdからuserType.idに外部キーを追加して、すべてのユーザーが既存のuserTypeにリンクされていることを確認します。

このデザインを使用すると、ユーザーが生徒かインストラクターかを判断するために別のクエリは必要ありません。

関連する問題