2013-06-09 1 views
1

Я знаю, что эта проблема очень распространена, и обычный ответ - разместить 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

Как исправить это?

+0

Я настоящий новичок (учись у phpcademy), поэтому, пожалуйста, не высмеивайте меня, если это что-то действительно глупое, я обещаю, что пробовал и не могу найти ответ. – dayuloli

+0

Ваш дополнительный 'session_start()' для безопасной меры не может работать, потому что он возникает _after_ output был отправлен в выходной буфер. Заголовки (которые отправляет session_start()) _must_ происходят до любого вывода, включая пробелы перед тегом открытия <

+2

У вас есть сообщение об ошибке _disabled_. Включите его, и вы можете получить ценное представление о том, что здесь происходит не так. 'Error_reporting (E_ALL); ini_set ('display_errors', 1); '_allways_ в разработке. –

ответ

0

Я разрешил эту проблему. Это связано с моим хостинг-провайдером. Я опубликовал полное объяснение, чтобы помочь другим here. Если кто-то посчитает, что этот вопрос нужно удалить, пожалуйста, не стесняйтесь, я не очень хорошо знаком с традициями Stackoverflow.

+0

Пожалуйста, ответьте на свой вопрос здесь, чтобы его можно было увидеть рядом с вопросом, а затем удалить дублирующий вопрос. – Danack

+0

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

Смежные вопросы