web-dev-qa-db-fra.com

PHP - La session ne fonctionne pas sur mobile

Pour vous connecter en utilisant un session_start(), pour le bureau cela fonctionne très bien, mais sur mobile, cela ne fonctionne pas. Lorsque je crée un session_id() avec une variable, par exemple, session_id('login'), il fonctionne sur mobile, mais interrompt d'autres sessions sur d'autres ordinateurs. Mais lorsque session_id() est généré automatiquement, cela ne fonctionne pas sur mobile. Que devrais-je faire?

Mon code session_start sur index.php

session_start();
if (isset($_SESSION['username'])){
    session_id();
}

Code complet pour le fichier 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 } ?>
13

Mon problème était côté serveur le session.save_path non défini sur mon serveur. Merci beaucoup à tous ceux qui m'ont aidé :)

0

Pas vraiment sûr de ce que votre code fait, parce que je ne vois rien concernant la définition du nom d'utilisateur ou quoi que ce soit de ce genre. Ce que fait votre code, c'est qu'il démarre la session et vérifie si la variable de nom d'utilisateur dans la session est définie et si OUI, il appelle session_id.

Pouvez-vous utiliser cela pour vérifier si la session est créée correctement?

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

Démarre une session et affiche l'ID de la session si le statut de la session n'est pas PHP_SESSION_NONE.

6
Kishor

Vous n'avez pas besoin de faire une session_id () pour démarrer une session, session_start () suffit. 

J'ai testé les éléments suivants sur Safari sur iPhone 6 (ajoutez simplement la partie requête de base de données si vous le souhaitez):

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. Effacez les données et les cookies sur votre navigateur mobile (ou passez simplement en mode de navigation privée). Cela vous assurera de "recommencer à zéro".

  2. Ouvrez testa.php sur votre navigateur mobile. Prenez note de l'identifiant de session indiqué. Entrez vos informations de connexion et appuyez sur Soumettre. La page suivante peut être vide.

  3. Ouvrez testb.php. Encore une fois, prenez note de l'identifiant de session indiqué. Il devrait être égal à l'identifiant de session indiqué dans test1.php. S'ils sont différents, il est possible que votre navigateur mobile soit configuré pour ne pas accepter les cookies.

J'ai personnellement testé cela sur Safari sur iPhone 6 et j'ai pu obtenir les données de nom d'utilisateur de la session.

PS Rappel amical: n'oubliez pas d'échapper aux données que vous utilisez dans les requêtes (c'est-à-dire $ username et $ password). Utilisez mysqli_real_escape_string ou utilisez les instructions préparées . Pour la sécurité.

3
aljo f

Les cookies fonctionnent certainement sur les navigateurs mobiles. 

2

Peut-être que vous rencontrez des problèmes de conflit:

Mon code session_start

if (isset($_SESSION['username'])){
    session_id();
} else if (!isset($_SESSION)){
   session_start();
}

Code complet pour le fichier 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 } ?>

Dans l'index.php sur la première ligne, j'ai -> SUPPRIMER CELA, METTRE LA PREMIÈRE ROUTINE DE VÉRIFICATION DE SESSION

if (!isset($_SESSION)){
   session_start();
}

EDIT: J'ai remarqué que vous utilisez header function pour rediriger vers la page d'index. Il est important d'éviter de telles redirections à moins que vous ne renvoyiez des utilisateurs de votre système, car certains environnements ne fonctionnent pas bien avec eux. Je suggère de changer votre routine en routine utilisateur POST/GET http à la place:

À l'intérieur validateSession.php 

en dehors de validateSession, RIEN sur les règles de sessions, concentrez-vous là-bas

index.php/head.php/du code qui commence toujours par chaque page ne commence que ça: 

<?php 
include_once('validateSessions.php'); 
?>

Votre formulaire: 

<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: J'ai passé en revue votre routine, faites attention à validateSessions.php, j'ai oublié de charger session_start () dans chaque routine qui appelle le fichier. Placez validateSessions dans votre répertoire d'inclusion.

MISE À JOUR: Même mon code aidant l'OP, le problème principal était la configuration de SESSION dans un fichier php.ini avec session.save_path, ce qui posait des problèmes au sujet des routines de session. Le correctif de php.ini a résolu le problème, le code qui, je l’attend bien, a aidé OP à réfléchir à certaines routines relatives aux sessions.

2
capcj

Votre session n'est probablement pas définie. En fonction de la version PHP que vous utilisez, vérifiez votre session.

Pour les versions de PHP> = 5.4.0

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

Pour les versions de PHP <5.4.0  

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

Supprimer session_start (); dans index.php et ajoutez ceci dans votre config.php

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

Simplification du code pour faciliter la compréhension. Ignorer vérifie le nom d'utilisateur et le mot de passe, etc. Vous essayez en fait de définir une variable de session. Cela se passe dans login.php. Le code pour cela est.

 <?php
 $username = "Umesh";
 if (isset($_SESSION))
 {
      $_SESSION['username'] = $username;
 }
 else
 {
           session_start();
           $_SESSION['username'] = $username;
 }
 print_r($_SESSION);
?>

Dans index.php, vous essayez de vérifier le statut de la session. Le code est ci-dessous.

 if (isset($_SESSION['username'])){
session_id();
} else if (!isset($_SESSION)){
    session_start();
}
print_r($_SESSION);

Ce qui précède fonctionne pour moi sur tous les navigateurs et appareils. J'ai même testé chrome sur iphone. Cela semble marcher correctement. S'il vous plaît vérifier cela et voir si cela fonctionne. Sinon, nous devrons vérifier votre serveur Web pour voir en quoi consiste le problème des objets de session sur ce système. 

J'ai vérifié que print_r ($ _SESSION) était identique dans les deux cas.

1
Umashankar Das

J'ai simplifié le code et la session est lancée lorsque toutes les vérifications sont passées.

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

En passant par votre dernier commentaire, je suppose que cela est dû à la chaîne de requête que vous utilisez. Fondamentalement, utiliser password comme nom de colonne coupe parfois la requête car password est également un mot clé mysql . De plus, en ce qui concerne votre session, vous pouvez vous référer à session_id () vs session_regenerate_id () pour plus de détails sur les fonctions. Session_id('login') définit essentiellement l'identifiant de session pour qu'il se connecte, ce qui fonctionne sur votre appareil mobile, car cela crée la session avec l'identifiant statique spécifique. Cependant, vous pouvez essayer d'utiliser session_regenerate_id(true) pour voir si cela vous aide.

Aussi, j'ai essayé d'exécuter le code en mettant une valeur statique comme nom d'utilisateur comme suit

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());

J'ai commencé à utiliser index.php directement à l'aide du téléphone qui imprimait la sortie sous la forme array() sans valeur. Il est apparu que le fichier Login.php n'était pas exécuté. Après avoir explicitement exécuté Login.php, l'index. php a imprimé le tableau de session. Pouvez-vous vous assurer que le fichier php de connexion est correctement exécuté . Cordialement

1
Bishwabikash Das

Vérifiez que session_start () est placé avant toute sortie du navigateur. J'ai trouvé que Chrome on Desktop peut être beaucoup plus tolérant que d'autres navigateurs, ainsi que Mobile Chrome.

0
discry