Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

mysql with php - session_start - в чем ошибка?

itm Знаток (414), закрыт 5 лет назад
Создаю скрипт авторизации, подключение и поиск по БД выполнил, теперь нужно начать сессию и вывести логин пользователя. Выдаёт ошибку:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ...in ...on line 30

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started
at ...in ...on line 30
Код:
<?php
$login = $_POST['login'];
$password = $_POST['pass'];
if($login == "") {
echo('Ошибка: поле login не заполнено.');
}
if($password == "") {
echo('Ошибка: поле password не заполнено.');
}
else {
$db = mysqli_connect('host', 'user', 'pass', 'database_name');
$result = mysqli_query($db, "SELECT * FROM users WHERE u_login = \"".$login."\" AND u_password = \"".$password."\"");
if($result == false) {

die("Облом");
}
else {
session_start();
echo('Успех!');
echo($_SESSION['login']);
}
}
?>
Лучший ответ
Андрей Панарин Искусственный Интеллект (224537) 5 лет назад
headers already sent (output started)

Этим всё сказано.

При отправке ответа браузеру PHP сначала отправляет заголовки (headers) — именованные информационные поля с какими-то значениями (среди которых, видимо, есть информация о сессии).

После заголовков отправляется основной контент — HTML-разметка страницы.

Если мы уже начали отправлять основной контент (при помощи echo, например), то заголовок отправить уже не сможем. Поэтому и сессию начать не получится, если уже что-то вывели.

В твоем случае может быть так, что, например, логин не ввели.
Сработало echo('Ошибка: поле login не заполнено.');
Вывелся контент.
А дальше ты проверяешь пароль (он есть), подключаешься к базе и начинаешь сессию.
Опачки! А заголовки уже поздно писать.

Как вариант, в исключительных случаях ты можешь использовать die вместо echo, чтобы страница валилась после вывода и до подключения к базе дело не доходило. Или можешь связать взаимоисключающие варианты при помощи else if.
itmЗнаток (414) 5 лет назад
Попытался убрать проверку на пустоту логина или пароля, теперь код такой:
$login = $_POST['login'];
$password = $_POST['pass'];
$db = mysqli_connect(host', 'users', 'pass', 'db_name');
$result = mysqli_query($db, "SELECT * FROM users WHERE u_login = \"".$login."\" AND u_password = \"".$password."\"");
if($result == false) {
die("Облом");
}
else {
session_start();
echo('Успех!');
echo($_SESSION['login']);
}
itm Знаток (414) Выводит такое: Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ...in ...on line 22 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at ...) in ...on line 22
itmЗнаток (414) 5 лет назад
UPD: Получилось, спустя пару недель практики. Разобрался что надо начинать сессию в начале кода. Спасибо!
Остальные ответы
Похожие вопросы