Переменная сеанса имени пользователя PHP не сохраняется, если имя пользователя содержит число - PullRequest
0 голосов
/ 02 июня 2018

Я искал этот вопрос, но не смог его найти.

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

Когда я создаю пользователя с только буквами вимя пользователя, он отлично работает и перенаправляет их на страницу индекса.Однако, когда я создаю пользователя, такого как «student1», он не будет устанавливать переменную сеанса и, следовательно, не будет перенаправлять его.

Вы можете попробовать это самостоятельно на http://collinmath.com/accounts/create.php, чтобы понять, что я имею в виду.(Просто не используйте реальную информацию, так как я еще не настроил SSL)

<?php

// call the register() function if register_btn is clicked
if (isset($_POST['register_btn'])) {
    // Set variables equal to POST data
    $login_name = $_POST['username'];
    $first_name = $_POST['firstname'];
    $last_name = $_POST['lastname'];
    $email = $_POST['email'];
    $role = $_POST['role'];
    $pwd1 = $_POST['password_1'];
    $pwd2 = $_POST['password_2'];
    register();
}

// Register function will check the input and add the user if
// the input is accepted
function register() {

global $login_name;
global $first_name;
global $last_name;
global $email;
global $role;
global $errors;
global $connection;
global $pwd1;
global $pwd2;
global $hostname;
global $username;
global $password;
global $dbname;

// Connect to database
$connection = mysqli_connect($hostname, $username, $password);
mysqli_select_db($connection, $dbname);

// Check that username contains only letters and number
if (preg_match('/[^A-Za-z0-9]/', $login_name)) {
    array_push($errors, "Username must contain only letters and/or numbers");
} else {
    $login_name = strtolower($login_name);
}

// Sanitize SQL data
$first_name = mysqli_real_escape_string($connection, $first_name);
$last_name = mysqli_real_escape_string($connection, $last_name);

// Validate registration input and generate error log if there are issues

    // Check if username is taken or empty
    if (strlen($login_name) > 4) {
        $query = "SELECT `User_Login` AS `Login` FROM `CMP_Users` WHERE `User_Login`=?";

        $mysqli = new mysqli($hostname, $username, $password, $dbname);
        $mysqli->set_charset("utf8");
        $stmt = $mysqli->prepare($query);
        $stmt->bind_param("s", $login_name);
        $stmt->execute();
        $result = $stmt->get_result();
        $row = $result->fetch_assoc();

        if ($row[Login]) {
            array_push($errors, "That username is taken");
        } 
    } else {
        array_push($errors, "Username must be at least 5 characters long");
    };

    if (strlen($login_name) > 16) {
        array_push($errors, "Username must be 16 characters or less");
    }

    // Check First name
    if ($first_name) {
        if (preg_match('/[^A-Za-z\'\-\s]/', $first_name) || !preg_match('/[A-Za-z]/i', $first_name)) {
            array_push($errors, "First Name is not valid");
        }
        if (strlen($first_name) > 15) {
            array_push($errors, "First name must be 15 characters or less");
        }
    } else {
        array_push($errors, "Must enter a first name");
    }

    //Check Last name
    if ($last_name) {
        if (preg_match('/[^A-Za-z\'\-\s]/', $last_name) || !preg_match('/[A-Za-z]/i', $last_name)) {
            array_push($errors, "Last Name is not valid");
        }
        if (strlen($last_name) > 25) {
            array_push($errors, "Last name must be 25 characters or less");
        }
    } else {
        array_push($errors, "Must enter a last name");
    }

    // Validate e-mail
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        array_push($errors, "Please enter a valid e-mail address");
    }

    if (strlen($email) > 50) {
        array_push($errors, "E-mail address must be 50 characters or less");
    }

    // Check if role is legal
    $role_value = 0;
    if ($role == 'student') {
        $role_value = 1;
    } else if ($role == 'teacher') {
        $role_value = 2;
    } else {
        array_push ($errors, "No role selected");
    }

    // Check if passwords match
    if ($pwd1 != $pwd2) {
        array_push($errors, "Passwords do not match");
    } else {
        // Check if passwords meet criteria
        if (!preg_match('/\W/', $pwd1) || !preg_match('/[0-9]/', $pwd1) ||
        strlen($pwd1) < 10) {
            array_push($errors, "Password is not valid");
        }
    }

// If there are no errors, commit results to DB and create session

if (empty($errors)) {
    // Hash passwords for DB storage   
    $pwd1 = password_hash($login_name . $_POST['password_1'], PASSWORD_DEFAULT);

    /*
        THIS WILL NEED TO BE UPDATED WHEN E-MAIL VALIDATION IS IMPLEMENTED
    */
    // Create query for inserting new data
    $add_user_query = "INSERT INTO `CMP_Users` (User_First_Name, User_Last_Name, "
        . "User_Login, User_Email, User_Password, User_Role, User_Created) VALUES "
        . "(?, ?, ?, ?, ?, ?, NOW())";

    $mysqli_add_user = new mysqli($hostname, $username, $password, $dbname);
    $mysqli_add_user->set_charset("utf8");
    $stmt_add_user = $mysqli_add_user->prepare($add_user_query);
    $stmt_add_user->bind_param("sssssi", $first_name, $last_name, $login_name, $email, $pwd1, $role_value);
    $stmt_add_user->execute();


    // Set session variables
    $_SESSION['username'] = $login_name;
    $_SESSION['role'] = $role_value;
    $_SESSION['email'] = $email;
    $_SESSION['fname'] = $first_name;
    $_SESSION['lname'] = $last_name;
    $connection->close();
    header('Location: http://www.collinmath.com/mathpages/index.php');
    exit();
}

// Close db connection
$connection->close();

}

// Check whether the user is already logged in
// and redirect them to the main user page if they are
if (isset($_SESSION['username'])) {
    header('Location: http://www.collinmath.com/mathpages/index.php');
    exit();
}

?>

ОБНОВЛЕНИЕ:

Итак, я изменил кучу кода и возился с php.ini файл, но у меня все еще есть проблемы.Когда я смотрю на мои куки, я вижу, что печенье там.Я вижу, что файл создан в папке сессий и переменные установлены в этом файле, но информация о сеансе по-прежнему отсутствует, когда я выполняю var_dump.

Мои session_save_path и var_dump показывают это:

/home/[myname]/sessions/

array(0) { }

и файл, созданный в моей папке сессий, выглядит следующим образом:

username | s: 7: "testerz"; роль | i: 1; электронная почта | s: 19:"email@email.com"; fname | s: 4: "First"; lname | s: 6: "Name";

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Ух, это была самая случайная причина ...

Оказывается, проблема была в моем файле php.ini, но не по той причине, о которой я думал.Я установил значение session.cookie_domain в "collinmath.com", но мне нужно было добавить точку в начало collinmath.Я изменил значение session.cookie_domain на «.collinmath.com», и это устранило проблему.Я понятия не имею, почему это сработало, но это сработало.

0 голосов
/ 02 июня 2018

Устранение проблемы:

Это работа в процессе обсуждения длинного комментария, которая будет обновляться по мере продвижения

Исходя из того, что вы мне сказали, логикаПроцесс вашей ситуации невозможен.

RE: Ваше обновление: Тогда, если сессия определенно пишется, есть три возможных варианта:

1) существует ini_set() или каталог-локальный .ini файл, который меняет имя сеанса, поэтому данные из одного каталога не распознаются в другом, так как они выглядят в разных сеансах.

2) У вас проблема с правописанием или регистром ваших клавиш $_SESSION.

3) session_start() не была инициирована.

Дальнейшая отладка и решение:
Всякий раз, когда вы var_dump данные сеанса, и он становится пустым;Добавьте эти строки:

 error_log(print_r(session_status()."<BR>",true)); 
 error_log(print_r(session_name()."<BR>",true));
 error_log(print_r($_SESSION,true)); //your original  output.

Добавьте этот блок кода как на страницу ввода данных (create.php), так и на страницу назначения, на которой не отображаются определенные сеансы.

Если приведенное выше всегда одно и то же (и они могут быть такими, если, как вы говорите, некоторые данные «работают».

Тогда ответ таков: у вас определенно есть несколько строк вваш код, который изменяет значения сеанса. Симптомы выглядят так, как будто вы где-то испортили функцию REGEX preg_. Опять же, используйте PHP Error Log, чтобы проверить эти вещи.

Общие исправления:

  • Цитировать ключи массива; $row[Login] должно быть `$ row ['Login']
  • Использовать одно соединение MySQLi одного типа
  • Этот тип долженбыть объектно-ориентированным подходом (->)
  • Не использовать real_escape_string для объектно-ориентированных соединений MySQL.
  • Использовать Многобайтовые функции PHP String
  • Используйте UTF8mb4 Наборы символов подключения MySQLi, и то же самое в ваших таблицах и столбцах.
  • Приведите в порядок ваш код и ваш логический процесс, вы сделали функцию, но функция всегда запускается, поэтому она не приносит никакой пользыбудучи функцией - это может простобудь прямым кодом.
  • Не используйте globals
  • MySQL не заботится о новых строках, поэтому вам не нужно объединять строки SQL.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...