PHP MYSQL问题
我正在尝试使用PHP和mysql进行简单的登录,并使用会话。我有代码,理论上应该可以工作,但是它一直将我重定向到登录页面(刷新它),而不是将我带到配置文件PHP MYSQL问题,php,mysql,session,Php,Mysql,Session,我正在尝试使用PHP和mysql进行简单的登录,并使用会话。我有代码,理论上应该可以工作,但是它一直将我重定向到登录页面(刷新它),而不是将我带到配置文件 $username = $_POST['username']; $query = "SELECT `confirmcode` FROM `fb_network` WHERE `username` = '$username' AND `status`='Confirmed' "; $result = mysql_query($query)
$username = $_POST['username'];
$query = "SELECT `confirmcode` FROM `fb_network` WHERE `username` = '$username' AND `status`='Confirmed' ";
$result = mysql_query($query);
if (mysql_num_rows($result) == 1){
$result2 = mysql_query($query);
$row = mysql_fetch_row($result2);
$_SESSION['conf_code'] = $row[0];
$uid = $row[0];
session_register($uid);
header('location:profile.php?conf='.$row[0]);
}
else{
echo 'Wrong username';
}
我看到您的代码只有两个选项—显示“错误代码”或重定向到其他页面。没有重定向到登录页面的位置?您需要在代码的其余部分之前通过
会话\u start()
启动会话。我将使用用户定义的函数检查登录凭据并从函数返回true或false
你可以用这样的东西
function check_login ($username, $password) {
$query = "SELECT `confirmcode` FROM `fb_network` WHERE `username` = '$username' AND `status`='Confirmed' ";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
if( mysql_num_rows($result) == 0) {
return false;
}
if( mysql_num_rows($result) == 1) {
$_SESSION['loggedin'] = "true";
header('location:profile.php?conf='.$row[0]);
return true;
}
}
然后轻松调用该函数并显示相应的消息
请检查以下代码
<?php
session_start();
/** If the User is already Logged in then redirect to login.php **/
if(isset($_SESSION['loggedin'])){
header("Location: login.php");
}
else {
if( check_login($_POST['username'], $_POST['password'])) {
header('location:profile.php?conf='.$row[0]);
}
}
不,理论上它不应该起作用
试试这个
如果您的配置文件页面上有任何类型的“测试”脚本,在您未登录时会重新引导您,则可能是上述代码使您登录,但没有将会话变量正确地携带到配置文件页面…然后将用户发送回重新登录
确保使用变量在每个页面上正确启动会话,并确保它们在两端匹配。您有两个主要问题:
您没有使用session\u start
来告诉PHP开始跟踪会话
您正在使用会话\u寄存器
session\u register
要求register\u globals处于启用状态,希望它不在您的环境中。它还希望它的参数是一个字符串,它是您希望存储的变量的名称。您应该改为使用$\u SESSION['uid']=$row[0]代码>
您还应该了解SQL注入,这是您的代码显示的一个非常严重和常见的安全缺陷
以下是您的代码的更正版本:
<?php
session_start(); //it's fine to just do this by habit at the top of every page
$username = $_POST['username'];
//I added mysql_real_escape_string - please read about "sql injection", as it is a very serious and common problem!
$query = "SELECT `confirmcode` FROM `fb_network` WHERE `username` = '".mysql_real_escape_string($username)."' AND `status`='Confirmed' ";
$result = mysql_query($query);
if (mysql_num_rows($result) == 1) {
$result2 = mysql_query($query);
$row = mysql_fetch_row($result2);
$_SESSION['conf_code'] = $row[0];
//not sure if this is what you weree going for or not
$_SESSION['uid'] = $row[0];
header('location:profile.php?conf='.$row[0]);
}
else {
echo 'Wrong username';
}
是的,如果您正在使用会话,您需要在您想要访问的每个页面上使用会话\u sart()。请记住,如果您正在使用会话,那么您需要在每个页面上使用会话\u start()。在配置文件页面上是否有任何类型的“测试”脚本,如果您未登录,它是否至少会指示您“错误的用户名”刷新?对这两个问题都是。每个页面上都有一个会话注册检查,需要身份验证。如果我直接导航到此脚本,它会显示错误的用户名。您的意思是消除$result2
?您的fetch
仍然有$results2
而不是$results
好帖子,但是我想知道为什么查询运行了两次。除了抛出您添加的错误和dup查询之外,您在原始版本中看到了什么使其无法正常运行?@d2burke太糟糕了,我看不出有什么严重问题。起初以为是,但事实上,它只是更清晰的代码。它可能是任何东西。标题已发送错误例如谢谢,这就成功了。问题也出在profile.php中,以及它查看会话注册方式的方式。我添加了这个if(!isset($_SESSION['conf_code']){header(“Location:login.php”);}这是愚蠢的访问权限检查,你不觉得吗?我同意,但是我想让它尽可能接近最初提交的代码。不能一下子教所有的东西!
<?php
session_start(); //it's fine to just do this by habit at the top of every page
$username = $_POST['username'];
//I added mysql_real_escape_string - please read about "sql injection", as it is a very serious and common problem!
$query = "SELECT `confirmcode` FROM `fb_network` WHERE `username` = '".mysql_real_escape_string($username)."' AND `status`='Confirmed' ";
$result = mysql_query($query);
if (mysql_num_rows($result) == 1) {
$result2 = mysql_query($query);
$row = mysql_fetch_row($result2);
$_SESSION['conf_code'] = $row[0];
//not sure if this is what you weree going for or not
$_SESSION['uid'] = $row[0];
header('location:profile.php?conf='.$row[0]);
}
else {
echo 'Wrong username';
}
<?php
session_start();
if( ! isset($_SESSION['uid']))
//Not logged in!
if( $_SESSION['uid'] != $_GET['conf'])
//trying to access someone else's page!