1

これとは別のコードで同様の投稿を投稿しましたが、少し変更したため、期待していた回答が得られませんでした (回答はあまり役に立ちませんでした)。これで問題ないことを願っています。そうでない場合は教えてください。:)

管理者ページのページ保護を作成しようとしていますが、機能しません。私が PHP コーディングに慣れていなければ、これは問題にはならなかったと確信しています。

タイプ「0」の通常のユーザーが管理者ページindex_admin.phpにアクセスしようとすると、ユーザーは通常のユーザー ページindex.phpにリダイレクトされます。ユーザーのタイプが「1」の場合、ユーザー/管理者はページにとどまります。

これが私が動作させようとしてきたコードです。(このファイルは index_admin.php で必要とされ、index_admin_check.phpと呼ばれます)。

index_admin_check.php :

<?php
    session_start();
?>

<?php
    $vert = "localhost";
    $brukarnamn = "root";
    $passord = "";
    $db_namn = "nettsidebunad";
    $tbl_namn = "kunde_register";

    // Connection to the MySQL database.
    mysql_connect("$vert", "$brukarnamn", "$passord") or die ("Kan dessverre ikkje koble til databasen.");
    mysql_select_db("$db_namn") or die ("Kan ikkje finna den ynkjande databasen.");
?>

<?php
if (isset($_SESSION['mittbrukarnamn'])) {

    $sql1 = "SELECT `type` FROM $tbl_namn";
    $rad1 = mysql_query($sql1);
    $type1 = mysql_fetch_row($rad1);

    if ($type1 == 0) {
        echo "You do not have access to this page.";
        //header("location: index.php");
    } else {
        echo "You have access to this page.";


    }
}
?>

このテキストの一部はノルウェー語です。

$vert = $host (英語)

$brukarnamn = $usernamn (英語)

$passord = $password (英語)

$db_ namn = $db_name (英語)

$tbl_ namn = $tbl_name (英語)

$_SESSION[ 'mittbrukarnamn' ] = $_SESSION['myusername'] (英語)

4

2 に答える 2

1

今日はたくさん答えているようですが、githubに管理パネルがあり、phpログインに関する多くの一般的な質問に答えているようです。あなたの場合、あなたは単にtypeあなたのデータベースからフェッチしてそれを使うでしょう。SQLでステートメントを指定する必要があることに注意してくださいWHERE。指定しないと、そのユーザーの情報が得られません。あなたはそのテーブルにそれのすべての部分を持っているでしょう。

以下は、準備されたクエリを利用します。mysql_*関数は非推奨になりました(サポートされなくなりました。このSOの質問を参照してください)

function get_user_array() {
    /* Does all of the heavy lifting for getting user stats. */
    $db = new db(); // where db() is an abstraction class that implements mysqli and adds login details.
    if (isset($_SESSION["id"])) {
        $sid = $_SESSION["id"];
        if ($query = $db->prepare("SELECT id, name, status FROM `users` WHERE id=?")) {
                $query->bind_param("i", $sid); // i = integer
                $query->execute();
                $query->bind_result($id, $name, $status);
                $query->fetch();
                $query->close();
                $db->close();
                return array("name" => $name, "status" => $status, "id" => $id);
        } else {
            return false;
        }
    } else {
        return false;
    }
}

私の提案は、ユーザーIDを使用して、データベースからすべてを検索することでもあります。そうすれば、ユーザー名が変更されても、サイト全体がページの読み込みで爆発することはありません。


実際の比較は次のようになります。

$user = get_user_array();
if (@$user["type"] != 'admin') { // @ error-handling will make it NULL anyway.
    header("Location: index.php"); // note: this must be sent BEFORE any output!
}

そして、通常のユーザーがログインしているかどうかを確認するための高速比較(if logged_in()たとえば):

$user = get_user_array();
if (!@$user["id"]) { // continue only if logged in
    // not logged in handle
}

注:db()このクラスは(親を呼び出す場合、長期的にはmysqliパブリック関数をオーバーライドしてコードを短縮するのに最適です):

class db extends mysqli {
    public function __construct($a = DB_HOST,
                                $b = DB_USER,
                                $c = DB_PASS,
                                $d = DB_NAME,
                                $persistent = true) {
        if ($persistent) {
            parent::__construct("p:" . $a, $b, $c, $d);
        } else {
            parent::__construct($a, $b, $c, $d);
        }
    }
}
于 2013-02-03T18:03:53.147 に答える
1

WHERE句がないため、SQL クエリはすべての行を選択しています。したがって、 を呼び出すとmysql_fetch_row、最初の行のみがフェッチされます。

現在ログインしているユーザーのタイプを確認する必要があります

$sql1 = "SELECT `type` FROM $tbl_namn WHERE <user_name> = '$_SESSION[mittbrukarnamn]'";

もう 1 つの提案は、MYSQL ではなく MYSQLi または PDO をデータベース操作に使用することです。これは、MYSQL が PHP によってメンテナンスされなくなり、PHP 5.5.0 で完全に廃止されるためです。一部の MYSQL 関数は既に廃止されています。

編集:コードに別の問題があります。mysql_fetch_row配列を返すため、配列から値を取得する必要があります。

if($type1['type'] == 0)

それ以外の

if($type1 == 0)
于 2013-02-03T17:58:14.873 に答える