2017-05-27 22 views
13

對於登錄即時通訊使用session_start(),對於桌面它的工作正常,但在移動設備上,它不起作用。當我使用變量創建session_id()時,例如,session_id('login')其在移動設備上工作,但在其他計算機上打破其他會話。但是當自動生成session_id()時,它不適用於移動設備。我該怎麼辦?上的index.phpPHP - 會話不適用於手機

我的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 } ?> 
+0

您是否檢查您的移動設備是否啓用了Cookie? –

+0

@RicardoOrtegaMagaña是的,Cookie在我的移動設備上啓用 –

+0

您使用的是哪種瀏覽器? –

回答

0

我的問題是在服務器端的session.save_path不definied到我的服務器。非常感謝所有人,誰幫助我:)

+0

那麼,它是如何在桌面上很好地工作? : - ? –

+0

之前在桌面上可以正常工作 –

6

不能確定你的代碼做什麼,因爲我沒有看到關於設置的用戶名或東西這種事情。你的代碼的作用是啓動會話並檢查是否設置了會話中的用戶名變量,如果是,則調用session_id

你可以用它來檢查會話是否被正確創建?

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

啓動一個會話,並顯示您的會話ID,如果session_status不PHP_SESSION_NONE

+0

我測試了你的解決方案,但仍然無法工作,即使在IE 11上 –

+0

你能解釋'不工作'嗎? – Kishor

+0

我的登錄鏈接是example.com/login.php,將其重定向提交到example.com後未登錄。與會話未開始相同 –

1

可能是你的會話未設置。根據您使用的PHP版本,檢查您的會話。

對於PHP 的版本> = 5.4.0

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

對於PHP的版本< 5.4.0

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

不工作:( –

+0

你把session_start()放在哪裏? –

+0

@aljof我的session_start是在index.php的第一行 –

3

你不需要做SESSION_ID()要開始一個會話,session_start()就足夠了。

我測試過在iPhone上的Safari 6以下(剛加入該數據庫查詢部分回來,如果你想):

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. Clear數據/ Cookie在您的手機瀏覽器(或只是進入無痕模式)。這將確保你「從頭開始」。

  2. 打開testa.php在您的移動瀏覽器上。記下顯示的會話ID。輸入您的登錄信息,然後點擊提交。下一頁可能顯示空白。

  3. 打開testb.php。再次注意顯示的會話ID。它應該等於test1.php中顯示的會話ID。如果它們不同,那麼您的手機瀏覽器可能被配置爲不接受cookie。

我親自在iPhone 6上對Safari進行了測試,我可以從會話中獲取用戶名數據。

PS。一個友好的提醒:不要忘記逃避您在查詢中使用的數據(即$ username和$ password)。使用mysqli_real_escape_string,或使用prepared statements。爲了安全。

+0

仍然是同樣的問題,iPhone沒有啓動會話。現在它顯示一個錯誤 - '注意:一個會話已經開始 - 忽略session_start()'(我更新了我的文章) –

+0

可能是因爲你已經在你的config.php中有session_start(),當你調用session_id() –

2

Cookies絕對適用於移動瀏覽器。

+0

是的,但移動不檢查會話 –

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> 
+0

仍然是同樣的問題,當我登錄時,其重定向到索引.php並沒有任何反應 –

+0

請問您可以發佈index.php的代碼嗎? – inarilo

+0

只有三條線。哪部分不工作? session_id返回一個值,你必須使用'echo session_id();' – inarilo

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/HTTP GET而不是套路:

內validateSession.php

validateSession外,任何關於會議的規則,集中一切有

的index.php /頭。 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配置到session.save_path的php.ini文件中,導致會話例程的問題。 php.ini修復程序解決了這個問題,我期望的代碼可以幫助OP思考一些面向Session的例程。

+0

併爲此我的問題是不固定的:(我不知道最新情況發生 –

+0

把回聲放在每一個例程和跟蹤你失去了會議,或即使它不啓動 – calexandre

+0

但爲什麼它開始在桌面和移動不是? –

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)在兩種情況下都是相同的。

+0

仍然是一樣的,我不知道爲什麼:/ –

+0

在桌面上返回'Array([用戶名] =>用戶名]',但在移動'陣列()' –

+0

你可以把這個代碼放在你的服務器的兩個單獨的文件,分享鏈接?我在下面的鏈接中有這個代碼。 http://ec2-54-255-212-88.ap-southeast-1.compute.amazonaws.com/testing/login.php http://ec2-54-255-212-88.ap- southeast-1.compute.amazonaws.com/testing/ –

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

執行代碼我開始使用索引.php直接使用打印輸出爲array() w的手機沒有values.turned,Login.php文件不執行。在我明確執行Login.php index.php打印會話數組。你能確保登錄php文件正確執行。 Regards

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

1

刪除的session_start();在index.php文件 和你的config.php文件添加此

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

仍然和以前一樣的問題 –