我搜索了这个问题,却找不到它。
我创建了一个创建用户页面,允许用户使用用户名在我的页面上创建一个帐户。用户名可以是字母和数字的任意组合。当他们创建用户时,它应该调用同一页面,然后当用户看到会话变量现在已设置时,将用户重定向到主页面。
当我创建一个只有用户名中的字母的用户时,它可以正常工作并将它们重定向到索引页面。但是,当我创建一个用户,例如“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:”名称“;
答案 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;] ->
)real_escape_string
用于面向对象的MySQL连接。UTF8mb4
MySQLi连接字符集,并在表和列中使用相同的字符集。 答案 1 :(得分:0)
事实证明问题是我的php.ini文件,但不是我想的原因。我已将session.cookie_domain值设置为&#34; collinmath.com&#34;但需要在collinmath的开头添加一段时间。我将session.cookie_domain值更改为&#34; .collinmath.com&#34;它解决了这个问题。我不知道为什么会这样,但确实如此。