Ответ 1
Моя проблема была на стороне сервера. session.save_path
не определен для моего сервера. Большое спасибо всем, кто мне помог :)
Для входа в систему im с помощью session_start()
для рабочего стола его работа прекрасна, но на мобильном устройстве он не работает. Когда я делаю session_id()
с переменной, например session_id('login')
он работает на мобильных устройствах, но прерывает другие сеансы на других компьютерах. Но когда session_id()
генерируется автоматически, он не работает на мобильных устройствах. Что я должен делать?
Мой код session_start на index.php
session_start();
if (isset($_SESSION['username'])){
session_id();
}
Весь код для файла login.php
<?php
require('config.php');
$usernameOK = false; $passwordOK = false;
if (isset($_POST['username']) and isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
$UserQuery = "SELECT username FROM 'members' WHERE username='$username'";
$userTestResult = mysqli_query($connection, $UserQuery);
$usernameTEST = mysqli_num_rows($userTestResult);
if($usernameTEST == 1){$usernameOK = true;}
$PasswordQuery = "SELECT password FROM 'members' WHERE username='$username'";
$result = mysqli_query($connection,$PasswordQuery);
$row = mysqli_fetch_row($result);
if (password_verify($password, $row[0])){$passwordOK = true;}
if($usernameOK == true && $passwordOK == true){
$_SESSION['username'] = $username;
}else{
$error_message = "Incorrect login data";
}
}
if (isset($_SESSION['username'])){
header("Location: ../");
exit;
}else{?>
<form class="login-form" method="POST">
<?php if(isset($error_message)){ ?><div class="mini-mes error"> <?php echo $error_message; ?> </div><?php } ?>
<span class="placeholder">username</span>
<input type="text" name="username" placeholder="username" required>
<span class="placeholder">password</span>
<input type="password" name="password" id="inputPassword" placeholder="password" required>
<button type="submit">Login</button>
<a class="form-link" href="register.php">Register</a>
</form>
<?php } ?>
Моя проблема была на стороне сервера. session.save_path
не определен для моего сервера. Большое спасибо всем, кто мне помог :)
Не совсем уверен, что делает ваш код, потому что я ничего не вижу в настройке имени пользователя или чего-то подобного. Что делает ваш код, он запускает сеанс и проверяет, установлена ли переменная имени пользователя в сеансе, и если ДА, она вызывает session_id
.
Можете ли вы использовать это, чтобы проверить, правильно ли создан сеанс?
session_start();
if (session_status() !== PHP_SESSION_NONE)
{
echo session_id();
}
Запускает сеанс и показывает идентификатор сеанса, если session_status не является PHP_SESSION_NONE
Вам не нужно делать session_id(), чтобы начать сеанс, session_start() достаточно.
Я тестировал следующее в Safari на iPhone 6 (просто добавьте обратно часть запроса db, если хотите):
testa.php
<?php
//require('config.php');
session_start();
echo "Session ID: ".session_id()." <br>\n";
$usernameOK = false;
$passwordOK = false;
if (isset($_POST['username']) and isset($_POST['password'])) {
$username = $_POST['username'];
$password = $_POST['password'];
$usernameOK = true;
$passwordOK = true;
if ($usernameOK == true && $passwordOK == true) {
$_SESSION['username'] = $username;
} else {
$error_message = "Incorrect login data";
}
}
if (isset($_SESSION['username'])) {
header("Location: ../");
exit;
} else {
?>
<form class="login-form" method="POST">
<?php if (isset($error_message)) { ?>
<div class="mini-mes error"> <?php echo $error_message; ?> </div><?php } ?>
<span class="placeholder">username</span>
<input type="text" name="username" placeholder="username" required>
<span class="placeholder">password</span>
<input type="password" name="password" id="inputPassword" placeholder="password" required>
<button type="submit">Login</button>
<a class="form-link" href="register.php">Register</a>
</form>
<?php } ?>
testb.php
<?php
session_start();
echo "Session ID: ".session_id()." <br>\n";
echo "Data stored in session: {$_SESSION['username']}<br>\n";
Очистите данные/файлы cookie в своем мобильном браузере (или просто перейдите в режим инкогнито). Это позволит вам "начать с нуля".
Откройте testa.php в своем мобильном браузере. Обратите внимание на показанный идентификатор сеанса. Введите данные для входа и нажмите "Отправить". На следующей странице может быть пусто.
Откройте testb.php. Опять же, обратите внимание на показанный идентификатор сеанса. Он должен быть равен идентификатору сеанса, показанному в файле test1.php. Если они отличаются друг от друга, возможно, ваш мобильный браузер настроен не принимать файлы cookie.
Я лично проверил это на Safari на iPhone 6, и мне удалось получить данные имени пользователя из сеанса.
PS. Дружелюбное напоминание: не забудьте избежать данных, которые вы используете в запросах (например, $ username и $ password). Используйте mysqli_real_escape_string или используйте подготовленные инструкции. Для обеспечения безопасности.
Cookies определенно работают на мобильных браузерах.
Возможно, у вас возникают некоторые проблемы с конфликтом:
Мой код session_start
if (isset($_SESSION['username'])){
session_id();
} else if (!isset($_SESSION)){
session_start();
}
Весь код для файла login.php
<?php
require('config.php');
$usernameOK = false; $passwordOK = false;
if (isset($_POST['username']) and isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
$UserQuery = "SELECT username FROM 'members' WHERE username='$username'";
$userTestResult = mysqli_query($connection, $UserQuery);
$usernameTEST = mysqli_num_rows($userTestResult);
if($usernameTEST == 1){$usernameOK = true;}
$PasswordQuery = "SELECT password FROM 'members' WHERE username='$username'";
$result = mysqli_query($connection,$PasswordQuery);
$row = mysqli_fetch_row($result);
if($usernameOK == true && password_verify($password, $row[0])){
if (isset($_SESSION)){
$_SESSION['username'] = $username;
} else{
session_start();
$_SESSION['username'] = $username;
}
}else{
$error_message = "Incorrect login data";
}
}
if (isset($_SESSION['username'])){
header("Location: ../");
exit;
}else{?>
<form class="login-form" method="POST">
<?php if(isset($error_message)){ ?><div class="mini-mes error"> <?php echo $error_message; ?> </div><?php } ?>
<span class="placeholder">username</span>
<input type="text" name="username" placeholder="username" required>
<span class="placeholder">password</span>
<input type="password" name="password" id="inputPassword" placeholder="password" required>
<button type="submit">Login</button>
<a class="form-link" href="register.php">Register</a>
</form>
<?php } ?>
В index.php на первой строке у меня есть → УДАЛЯЙТЕ ЭТО, ПРОВЕРЬТЕ ПЕРВУЮ ПРОВЕРКУ ПРОВЕРКИ СЕССИИ
if (!isset($_SESSION)){
session_start();
}
EDIT: Я заметил, что вы используете функцию заголовка для перенаправления на страницу индекса. Важно избегать таких переадресаций, если вы не отправляете пользователя из своей системы, потому что некоторые среды не работают с ними. Я предлагаю вместо этого изменить вашу подпрограмму для пользовательских подпрограмм POST/GET http:
Внутри validateSession.php
вне validateSession, НИЧЕГО о правилах сеансов, сосредоточьте все
index.php/head.php/некоторый код, который всегда начинается с каждой страницы, запускается только так:
<?php
include_once('validateSessions.php');
?>
Ваша форма:
<form class="login-form" action="index.php" method="POST">
<?php if(isset($error_message)){ ?><div class="mini-mes error"> <?php echo $error_message; ?> </div><?php } ?>
<span class="placeholder">username</span>
<input type="text" name="username" placeholder="username" required>
<span class="placeholder">password</span>
<input type="password" name="password" id="inputPassword" placeholder="password" required>
<button type="submit">Login</button>
<a class="form-link" href="register.php">Register</a>
</form>
EDIT: Я рассмотрел вашу рутину, обратите внимание на validateSessions.php, я забыл загрузить session_start() в каждую процедуру, называемую файлом. Поместите validateSessions внутри вашего каталога include.
ОБНОВЛЕНИЕ: Даже мой код, помогающий OP, основной проблемой была конфигурация SESSION в файле php.ini с session.save_path, что вызывало проблемы с сессионными процедурами. Исправление php.ini решило проблему, код, который я ожидаю, помог OP подумать о некоторых подпрограммах в отношении материала Session.
Вероятно, ваша сессия не установлена. В зависимости от используемой версии PHP проверьте свою сессию.
Для версий PHP > = 5.4.0
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
Для версий PHP <5.4.0
if(session_id() == '') {
session_start();
}
Я упростил код, и сеанс запускается, когда все проверки пройдены.
<?php
require('config.php');
if (isset($_POST['username']) and isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
$UserQuery = "SELECT password FROM 'members' WHERE username='$username'";
$result = mysqli_query($connection, $UserQuery);
$usernameTEST = mysqli_num_rows($result);
if($usernameTEST == 1){
$row = mysqli_fetch_row($result);
if(password_verify($password, $row[0])) {
session_start();
$_SESSION['username'] = $username;
header("Location: ../");
exit();
}
}
$error_message = "Incorrect login data";
}
<form class="login-form" method="POST">
<?php if(isset($error_message)){ ?><div class="mini-mes error"> <?php echo $error_message; ?> </div><?php } ?>
<span class="placeholder">username</span>
<input type="text" name="username" placeholder="username" required>
<span class="placeholder">password</span>
<input type="password" name="password" id="inputPassword" placeholder="password" required>
<button type="submit">Login</button>
<a class="form-link" href="register.php">Register</a>
</form>
Упрощен код, чтобы упростить его понимание. Игнорирование проверок для имени пользователя и пароля и т.д. В основном вы пытаетесь установить переменную сеанса. Это происходит в login.php. Код для этого.
<?php
$username = "Umesh";
if (isset($_SESSION))
{
$_SESSION['username'] = $username;
}
else
{
session_start();
$_SESSION['username'] = $username;
}
print_r($_SESSION);
?>
В index.php вы пытаетесь проверить состояние сеанса. Код ниже.
if (isset($_SESSION['username'])){
session_id();
} else if (!isset($_SESSION)){
session_start();
}
print_r($_SESSION);
Вышеупомянутое работает для меня в каждом браузере и устройстве. Я даже тестировал хром на iphone. Кажется, он работает нормально. Пожалуйста, проверьте это и посмотрите, работает ли он. Если нет, нам нужно будет проверить ваш веб-сервер, чтобы узнать, в чем проблема, с объектами сеанса в этой системе.
Я подтвердил, что print_r ($ _SESSION) был одинаковым в обоих случаях.
Следуя вашему последнему комментарию, я предполагаю, что это связано с используемой строкой запроса. В основном использование password
в качестве имени столбца иногда прерывает запрос, поскольку password
также является ключевым словом mysql. Кроме того, в отношении вашей сессии вы можете обратиться к session_id() vs session_regenerate_id() для получения дополнительной информации о функциях. Session_id('login')
основном устанавливает идентификатор сеанса для входа в систему, который работает на вашем мобильном устройстве, поскольку это создает сеанс с определенным статическим идентификатором. Однако вы можете попробовать использовать session_regenerate_id(true)
чтобы узнать, помогает ли это.
Также я попытался выполнить код, поставив статическое значение в качестве имени пользователя следующим образом
login.php
<?php
$username = "deadlock";
if (isset($_SESSION))
{
$_SESSION['username'] = $username;
}
else
{
session_start();
$_SESSION['username'] = $username;
}
print_r($_SESSION);
index.php
<?php
if (isset($_SESSION['username'])){
session_regenerate_id(true);
} else if (!isset($_SESSION)){
session_start();
}
print_r(session_id());
Я начал использовать index.php напрямую, используя телефон, который печатал вывод в виде array()
без каких-либо значений.Текущий, что файл Login.php не выполняется. После явного выполнения Login.php index.php напечатал массив сеансов. Можете ли вы убедиться, что файл php для входа в систему выполнен правильно. С уважением
Почему вы используете session_id(). session Я всегда использую эту систему входа. У меня нет проблем с настольным или мобильным сеансом.
PHP-код
<?php session_start(); include 'connect.php'; if(isset($_POST['submit'])) { $username = htmlspecialchars($_POST["uname"], ENT_QUOTES, "ISO-8859-1"); $username = stripslashes($username); $password = htmlspecialchars($_POST["pass"], ENT_QUOTES, "ISO-8859-1"); $password = stripslashes($password); $sql="SELECT * FROM member WHERE username= '$username' AND password='$password' AND status='1' "; $result=mysql_db_query($dbname,$sql); $row=mysql_fetch_row($result); $num=mysql_num_rows($result); $msg= "<h3 style='padding:0px;margin:0px;font-size:16px;background:#fff;padding:8px;'><font color='red'><center>Incorrect login data</center></font></h3>"; if($num>0) { $_SESSION['id'] =$row[0]; $_SESSION['fullName'] =$row[1]; $_SESSION['username'] =$row[2]; $_SESSION['password'] =$row[3]; $_SESSION['email'] =$row[4]; $_SESSION['userType'] =$row[5]; $_SESSION['status'] =$row[6]; header('location:index.php'); } }?>
;?<?php session_start(); include 'connect.php'; if(isset($_POST['submit'])) { $username = htmlspecialchars($_POST["uname"], ENT_QUOTES, "ISO-8859-1"); $username = stripslashes($username); $password = htmlspecialchars($_POST["pass"], ENT_QUOTES, "ISO-8859-1"); $password = stripslashes($password); $sql="SELECT * FROM member WHERE username= '$username' AND password='$password' AND status='1' "; $result=mysql_db_query($dbname,$sql); $row=mysql_fetch_row($result); $num=mysql_num_rows($result); $msg= "<h3 style='padding:0px;margin:0px;font-size:16px;background:#fff;padding:8px;'><font color='red'><center>Incorrect login data</center></font></h3>"; if($num>0) { $_SESSION['id'] =$row[0]; $_SESSION['fullName'] =$row[1]; $_SESSION['username'] =$row[2]; $_SESSION['password'] =$row[3]; $_SESSION['email'] =$row[4]; $_SESSION['userType'] =$row[5]; $_SESSION['status'] =$row[6]; header('location:index.php'); } }?>
<?php session_start(); include 'connect.php'; if(isset($_POST['submit'])) { $username = htmlspecialchars($_POST["uname"], ENT_QUOTES, "ISO-8859-1"); $username = stripslashes($username); $password = htmlspecialchars($_POST["pass"], ENT_QUOTES, "ISO-8859-1"); $password = stripslashes($password); $sql="SELECT * FROM member WHERE username= '$username' AND password='$password' AND status='1' "; $result=mysql_db_query($dbname,$sql); $row=mysql_fetch_row($result); $num=mysql_num_rows($result); $msg= "<h3 style='padding:0px;margin:0px;font-size:16px;background:#fff;padding:8px;'><font color='red'><center>Incorrect login data</center></font></h3>"; if($num>0) { $_SESSION['id'] =$row[0]; $_SESSION['fullName'] =$row[1]; $_SESSION['username'] =$row[2]; $_SESSION['password'] =$row[3]; $_SESSION['email'] =$row[4]; $_SESSION['userType'] =$row[5]; $_SESSION['status'] =$row[6]; header('location:index.php'); } }?>
Моя форма HTML
<form method = "post"> <p> <? Php if (isset ($ _ POST ['submit'])) {echo $ msg; }?> </p> <div> <input type="text" name="uname" class="form-control" placeholder="Username..." required=""/> </div> <div> <input type="password" name="pass" class="form-control" placeholder="Password..." required=""/> <p align="right">Forgot it?</a></p> </div> <div> <button class="btn btn-success submit" type="submit" name="submit"> Login <i class="fa fa-sign-in"></i></button> </div> </form> }?> </p> <div> <input type = "text" name = "uname" class= "form-control" placeholder = "Username..." required = ""/> </div> <div> <input type = "password" name = "pass" class= "form-control" placeholder = "Password..." required = ""/> <p align = "right"> Забыл? </a> </p> </div> <div> <button class= "btn btn-success submit" type = "submit" name = "submit"> Вход <i class= "fa fa-sign-in"> </i> </button> </div> </form>
Удалить session_start(); в index.php и добавьте это в свой config.php
if (session_status() == PHP_SESSION_NONE)
{
session_start();
}
Убедитесь, что session_start() помещается перед выходом любого браузера. Я обнаружил, что Chrome на рабочем столе может быть намного более прощающим, чем другие браузеры, а также Mobile Chrome
Эта проблема возникает в Chrome "Lite Mode", чтобы уменьшить нагрузку на данные телефона. Если вы используете секретную навигацию, то облегченный режим автоматически отключает работу страницы корректно. Вы должны отключить "облегченный режим" в Chrome. Это окончательное решение.