【问题标题】:PHP MYSQL questionPHP MYSQL 问题
【发布时间】:2010-09-12 18:22:00
【问题描述】:

我正在尝试使用 PHP 和 mysql 进行简单的登录,并且也使用 Sessions。我有代码,理论上应该可以工作,但是它不断将我重定向到登录页面(刷新它),而不是把我带到个人资料。

$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';
}

【问题讨论】:

  • 您的个人资料页面上是否有任何类型的“测试”脚本可以在您未登录时重定向您?
  • 刷新时是否至少显示“用户名错误”?
  • 两个问题都是。每个页面上都有一个 session_registered 检查,需要身份验证。如果我直接导​​航到这个脚本,它会显示错误的用户名。

标签: php mysql session


【解决方案1】:

不,理论上它不应该起作用
试试这个

<?php
$username = mysql_real_escape_string($_POST['username']);
$query = "SELECT `confirmcode` FROM  `fb_network` 
            WHERE `username` = '$username' AND `status`='Confirmed' ";
$result = mysql_query($query) or trigger_error(mysql_error().$query);
if ($row = mysql_fetch_row($result)){     
  session_start();
  $_SESSION['conf_code'] = $row[0];
  header('Location: profile.php');
  exit;
} else {
  echo 'Wrong username';
}

但可能还有其他问题,来自您未在此处发布的代码或其他原因。
其实只有调试才能确定问题出在哪里

【讨论】:

  • 您的意思是删除$result2 吗?你的fetch 仍然有$results2 而不是$results
  • 好帖子,我想知道为什么查询运行了两次。除了您添加的错误抛出和 dup 查询之外,您在原始文件中看到了什么会使其无法正常运行?
  • @d2burke 太糟糕了,我没有看到任何严重问题。起初以为是,但事实上它只是更清晰的代码。它可以是任何东西。例如,标头已发送错误
  • 谢谢,这成功了。问题还在于 profile.php 以及它查看会话注册方式的方式。我添加了这个 if(!isset($_SESSION['conf_code'])){ header("Location: login.php"); }
【解决方案2】:

我会使用一个用户定义的函数,让它检查登录凭据并从函数返回真或假。

你可以使用这样的东西。

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_start()。
【解决方案3】:

我发现您的代码只有两个选项 - 显示“错误代码”或重定向到其他页面。没有你重定向到登录页面的地方?

【讨论】:

    【解决方案4】:

    您需要在其余代码之前通过sessions_start() 启动会话。

    【讨论】:

    • 是的,如果您使用会话,则需要在要访问的每个页面上使用 session_sart()。
    【解决方案5】:

    如果您的个人资料页面上有任何类型的“测试”脚本在您未登录的情况下重定向您,则可能是上面的代码让您登录了,但没有正确携带会话变量到个人资料页面...随后将用户发送回以再次登录。

    确保使用变量在每个页面上正确启动会话,并确保它们在两端匹配。

    【讨论】:

      【解决方案6】:

      你有两个主要问题:

      1. 您没有使用 session_start 告诉 PHP 开始跟踪会话
      2. 您正在使用session_registersession_register 需要打开 register_globals,希望它不在您的环境中。它还期望它的参数是一个字符串,它是您希望存储的变量的名称。你应该改用$_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';
      }
      

      然后在profile.php中,检查是否有人登录:

      <?php 
      session_start();
      
      if( ! isset($_SESSION['uid']))
          //Not logged in!
      
      if( $_SESSION['uid'] != $_GET['conf'])
          //trying to access someone else's page!
      

      【讨论】:

      • 那是愚蠢的访问权限检查,你不觉得吗?根本不应该使用 GET。
      • 我同意,但我想让它尽可能接近最初提交的代码。不能一次教所有东西!
      猜你喜欢
      • 1970-01-01
      • 2011-07-09
      • 2018-07-13
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2011-07-19
      • 2023-04-06
      相关资源
      最近更新 更多