对于使用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 } ?>
答案 0 :(得分:6)
不确定你的代码是做什么的,因为我没有看到任何关于设置用户名或任何类型的东西。您的代码所做的是,它启动会话并检查会话中的用户名变量是否已设置,如果是,则调用session_id
。
您可以使用它来检查会话是否正确创建?
session_start();
if (session_status() !== PHP_SESSION_NONE)
{
echo session_id();
}
如果session_status不是PHP_SESSION_NONE
答案 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";
在您的移动浏览器上清除数据/ Cookie(或者只是进入隐身模式)。这将确保您“从头开始”。
在您的移动浏览器上打开 testa.php 。记下显示的会话ID。输入您的登录详细信息,然后点下一页可能会显示空白。
打开 testb.php 。再次,记下显示的会话ID。它应该等于test1.php中显示的会话ID。如果它们不同,那么您的移动浏览器可能被配置为不接受cookie。
我亲自在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代码
<?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上禁用“精简模式”。 这是最终的解决方案。