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)

我正在尝试使用PHP和mysql进行简单的登录,并使用会话。我有代码,理论上应该可以工作,但是它一直将我重定向到登录页面(刷新它),而不是将我带到配置文件

$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!