PHP - сеанс не работает на мобильных устройствах

Для входа в систему 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 } ?>

Ответ 1

Моя проблема была на стороне сервера. session.save_path не определен для моего сервера. Большое спасибо всем, кто мне помог :)

Ответ 2

Не совсем уверен, что делает ваш код, потому что я ничего не вижу в настройке имени пользователя или чего-то подобного. Что делает ваш код, он запускает сеанс и проверяет, установлена ли переменная имени пользователя в сеансе, и если ДА, она вызывает session_id.

Можете ли вы использовать это, чтобы проверить, правильно ли создан сеанс?

session_start();
if (session_status() !== PHP_SESSION_NONE)
{
echo session_id();
}

Запускает сеанс и показывает идентификатор сеанса, если session_status не является PHP_SESSION_NONE

Ответ 3

Вам не нужно делать 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";
  1. Очистите данные/файлы cookie в своем мобильном браузере (или просто перейдите в режим инкогнито). Это позволит вам "начать с нуля".

  2. Откройте testa.php в своем мобильном браузере. Обратите внимание на показанный идентификатор сеанса. Введите данные для входа и нажмите "Отправить". На следующей странице может быть пусто.

  3. Откройте testb.php. Опять же, обратите внимание на показанный идентификатор сеанса. Он должен быть равен идентификатору сеанса, показанному в файле test1.php. Если они отличаются друг от друга, возможно, ваш мобильный браузер настроен не принимать файлы cookie.

Я лично проверил это на Safari на iPhone 6, и мне удалось получить данные имени пользователя из сеанса.

PS. Дружелюбное напоминание: не забудьте избежать данных, которые вы используете в запросах (например, $ username и $ password). Используйте mysqli_real_escape_string или используйте подготовленные инструкции. Для обеспечения безопасности.

Ответ 4

Cookies определенно работают на мобильных браузерах.

Ответ 5

Возможно, у вас возникают некоторые проблемы с конфликтом:

Мой код 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.

Ответ 6

Вероятно, ваша сессия не установлена. В зависимости от используемой версии PHP проверьте свою сессию.

Для версий PHP > = 5.4.0

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

Для версий PHP <5.4.0

if(session_id() == '') {
    session_start();
}

Ответ 7

Я упростил код, и сеанс запускается, когда все проверки пройдены.

<?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>

Ответ 8

Упрощен код, чтобы упростить его понимание. Игнорирование проверок для имени пользователя и пароля и т.д. В основном вы пытаетесь установить переменную сеанса. Это происходит в 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) был одинаковым в обоих случаях.

Ответ 9

Следуя вашему последнему комментарию, я предполагаю, что это связано с используемой строкой запроса. В основном использование 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 для входа в систему выполнен правильно. С уважением

Ответ 10

Почему вы используете session_id(). session Я всегда использую эту систему входа. У меня нет проблем с настольным или мобильным сеансом.

PHP-код

 
 &lt;?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'); } }?> ;? &lt;?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'); } }?> &lt;?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>

Ответ 11

Удалить session_start(); в index.php и добавьте это в свой config.php

if (session_status() == PHP_SESSION_NONE) 
{
    session_start();
}

Ответ 12

Убедитесь, что session_start() помещается перед выходом любого браузера. Я обнаружил, что Chrome на рабочем столе может быть намного более прощающим, чем другие браузеры, а также Mobile Chrome

Ответ 13

Эта проблема возникает в Chrome "Lite Mode", чтобы уменьшить нагрузку на данные телефона. Если вы используете секретную навигацию, то облегченный режим автоматически отключает работу страницы корректно. Вы должны отключить "облегченный режим" в Chrome. Это окончательное решение.