Я знаю, что эта проблема очень распространена, и обычный ответ - разместить session_start;
в начале каждой страницы и скрипта. Я сделал это и до сих пор не победил. Я потратил буквально целых 6 часов, пытаясь найти ошибку, но безрезультатно, любые указатели были бы оценены.Сессия PHP не переносится после заголовка даже с session_start(); на каждой странице
Соответствующие коды приведены ниже, но просто для их разрушения. Существует init.php файл, который содержит все функции, соединения и session_start();
и это include
d в верхней части каждый страницы, перед тем любой другой код.
init.php (include
д в header.php, , прежде чем любой HTML) [EDITED включить отчеты об ошибках]
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);
require 'database/connect.php'; //code for connecting to database
require 'functions/general.php'; //contains one sanitize function
require 'functions/users.php'; //user-specific functions (see below)
$errors = array();
?>
//rest of the head and opening body tag
index.php (session_start();
находится в начале кода от init.php)
<?php include 'includes/overall/header.php'; ?>
<?php include 'assets/nivo/nivo.php'; ?>
<p>plain text
</p>
<?php
echo ($_SESSION['user_id']);
?>
<?php include 'includes/overall/footer.php'; ?>
<?php include 'includes/overall/scripts.php'; ?>
</body>
</html>
ядро / функции/users.php (в пределах init.php, который содержит session_start();
)
<?php
function logged_in() {
return (isset($_SESSION['user_id'])) ? true : false;
}
function user_exist($username) {
$username = sanitize($username);
return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `user` WHERE `username` = '$username'"), 0) == 1) ? true : false;
};
function user_active($username) {
$username = sanitize($username);
return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `user` WHERE `username` = '$username' AND `active` = 1"), 0) == 1) ? true : false;
};
function user_id_from_username($username) {
$username = sanitize($username);
return mysql_result(mysql_query("SELECT `user_id` FROM `user` WHERE `username` = '$username'"), 0, 'user_id');
};
function login($username, $password) {
$user_id = user_id_from_username($username);
$username = sanitize($username);
$password = md5($password);
return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `user` WHERE `username` = '$username' AND `password` = '$password'"), 0) == 1) ? $user_id : false;
};
?>
Форма Войти является included
в index.php и отправляет данные в login_pro.php
lo gin_pro.php
<?php
include 'core/init.php';
if (empty($_POST) === false) {
$username = $_POST['username'];
$password = $_POST['password'];
if (empty($username) === true || empty($password) === true) {
$errors[] = 'Please enter a username and password';
} else if (user_exist($username) === false) {
$errors[] = 'User does not exist';
} else if (user_active($username) === false) {
$errors[] = 'Please activate your account';
} else {
$login = login($username, $password);
if ($login === false) {
$errors[] = 'This username/password combination is incorrect';
} else {
$_SESSION['user_id'] = $login;
header("Location: index.php");
exit();
};
};
print_r($errors);
}
?>
Если я устанавливаю функцию матрицы для вывода SESSION['user_id'];
в login_pro.php, например, так:
} else {
$_SESSION['user_id'] = $login;
die($_SESSION['user_id']);
header("Location: index.php");
exit();
};
Я сделать получить желаемый user_id , Но это не переносится после того, как заголовок перенаправил меня обратно на index.php - как указано отсутствием выхода в функции эха при index.php
Как исправить это?
Я настоящий новичок (учись у phpcademy), поэтому, пожалуйста, не высмеивайте меня, если это что-то действительно глупое, я обещаю, что пробовал и не могу найти ответ. – dayuloli
Ваш дополнительный 'session_start()' для безопасной меры не может работать, потому что он возникает _after_ output был отправлен в выходной буфер. Заголовки (которые отправляет session_start()) _must_ происходят до любого вывода, включая пробелы перед тегом открытия <
У вас есть сообщение об ошибке _disabled_. Включите его, и вы можете получить ценное представление о том, что здесь происходит не так. 'Error_reporting (E_ALL); ini_set ('display_errors', 1); '_allways_ в разработке. –