web-dev-qa-db-ja.com

PHP-モバイルでセッションが機能しない

session_start()を使用したログインimの場合、デスクトップの場合は正常に機能しますが、モバイルでは機能しません。たとえば、変数を使用してsession_id()を作成すると、session_id('login')はモバイルでは機能しますが、他のコンピューターの他のセッションは中断されます。ただし、session_id()が自動的に生成される場合、モバイルでは機能しません。私は何をすべきか?

Index.phpの私のsession_startコード

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

私の問題は、サーバー側でsession.save_pathがサーバーに定義されていないことでした。私を助けてくれたすべての人に感謝します:)

0

ユーザー名の設定やそのようなことについては何も見当たらないので、コードが何をするのか本当にわかりません。コードが行うことは、セッションを開始し、セッションのユーザー名変数が設定されているかどうかを確認し、YESの場合はsession_idを呼び出します。

これを使用して、セッションが正しく作成されているかどうかを確認できますか?

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

セッションを開始し、session_statusがPHP_SESSION_NONEでない場合はセッションIDを表示します

6
Kishor

セッションを開始するためにsession_id()を実行する必要はありません。session_start()で十分です。

IPhone 6のSafariで以下をテストしました(必要に応じて、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を開きます。表示されたセッションIDをメモします。ログイン情報を入力し、[送信]をタップします。次のページが空白になることがあります。

  3. testb.phpを開きます。再度、表示されたセッションIDをメモします。これは、test1.phpに表示されるセッションIDと同じである必要があります。それらが異なる場合、モバイルブラウザがCookieを受け入れないように設定されている可能性があります。

これをiPhone 6のSafariで個人的にテストしたところ、セッションからユーザー名データを取得できました。

PS。わかりやすいリマインダー:クエリで使用するデータ(つまり、$ usernameと$ password)をエスケープすることを忘れないでください。 mysqli_real_escape_string を使用するか、または 準備されたステートメント を使用します。セキュリティのため。

3
aljo f

Cookies は間違いなくモバイルブラウザで動作します。

2

多分あなたはいくつかの競合の問題を経験しています:

私の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();
}

編集:私はあなたが header 関数を使用してインデックスページにリダイレクトしていることを指摘しました。システムからユーザーを送り出さない限り、このようなリダイレクトを回避することが重要です。これは、環境によってはうまく機能しない場合があるためです。代わりに、ルーチンをユーザー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>

編集:私はあなたのルーチンを確認し、validateSessions.phpに注意を払いました、私はファイルを呼び出したすべてのルーチンでsession_start()をロードするのを忘れていました。 includeSession内にvalidateSessionsを配置します。

更新:OPを助ける私のコードでさえ、主な問題は、session.save_pathを含むphp.iniファイルへのSESSION構成であり、セッションルーチンに関する問題を引き起こしていました。 php.iniの修正で問題が解決しました。このコードにより、OPはセッション関連のルーチンについて考えるのに役立ちました。

2
capcj

おそらくセッションが設定されていません。 PHP使用するバージョンに応じて、セッションを確認します。

PHP > = 5.4.のバージョンの場合

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

PHP <5.4.のバージョンの場合

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

Session_start();を削除します。 index.phpで、config.phpにこれを追加します

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

コードを簡略化して、理解を容易にしました。ユーザー名やパスワードなどのチェックを無視しています。基本的に、セッション変数を設定しようとしています。それは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);

上記はすべてのブラウザとデバイスで動作します。私もテストしましたchrome。正常に動作しているようです。これを確認して、動作するかどうかを確認してください。動作しない場合は、Webサーバーをチェックして、問題の内容を確認する必要があります。そのシステム上のセッションオブジェクト。

Print_r($ _SESSION)が両方のケースで同じであることを確認しました。

1
Umashankar Das

コードを簡略化し、すべてのチェックに合格するとセッションが開始されます。

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

あなたの最後のコメントに行くと、それはあなたが使っているクエリ文字列によるものだと思います。 passwordもmysqlキーワードであるため、基本的にpasswordを列名として使用すると、クエリが失敗することがあります。また、セッションについては、関数の詳細について session_id()vs session_regenerate_id() を参照できます。 Session_id('login')は基本的に、セッションIDをログインに設定します。これにより、特定の静的IDでセッションが作成されるため、モバイルデバイスで機能します。ただし、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());
_

出力をarray()として値なしで出力した電話を使用して、index.phpを直接使用し始めました。Login.phpファイルが実行されません。明示的に実行した後Login.phpindex.phpはセッション配列を出力しました。ログインphpファイルが正しく実行されていることを確認できますか。よろしく

1

Session_id()を使用する理由。セッション私はいつもこのログインシステムを使用しています。デスクトップまたはモバイルセッションに問題はありません。

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 ">忘れた場合</a> </ p> 
 </ div> 
 <div> 
 <button class = "btn btn-success submit" type = "submit" name = "submit">ログイン<i class = "fa fa-sign-in"> </ i> </ button> 
 </ div> 
 </ form> 
 
1
Obaidul Haque

ブラウザ出力の前にsession_start()が配置されていることを確認してください。デスクトップでChromeを使用すると、モバイルChromeだけでなく他のブラウザよりもはるかに寛容になる可能性があります。

0
discry

この問題は、Chrome "ライトモード"で生成され、データの負荷を軽減して電話をスローします。シークレットナビゲーションを使用している場合、ライトモードがページを自動的に無効にするため、正しく機能します。 "ライト"を無効にする必要があります。 Chromeのモード」。これが最終的なソリューションです。

0
Stefano