захватить текущий идентификатор пользователя - класс php - PullRequest
0 голосов
/ 13 октября 2009

Я создаю небольшой веб-сайт для заявления о приеме на работу, и я использую систему входа в систему, взятую из учебника Nettuts.com. Вход в систему работает нормально, но у меня возникают проблемы с получением сведений о текущем вошедшем в систему пользователе, например, если пользователь вводит свои личные данные, я могу обработать данные в базе данных, но они не связаны с каким пользователем!

В идеале я хочу, чтобы идентификатор помещался в переменную с именем $ userID.

Мне нужен способ идентифицировать пользователя, вошедшего в данный момент, чтобы я мог обновить свои операторы вставки до чего-то вроде ... 'ОБНОВЛЕНИЕ cv, где userID = $ userID'.

class Mysql {
private $conn;

function __construct() {
    $this->conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or
                  die('There was a problem connecting to the database.');
}

function verify_Username_and_Pass($un, $pwd) {

    $query = "SELECT *
            FROM users
            WHERE username = ? AND password = ?
            LIMIT 1";

    if($stmt = $this->conn->prepare($query)) {
        $stmt->bind_param('ss', $un, $pwd);
        $stmt->execute();

        if($stmt->fetch()) {
        $stmt->close();
        return true;

        }
    }       
}

}

Членство в классе {

function validate_user($un, $pwd) {
    $mysql = New Mysql();
    $ensure_credentials = $mysql->verify_Username_and_Pass($un, md5($pwd));

    // if above = true
    if($ensure_credentials) {
        $_SESSION['status'] = 'authorized';
        $_SESSION['username'] = $un;
        $_SESSION['password'] = $pwd;
        header("location: ../myIWC.php");
    } else return "Please enter a correct username and password";

}

function log_User_Out() {
    if(isset($_SESSION['status'])) {
        unset($_SESSION['status']);
        unset($_SESSION['username']);
        unset($_SESSION['password']);
        if(isset($_COOKIE[session_name()])) 
            setcookie(session_name(), '', time() - 1000);
            session_destroy();
    }
}

function confirm_Member() {
    session_start();
    if($_SESSION['status'] !='authorized') header("location: ../login.php");
}


$currentUN = $_SESSION['username'];
$currentPWD = $_SESSION['password'];

$mysql = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die('There was a     problem connecting to the database');
$stmt = $mysql->prepare('SELECT id FROM users WHERE username = ? AND password = ? LIMIT 1');
$stmt->bind_param('ss',$currentUN, $currentPWD);
$stmt->execute();
$stmt->bind_result($currentID);
}

Ответы [ 2 ]

0 голосов
/ 02 ноября 2009

Ну, я бы сказал, код, приведенный в руководстве, не очень хороший пример. Класс базы данных должен быть именно таким и обрабатывать только функции базы данных, в которых он не должен иметь пользовательских функций (verify_Username_and_Pass). Также с точки зрения безопасности я настоятельно рекомендую не хранить незашифрованные пароли в сеансе.

Я ценю, однако, что фрагменты кода, которые вы предоставили, вероятно, являются частью более широкой реализации, и поэтому вы не сможете слишком много поиграть с этим. Таким образом, приведенный ниже код будет работать в вашем контексте.

class Mysql {
private $conn;

function __construct() {
        $this->conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or
                                  die('There was a problem connecting to the database.');
}

function verify_Username_and_Pass($un, $pwd) {

        $query = "SELECT id
                        FROM users
                        WHERE username = ? AND password = ?
                        LIMIT 1";

        if($stmt = $this->conn->prepare($query)) {
                $stmt->bind_param('ss', $un, $pwd);
                $stmt->execute();
                $stmt->bind_result($id);

                if($stmt->fetch()) {
                $stmt->close();
                return $id;

                } else {
                    return false;
                }
        }               
}

Тогда в вашем классе пользователя

if($ensure_credentials !== false) {
                $_SESSION['id'] = $ensure_credentials;
                $_SESSION['status'] = 'authorized';
                $_SESSION['username'] = $un;
                $_SESSION['password'] = $pwd;
                header("location: ../myIWC.php");
        } else return "Please enter a correct username and password";
0 голосов
/ 13 октября 2009

Подумайте о переписывании вашей функции verify_Username_and_Pass, чтобы она возвращала массив пользовательских данных, или о написании новой функции, которая их получает. Затем в вашей функции validate_user сохраните эти данные в сеансе:

$_SESSION['user_data'] = $user_data; // got from database
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...