5

クラスのリストを列に保持するMySQLデータベースがあり、各クラスには「レベル」があります。これは行の値であり、人ごとに変化します。したがって、たとえば数学では、可能な値として 0、1、2、および 3 があり、0 はクラスとして選択されず、1、2、および 3 はそれぞれ高、中、および低です。

ユーザーのデータベース行からクラスだけを取得する MySQL クエリがあります。

$result = mysql_query("SELECT math, physics, biology, chemistry, english, spanish, history, economics, art, theoryofknowledge, extendedessay FROM users WHERE username = '". $login_session ."'") or die(mysql_error());  

        while($row = mysql_fetch_array( $result )) {
            echo "Math:". $row['math'] ."<br />";
            echo "Physics:". $row['physics'] ."<br />";
            echo "Biology:". $row['biology'] ."<br />";
            echo "Chemistry:". $row['chemistry'] ."<br />";
            echo "English:". $row['english'] ."<br />";
            echo "Spanish:". $row['spanish'] ."<br />";
            echo "History:". $row['history'] ."<br />";
            echo "Economics:". $row['economics'] ."<br />";
            echo "Art:". $row['art'] ."<br />";
            echo "Theory of Knowledge:". $row['theoryofknowledge'] ."<br />";
            echo "Extended Essay:". $row['extendedessay'];
        }

ユーザーの出力は次のとおりです。

Math:1
Physics:1
Biology:0
Chemistry:2
English:2
Spanish:3
History:0
Economics:1
Art:0
Theory of Knowledge:1
Extended Essay:1

クラスが呼び出されるたびにifステートメントを実行せずに、ユーザーがどのレベルにあるかを判断するにはどうすればよいですか? サイトの複数の場所でクラスを呼び出す必要があり、ユーザーがどのクラスとレベルを持っているかを簡単に確認する方法が必要です。

ありがとう!

4

2 に答える 2

12

最良のアプローチは、ユーザーをロードするPHPクラスを構築し、その内部にクラス(生物学、数学など)を受け入れてユーザーのレベルを返すことができる関数を作成することだと思います。必要に応じて、必要なレベルのチェックを実行し、ユーザーのレベルが十分に高いかどうかに応じて true または false を返す単純なものを作成できます。

あなたが拡張したいと思うかもしれないいくつかの超基本的な構造をまとめました:

<?php

    class myUser
    // You are making an object here that stores information about your user.
    // This will mean you only need to query that data once from the DB, then
    // you can use it anywhere on the page without needing to do more queries.
    {
        public $math;
        public $biology;
        // I am making public variables here based on your columns
        // You cuold just as easily make an array for example to store them in.

        public function __construct($userID)
        // Making a construct class - meaning you will be able to write a snippet
        // like this: $currentUser = new myUser(6);
        // and the user information will be loaded nicely for you
        {
            $query="select math, biology from users where ID=$userID";
            // database stuff ....
            // this is where you would write your actual code to get the info
            // from the database and populate it properly, not like I did
            // below for this example
            $this->math=4;
            $this->biology=2;
        }

        public function checkUserLevel($myTopic, $reqLevel)
        // Making use of a few things here that I should ntoe:
        // This is a function you can call from the main code below
        // like this: $currentUser->checkUserLevel('math',3)
        // it will return either true or false.
        // I have used variable variables here for the $myTopic to
        // make it easier. You normally access an element differently
        // normally it is like: echo $this->math;  // output 4
        // Also I am using a ternary operator to return the data,
        // which is just a shortcut.
        {
            return ($this->$myTopic>=$reqLevel)? true : false;
        }

        public function returnUserLevel($myTopic)
        {
            return $this->$myTopic;
        }

    }

    $currentUser = new myUser(6);
    // This is creating a new user object based on the class we made above.
    // Further Explanation:
    // We have a class called myUser, but a class is just a schematic.
    // The $currenUser bit defines a new variable in our code.
    // the "= new myUser" bit says that we want to use the schematic above for this variable
    // the "myUser(6)" basically gives the constructor function an ID to get from
    // the database for the user. Because we defined a constructor class that expects
    // an ID, we need to supply it one, else we will get an error.
    // So $currentUser = new myUser(6)
    // really means "Make me a new variable called $currentUser and make it of the myUser
    // class type, and when making it, fetch me the details of student ID 6 and populate it
    // with their data.

    if($currentUser->checkUserLevel('math',3))
    // Now I am using one of the functions called checkUserLevel, supplying it
    // with the two arguments it needs and depending on it it returns true or false
    // doing one action or another.
    {
        echo "The user is at least level 3.\n";
    }
    else
    {
        echo "The user is lower than level 3.\n";
    }

    if($currentUser->checkUserLevel('biology',12))
    // same check, differnt inputs
    {
        echo "The user is at least level 3.\n";
    }
    else
    {
        echo "The user is lower than level 3.\n";
    }


    // You can output like this for example:
    echo "The users math is at: ".$currentUser->math;

    // and I added a little function that will simply return the level for you of the subject you enter.
    echo "The user is at math level ".$currentUser->returnUserLevel('math');

    // lastly you can do something like this:
    $allSubjects=array('math','physics','biology');
    for($i=0;$i<count($allSubjects);$i++)
    {
        echo "The users ".$allSubjects[$i]." level is at ".$currentUser->returnUserLevel($allSubjects[$i])."<br><br>";
    }

?>

コードの出力は次のとおりです。

The user is at least level 3.

The user is lower than level 3.
于 2012-08-06T02:51:04.100 に答える
0

1 つの方法は、ユーザーのログイン時にすべてのクラスの値を PHP セッション変数に格納することです。

<?php
    session_start();
    $_SESSION["classes"] = array();       

    $row = mysql_fetch_array($result);
    foreach($row as $class => $level)
    {
        $_SESSION["classes"][$class] = $level;
    }
?>

次に、ユーザーがセッションを閉じるかログアウトするまで、サイトの任意のページでユーザーのクラス レベルにアクセスできます。

<?php
    session_start();
    $mathLevel = $_SESSION["classes"]["math"];
?>
于 2012-08-06T02:53:04.943 に答える