需要有关PHP网站逻辑的帮助

时间:2017-06-22 03:26:07

标签: php pdo logic

我正在使用PHP在我的localhost上创建一个竞赛网站。该项目的工作原理如下:

用户可以登录并定向到页面level.php?n=getUserData()['level'],逻辑是如果用户提交正确答案,则用户被重定向到下一级别,并且数据库中的级别字段必须更新,以便用户可以重定向到下一级level.php?n=2等等......在登录期间,用户凭据存储在会话变量中。(user_idlevel,{{ 1}} ..等等。

我的登录控制器:

email

我的验证课程:

include 'core/init.php';

$id = isset($_GET['n']) ? $_GET['n'] : null;
$validate = new Validator;
$template = new Template("templates/question.php");
$template->title = $validate->getQuestion($id)->body;
//$template->answer  = $validate->getQuestion($id)->answer;
$userid = getUserData()['user_id'];
if(isset($_POST['submit']))
{
    //  echo getUserData()['level']; die();
    $data = array();
    $data['answer'] = $_POST['answer'];
    $required_fields  = array("answer");
    if($validate->isRequired($required_fields))
    {
        if($validate->check_answer($_POST['answer']))
        {
            if($validate->update_level($userid)) 
            {
                redirect("level.php?n=".getUserData()['level'],"Correct Anwser","success"); 
            }

        }
        else
        {
            redirect("level.php?n=".getUserData()['level'],"Incorrect","error");
        }
    }
    else
        {
            redirect("level.php?n=".getUserData()['level'],"Empty","error");
        }

}

echo $template;

?>

`

<?php class Validator { private $db; public function __construct() { $this->db = new Database; } public function isrequired($field_array) { foreach($field_array as $field) { if(empty($_POST[''.$field.''])) { return false; } } return true; } public function login($username,$password) { $this->db->query("SELECT * FROM users WHERE username=:username AND password=:password"); $this->db->bind(":username",$username); $this->db->bind(":password",$password); $result = $this->db->single(); $row = $this->db->rowCount(); if($row>0) { $this->getData($result); return true; } else { return false; } } public function getData($row) { $_SESSION['is_logged_in'] = true; $_SESSION['user_id'] = $row->id; $_SESSION['username'] = $row->username; $_SESSION['email'] = $row->email; $_SESSION['level'] = $row->level; } public function getQuestion($id) { $this->db->query("SELECT * FROM question WHERE question_id = :id"); $this->db->bind(":id",$id); $result = $this->db->single(); return $result; } public function logout() { unset($_SESSION['is_logged_in']); unset($_SESSION['username']); unset($_SESSION['user_id']); unset($_SESSION['email']); return true; } public function update_level($id) { $level = getUserData()['level']+1; $this->db->query("UPDATE users SET level = :level WHERE id = :id"); $this->db->bind(":level",$level); $this->db->bind(":id",getUserData()['user_id']); $this->db->execute(); return true; } function check_answer($answer) { $this->db->query("SELECT * FROM question WHERE correct = :answer"); $this->db->bind(":answer",$answer); $row = $this->db->single(); return $row; } } ?> 功能:

getUserData()

1 个答案:

答案 0 :(得分:0)

我相信当用户得到正确答案时,您的问题就在您的更新部分中。您需要更新会话。我建议您重新编写脚本,将getUserData()转换为User类或类似内容:

include('core/init.php');
$id     =   (isset($_GET['n']))? $_GET['n'] : null;
$validate   =   new Validator;
$template   =   new Template("templates/question.php");
# Create User class
$User       =   new User();
# Create make sure you set the files to internal array
$User->init();
# Start template
$template->title = $validate->getQuestion($id)->body;
# Fetch the id here
$userid = $User->getUserId();
# Check post
if(isset($_POST['submit'])) {
    $data = array();
    $data['answer'] = $_POST['answer'];
    $required_fields  = array("answer");
    if($validate->isRequired($required_fields)) {
        if($validate->check_answer($_POST['answer'])) {
            # Update the database
            if($validate->update_level($userid)) {
                # Increment the init() here to push the level up
                redirect("level.php?n=".$User->init(1)->getLevel(),"Correct Anwser","success"); 
            }

        }
        else {
            # Since you are not updating, don't need the init() here
            redirect("level.php?n=".$User->getLevel(),"Incorrect","error");
        }
    }
    else {
            # Since you are not updating, don't need the init() here
            redirect("level.php?n=".$User->getLevel(),"Empty","error");
    }
}

echo $template;

创建用户类

用户类

<?php
class User
    {
        private $userData;
        public function init($increment = 0)
            {
                # Get the current level
                $level  =   $_SESSION['level'];
                # If there is an increment
                if($increment > 0) {
                    # Increment the level
                    $level += $increment;
                    # !!!***Re-assign the session***!!!
                    $_SESSION['level']  =   $level;
                }
                # Save the internal array
                $userarray['username'] = $_SESSION['username'];
                $userarray['user_id'] = $_SESSION['user_id'];
                $userarray['email'] = $_SESSION['email'];
                # Level will be set by variable now
                $userarray['level'] = $level;
                # Save to array
                $this->userData =  (object) $userarray;
                # Return object for chaining
                return $this;
            }
        # This will call data from your internal array dynamically
        public function __call($name,$args=false)
            {
                # Strip off the "get" from the method
                $name       =   preg_replace('/^get/','',$name);
                # Split method name by upper case
                $getMethod  =   preg_split('/(?=[A-Z])/', $name, -1, PREG_SPLIT_NO_EMPTY);
                # Create a variable from that split
                $getKey     =   strtolower(implode('_',$getMethod));
                # Checks if there is a key with this split name
                if(isset($this->userData->{$getKey}))
                    $getDataSet =   $this->userData->{$getKey};
                # Checks if there is a key with the raw name (no get though)
                elseif(isset($this->userData->{$name}))
                    $getDataSet =   $this->userData->{$name};
                # Returns value or bool/false
                return (isset($getDataSet))? $getDataSet : false;
            }
    }
相关问题