PHP - 会话无法在移动设备上运行

时间:2017-05-27 17:22:01

标签: php session session-variables

对于使用session_start()登录即时,对于桌面,它的工作正常,但在移动设备上,它不起作用。例如,当我使用变量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 个答案:

答案 0 :(得分:6)

不确定你的代码是做什么的,因为我没有看到任何关于设置用户名或任何类型的东西。您的代码所做的是,它启动会话并检查会话中的用户名变量是否已设置,如果是,则调用session_id

您可以使用它来检查会话是否正确创建?

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

如果session_status不是PHP_SESSION_NONE

,则启动会话并显示会话ID

答案 1 :(得分:3)

您不需要执行session_id()来启动会话,session_start()就足够了。

我在iPhone 6上的Safari上测试了以下内容(如果需要,只需添加数据库查询部分):

<强> 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。

  4. 我亲自在iPhone 6上的Safari上测试了这个,我能够从会话中获取用户名数据。

    PS。一个友好的提醒:不要忘记逃避您在查询中使用的数据(即$ username和$ password)。使用mysqli_real_escape_string,或使用prepared statements。为了安全起见。

答案 2 :(得分:2)

Cookies绝对适用于移动浏览器。

答案 3 :(得分: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中我有 - &gt;删除它,确保会议的第一个常规检查

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()。将validateSessions放在include目录中。

更新:即使我的代码帮助OP,主要问题是使用session.save_path将SESSION配置到php.ini文件中,导致会话例程出现问题。 php.ini修复程序解决了这个问题,我希望这些代码可以帮助OP考虑一些Session会话的例程。

答案 4 :(得分:1)

可能您的会话未设置。根据您使用的PHP版本,检查您的会话。

对于PHP &gt; = 5.4.0

的版本
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

对于PHP的版本&lt; 5.4.0

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

答案 5 :(得分:1)

我简化了代码,并在所有检查通过后启动会话。

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

答案 6 :(得分:1)

简化代码以便于理解。检查用户名和密码等。您基本上是在尝试设置会话变量。这发生在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上测试过chrome。它似乎工作正常。请检查一下,看看它是否有效。如果没有,我们将不得不检查您的网络服务器,以查看该系统上的会话对象,问题是什么。

我确认两种情况下print_r($ _SESSION)都相同。

答案 7 :(得分:1)

根据您的上一条评论,我猜这是由于您使用的查询字符串。基本上使用password作为列名有时会破坏查询,因为password也是一个mysql关键字。 此外,关于您的会话,您可以参考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());

我开始直接使用index.php使用手机将输出打印为array()而没有任何值。导致 Login.php 文件未执行。之后我明确执行了 Login.php index.php打印了会话数组。你能确保登录php文件正确执行吗? 此致

答案 8 :(得分:1)

为什么使用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');
  }
}
?>

我的HTML表单

right

答案 9 :(得分:1)

删除session_start();在index.php中 并在config.php

中添加
if (session_status() == PHP_SESSION_NONE) 
{
    session_start();
}

答案 10 :(得分:0)

我的问题是在服务器端Error calling Charge: {\"errors\":[{\"category\":\"INVALID_REQUEST_ERROR\",\"code\":\"VALUE_TOO_LOW\",\"detail\":\"`amount_money.amount` must be greater than 100.\ 未定义到我的服务器。非常感谢所有人,他们帮助了我:)。

答案 11 :(得分:0)

检查session_start()是否放置在任何浏览器输出之前。我发现台式机上的Chrome可以比其他浏览器和移动版Chrome宽容得多

答案 12 :(得分:-1)

此问题是由Chrome“精简模式”生成的,目的是减少数据负载,从而将手机丢给手机。如果您使用秘密导航,那么精简模式会自动禁用页面正常工作。您必须在Chrome上禁用“精简模式”。 这是最终的解决方案。