2012-01-12 9 views
0

次のコードの問題点は何ですか?私を助けてください。私のPHPスクリプトで未定義の変数エラー

通常のユーザーのログインIDとパスワードとともにデータベースのadmin-idとパスワードを一致させ、それぞれのフォームにコントロールを転送したいと考えています。

お知らせ::私はこのコードを実行すると

は、それが次のエラーを与える未定義の変数を:CではuserStatus:\ xamppの\ htdocsに\ xamppの\テスト\ HRMS \ extract.phpを行に25

注意:未定義の変数:Cでのユーザタイプ:ラインで\ xamppの\ htdocsに\ xamppの\テスト\ HRMSの\ extract.php 30

$query1="select user_type,user_staus from `user_info` where name='$username' and 
password='$password'"; 
$fetched=mysql_query($query1); 

while($record=mysql_fetch_assoc($fetched)) 
{ 
    while(each($record)) 
    { 
     $usertype=$record["user_type"]; 
     $userstatus=$record["user_staus"]; 
    }//closing of 1st while loop 
}//closing of 2nd while loop 

if($userstatus==1) //if is logged in already 
{ 
    echo "Please login after some time"; 
    exit(); 
} 

if($usertype == 0) // if user is not an admin 
{ 
    $query1="select * from `user_info` where name='$username' and password='$password'"; 
    $result = mysql_query($query1); 
    if(mysql_num_rows($result) == 1) 
    { 
     header("Location: user_form.php"); 
    } 
} 
else if($usertype == 1) //if the user is a normal user 
{ 
    header("Location: admin_form.php"); 
} 
else 
{ 
    echo "please register to login"; 
} 

は、誰かが私には、問題を見つけることができますか?

+0

phpの通知はエラーではありません。あなたの問題は他の場所にあります。 –

+1

OPのコードの他の問題にかかわらず、Noticesは本当に解決することが重要です。今日の通知は明日の悪夢です。 –

答えて

1

コードには多くの問題があります。$usertype$userstatusは事前定義されておらず、検証されていないため、エラーが発生する主な理由があります。
私の意見では、あなたのコードの主な問題ではありません。

私がお聞きしたいと思いますいくつかの質問があります。

  • 二つのループを作成するなぜあなたは、単一の行をフェッチする必要がある場合は?
  • 答えを知っている場合は、なぜデータベースを2回クエリするのですか?
  • mysql_real_escape_stringメソッドを使用して、不正な文字について$username$passwordをエスケープしていませんか?ここ

このコードは次のようになります方法の例です:nikc.orgによって示唆されるように

$query1 = "SELECT user_type,user_staus FROM `user_info` WHERE name='{$username}' AND password='{$password}' LIMIT 1"; 

$fetched = mysql_query($query1); 

//check if record exists otherwise you would receive another notice that can 
//break redirect functionality 
if (mysql_num_rows($fetched)) 
{ 
    $record = mysql_fetch_assoc($fetched); 

    // make sure that value is integer 
    if ((int)$record["user_staus"]) 
    { 
     exit("Please login after some time"); 
    } 
    else 
    { 
     $url = (bool)$record["user_type"] ? 'admin_form.php' : 'user_form.php'; 

     header("Location: {$url}"); 

     exit(0); 
    } 

} 
else 
{ 
    echo "please register to login"; 
} 

UPDATE
、あなたが持っている第三レベルにifネストを取り除き、三元比較

+1

なぜ 'if'sの3レベル深いネスト?最も内側のものは、その "親"とマージされて、if ... elseif ... else'を生成することができます。 (また 'int'にキャストするのは' bool'が本当に欲しいときには醜いIMOですが、それは私だけです。) –

+0

すばやく注目してくれてありがとう。 実際には管理者は明示的にusertypeを設定しています。これはadminの場合は1、通常のユーザーの場合は0です。ユーザーステータスは、ユーザーがログアウトしたときに更新されるログインステータスと、ログアウトしたときに再び通常のステータスに更新されます。ありがとう... –

+0

@ nikc.org完全に最小化されたコードではないことを理解しています.3桁の比較を使ってネストを避けるように、さらに最適化することができます。 – Nazariy

0

に置き換えます(完全なコードを表示していないので)スコープのルールを見落としました。

while($record=mysql_fetch_assoc($fetched)) 
{ 
    while(each($record)) 
    { 
     $usertype=$record["user_type"]; 
     $userstatus=$record["user_staus"]; 
    }//closing of 1st while loop 

} //第2の閉鎖ループ

ここで$ユーザータイプと$はuserStatusは、内側内で宣言されている間whileループ{}。 つまり、その範囲は{}にあります。コードが出てくるとすぐに$ userstatusと$ usertypeが死ぬので、それ以上のアクセスはできません。

まずグローバルエリアに変数utを宣言する必要があります。