1

どのユーザーがどのページにアクセスできるかを示すこの基本的なクエリがあります。

$query = mysql_query("SELECT UserName FROM tblUsers WHERE PageOne = 1") or die (mysql_error());

基本的に、これはPageOneにアクセスできるすべてのユーザーからのチェックです。

$ currentUser = $ _SESSION ['username'](ログインしているユーザーを正しく表示する)がこの人であるかどうかを比較しようとしています。

そして、すべてのユーザーを獲得した後、

この単純なループを作成して、アクセスできるかどうかを確認します。

while ($row = mysql_fetch_assoc($query))
{
    if (in_array($currentUser,$row["UserName"]))
       echo "you have access"; //for testing purposes
    else
        die("you're not authorized");
}

これは、すべきでない場合でも、常にelseステートメントに入ります。これをデバッグしようとすると、クエリには3人のユーザーがいるはずですが、$ row ["UserName"]は1人のユーザー(最初のユーザー)しか返しません。

ただし、if / elseステートメントを削除して、$ row ["UserName"]を出力すると、正しいユーザーが出力されます。

では、これをどのように回避しますか?

ありがとう!

編集

whileループで、echo $ row ["UserName"]を実行すると、User1User2User3(User3はCurrentUser)を取得します。

デバッグするには、

if ($currentUser == $row["UserName"])
    echo "you have access";
else
    echo $row["UserName"]; 

そして私は得る

User1User2あなたはアクセスできます

4

3 に答える 3

2

投稿したコードは、返された最初の行がたまたま現在のユーザーと一致する場合にのみ機能します。それ以外の場合、ループは終了します。あなたはおそらくこのようなものが欲しいでしょう:

$has_access = false;
while ($row = mysql_fetch_assoc($query))
{
    if ($currentUser==$row["UserName"])
    {
        $has_access = true;
        break;
    }
}
// check $has_access here ...

ただし、これを行う場合は、チェック全体をSQLクエリに移動し、ループを完全に(テストせずに)取り除きます。

$query = sprintf("SELECT UserName FROM tblUsers WHERE PageOne = 1 AND UserName = '%s'", mysql_real_escape_string($currentUser));
$result = mysql_query($query) or die (mysql_error());
$has_access = mysql_num_rows($result) > 0;
// check $has_access
于 2013-03-25T15:15:29.403 に答える
2

問題を解決する方法ではありません。

まず、データベーススキーマが正規化されていないように見えます。ユーザーは1つのエンティティであり、ページは別のエンティティであり、3番目のテーブルで定義する必要のあるページにアクセスできます(N:M関係を分解します)。

$ currentUser = $_SESSION['username']かどうかを比較しようとしています

現在のユーザーがアクセス権を持っているかどうかを確認するために、データのすべての行をフェッチする理由:

$qry=mysql_query("SELECT COUNT(username) 
FROM tblUsers 
WHERE PageOne = 1 and username='" 
. mysql_real_escape_string($_SESSION['username'])
. "'");

非推奨ではないAPIを使用してコードを再実装する必要があることにも注意してください。したがって、実際には次のようになります。

$qry=mysqli_query("SELECT COUNT(username) as allowed_match
FROM users u
INNER JOIN permissions p
ON u.id=p.user_id 
WHERE p.page='PageOne'
and p.allowed = 1 
and u.username='" 
. mysqli_real_escape_string($_SESSION['username'])
. "'");
于 2013-03-25T15:18:08.867 に答える
1

whileの各ループでは、クエリ結果の値を取ります。さらに、要素が現在のユーザーと等しくないときに死ぬと、$currentUserが$row []の最初の要素でない限り、毎回死にます。したがって、ifは次のようになります。

 public function checkUserInTable($tableNumber){

         $query = mysql_query("SELECT UserName FROM tblUsers WHERE PageOne = ".$tableNumber."") or die (mysql_error());

         while ($row = mysql_fetch_assoc($query)) {
              if($currentUser == $row["UserName"]){ 
                   echo "you have access"; 
                   return true; 
              } 
         } 

         return false; 
    }

関数呼び出し:

if(checkUserInTable(1))
    echo "User Accepted";
else
    die("Error Message");
于 2013-03-25T14:51:24.760 に答える