如果用户名包含数字,则不保存PHP用户名会话变量

时间:2018-06-02 14:48:39

标签: php session mysqli

我搜索了这个问题,却找不到它。

我创建了一个创建用户页面,允许用户使用用户名在我的页面上创建一个帐户。用户名可以是字母和数字的任意组合。当他们创建用户时,它应该调用同一页面,然后当用户看到会话变量现在已设置时,将用户重定向到主页面。

当我创建一个只有用户名中的字母的用户时,它可以正常工作并将它们重定向到索引页面。但是,当我创建一个用户,例如“student1”时,它不会设置会话变量,因此不会重定向它们。

您可以在http://collinmath.com/accounts/create.php亲自试一试,看看我的意思。 (只是不要使用真实的信息,因为我还没有设置SSL)

<uses-permission android:name="android.permission.CAMERA" />
 <uses-feature android:name="android.hardware.camera" />
 <uses-feature android:name="android.hardware.camera.autofocus" />

更新:

所以,我更改了一堆代码并修改了php.ini文件,但我仍然遇到问题。当我看到我的饼干时,我发现饼干就在那里。我看到文件是在sessions文件夹中创建的,并且变量是在该文件中设置的,但是当我执行var_dump时仍然没有会话信息。

我的session_save_path和var_dump显示了这个:

<?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();
}

?>

并且在我的sessions文件夹中创建的文件如下所示:

  

用户名| S:7: “testerz”;角色| I:1;电子邮件| S:19: “email@email.com”; FNAME | S:4: “第一”; L-NAME | S:6:”名称“;

2 个答案:

答案 0 :(得分:1)

问题修复:

这是长期评论讨论中正在进行的工作,将在我们发布时进行更新

从你告诉我的情况来看,你的情况的逻辑过程是不可能的。

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)和无法显示某些会话的目标页面。

如果以上内容总是完全相同(如果你说的话,可能会有一些数据&#34;工作&#34;。

然后答案是你的代码中肯定有一些行改变了会话值。这些症状看起来像是在某个地方搞了一个REGEX preg_功能。再次;使用您的PHP错误日志来检查这些事情。

常规修复:

  • 引用您的数组键; $row[Login]应该是`$ row [&#39;登录&#39;]
  • 使用单一类型的MySQLi连接
  • 该类型应该是面向对象的方法(->
  • 不要将real_escape_string用于面向对象的MySQL连接。
  • 使用Multibyte PHP String functions
  • 使用UTF8mb4 MySQLi连接字符集,并在表和列中使用相同的字符集。
  • 整理你的代码和你的逻辑过程,你已经完成了一个功能,但是这个功能总是在运行,所以它没有任何好处 - 它可能只是直接的代码。
  • 不要使用全局
  • MySQL不关心新行,因此您不需要连接SQL字符串。

答案 1 :(得分:0)

哇,这是最随机的原因......

事实证明问题是我的php.ini文件,但不是我想的原因。我已将session.cookie_domain值设置为&#34; collinmath.com&#34;但需要在collinmath的开头添加一段时间。我将session.cookie_domain值更改为&#34; .collinmath.com&#34;它解决了这个问题。我不知道为什么会这样,但确实如此。