Я прихожу к вам абсолютно расстроенным. Я провел дни, просматривая мой код и все вопросы StackOverflow, которые искали следующую проблему:
Функция моего проекта - войти в систему, используя три страницы. Первая страница 1.php
имеет поля ввода, которые необходимо заполнить:
<?php
session_start();
session_destroy();
require_once "init.php";
require "header.php";
?>
<form method="POST" action="2.php" enctype="multipart/form-data">
<table>
<tr><td>Username</td></tr>
<tr><td><input type="text" id="user" name="user" value=""/></td></tr>
<tr><td>Password</td></tr>
<tr><td><input type="password" id="pass" name="pass" value=""/></td></tr>
<tr><td><input type="submit" value="Get in"/></td></tr>
</table>
</form>
Вторая страница 2.php
обрабатывает информацию, проверяет правильность имени пользователя и пароля и инициализирует $_SESSION['user']
;
<?php
session_start();
session_save_path('/server/path/system/sphp');
//had to change dir due to server restrictions
$username= $_POST['user'];
$user= "cpe12";
$userpass= $_POST['pass'];
$pass= "p2010";
if($username==$user&&$userpass==$pass){
$_SESSION['user']= $username;
echo "<head><meta http-equiv='refresh' content='2; url=3.php'>Loging </head>";
echo $_SESSION['user'];
exit();
}
elseif ($username!=$user||$userpass!=$pass){
session_destroy();
echo "<head><meta http-equiv='refresh' content='2; url=1.php'>Wrong log in</head>";
exit();
}
?>
И я 3.php
содержимое третьей страницы 3.php
используя функцию isset
.
<?php
session_start();
session_save_path('/server/path/system/sphp');
//I know I could use an include_once instead of these two lines, right?
error_reporting(E_ALL);
ini_set('display_errors', 1);
if (isset($_SESSION['user'])){
$title= "Copies";
require "header.php";
require "content.php";
}
else{
session_destroy();
echo "<head><meta http-equiv='refresh' content='4; url=index.php'>Blocked content.</head>";
die();
}
?>
Всякий раз, когда я пытаюсь войти в систему, он проверяет ok в 2.php
но когда он добирается до 3.php
он не может войти в систему. На всех страницах есть session_start и session.save_path, написанные как первые две строки без пробелов. Я изменил папку по умолчанию /tmp
для session.save_path
на server/path
потому что /tmp
не имел разрешений на запись.
Я мог бы получить некоторую информацию из 2.php
и обнаружил, что $_SESSION['user']
выходит из нее ОК, но 3.php
никогда не читает ее. Дело в том, что у меня есть еще 6 страниц для доступа к этому сеансу, поэтому мне нужно глобальное решение.
О, и это запутывает: я также создал файл для проверки информации о сеансе (только для информации) с именем check.php
со следующим кодом:
<?php
session_start();
session_save_path('/server/path/system/sphp');
echo session_save_path().'<br/>';
echo $_SESSION['user'].'<br/>';
echo session_name();
if (!is_writable(session_save_path())) {
echo 'Session path "'.session_save_path().'" is not writable for PHP!';
}
?>
Теперь, если я сначала очистку истории и данных браузера, а затем введите www.myweb.com/check.php
в URL-адрес, я вижу отсутствующую информацию, так как $_SESSION['user']
и т.д. Еще не созданы. Если впоследствии я попытаюсь войти в систему, удивительно начнет подписываться как шарм, несмотря ни на что. Сначала я должен получить доступ к check.php
в своем браузере, чтобы иметь возможность войти в систему. Но если я снова check.php
историю браузера и данные, он не позволит мне войти в систему больше.
error_reporting в состояниях 3.php: Notice: Undefined index: user in "/server/path/system/3.php in line 34
Может это что-то о моем сервере? Что-то о save_handlers
? Это мой первый вход в систему, и я прошел через ад. Я думаю, это будет долгий путь. У меня больше нет вариантов или знаний. Ты моя последняя мера.
Спасибо, парни!
Это никогда не случалось в моей жизни раньше. Я скопировал код из 2.php и вставил его в другой файл, который называется try.php (тот же самый код). Я перенаправил 1.php, чтобы проверить try.php, а затем перенаправить на 3.php. Это сработало. Теперь я не понимаю, что может быть исправлено, копируя один и тот же код в другой файл (я буквально проверял строку за строкой), поэтому я очень смущен. Но хорошо, теперь работает как шарм.
session_save_path() необходимо вызвать до session_start().
См. Http://php.net/manual/en/function.session-save-path.php
Так
session_save_path('/server/path/system/sphp');
session_start();