1

ロールごとのユーザー インターフェイスと機能を備えた Web アプリケーションを開発しています。usersテーブルには、各ユーザーの役割を格納する列がroleあります。enumログイン スクリプトで、ユーザー/パスに一致するレコードが見つかった場合、SESSION['role']変数をレコードのロール フィールドの値に設定します。SESSIONロールに加えて、他の変数の display_name など、いくつかのデータも保存します。次に、SESSION['role']アプリケーション全体で使用され、正しいユーザー インターフェイスをブラウザーに送信し、アクセス ルールを適用します。

これは私のローカルホストではすべて正常に動作しますが、リモート サーバーでSESSION['role']は初めて動作します。つまり、正しいユーザー インターフェイスがブラウザに送信されます。その後、SESSION['role']どういうわけか別の (既存の) ロールに変更され、その結果、アクセス ルールによって機能を使用できなくなります。さらに奇妙なのは、SESSION['role']変化するだけか、SESSION['displayname']または元のSESSION['username']ままであることです。

SESSION以外の場所に変数を設定していませんlogin.php。潜在的な原因を探す必要があるアイデアは大歓迎です。

4

2 に答える 2

1

データベース構造が同じであることを確認してください。最も顕著なのは、ENUM が同じ役割/識別子を持っていることです。有効でない値を指定すると、SQL は "STRICT MODE" で失敗しますが、それ以外の場合はいずれかの値にフォールバックします。

(ヒント: 何らかの理由がない限り、常に "STRICT MODE" で開発してください。そうすれば、ライブに配布するときに緊張することはありません)。

ロール (LEFT JOIN など) を持つ別のテーブルがある場合は、それも確認してください。

于 2012-09-11T00:58:03.807 に答える
0

問題が見つかりました。prodサーバーregister_globalsがオンになっていました(ちなみに、これはPHP 5.3.6の味のない選択です)。

しかし、それがスーパーグローバルにどのように影響するかを知らなかったので、それが原因だとは思いもしませんでした。私が持っregister_globalsていることは、すべてのスクリプトの先頭にこのコードブロックを追加することと同等でした:

foreach($_SESSION as $kn => $val) eval("$kn = $val;");
same for other super globals ...

$_SESSION['role']つまり、 define と equal to'Manager'を使用すると、次の行と同じ効果があると思いました。

$role = $_SESSION['role'];
or
$role = 'Manager';

しかし、これは下の 2 行目のように話の半分にすぎません

$role = $_SESSION['role'];
$role = 'Something else';

は影響を与えず、そのSESSION['role']値はそのままです。しかし、register_globalsがオンの場合、変更$roleすると変更され$_SESSION['role']ます。

于 2012-09-11T15:07:49.177 に答える