【问题标题】:Profile Page PHP + MySQL个人资料页面 PHP + MySQL
【发布时间】:2016-11-26 00:15:10
【问题描述】:

个人资料页面正在使用 PHP 和 MySQL 来显示项目。
我想问两件事
承诺:如果你能帮助我,我会在我的网站上承认你并把你放在学分中;)

问题 1:
如何查看数据库中是否存在用户,如何显示404信息?

问题2:
因此,这里的主要错误是当您搜索用户时,它无法识别用户。
用户“admin01”搜索自己并且个人资料页面正在工作,如果用户 admin01 搜索用户 admin02 ,页面不会提供用户信息。无论如何如何解决这个问题?

附加信息:
该站点将使用GET方法检查url,例如:profile.php?username=admin01,它将显示用户信息。如果用户没有登录,页面将重定向到登录页面。

代码:

<?php
 ob_start();
 session_start();
 require_once 'dbconnect.php';

 if( !isset($_SESSION['user']) ) {
  header("Location: index.php");
  exit;
 }
 // select loggedin users detail
 $res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
 $userRow=mysql_fetch_array($res);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['userName']; ?></title>
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css"  />
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>

 <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="http://www.codingcage.com">Prospekt | A Gaming Community</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <ul class="nav navbar-nav">
            <li class="active"><a href="#">Dashboard</a></li>
            <li><a href="../home.php">Home</a></li>
            <li><a href="/forums.php">Forums</a></li>
          </ul>
          <ul class="nav navbar-nav navbar-right">

            <li class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
     <span class="glyphicon glyphicon-user"></span>&nbsp;Member - <?php echo $userRow['userName']; ?>&nbsp;<span class="caret"></span></a>
              <ul class="dropdown-menu">
                <li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span>&nbsp;Sign Out</a></li>
              </ul>
            </li>
          </ul>
        </div><!--/.nav-collapse -->
      </div>
    </nav>

 <div id="wrapper">

 <div class="container">

     <div class="page-header">
     <h1>Prospekt | A Gaming Community</h1>
     <h4> Dashboard |  See your live ranking, stats, and more! </h4>
     </div>
<?php
$username = $_GET['username'];
if (isset($username) === true && empty($_GET['username']) === false){
  echo $username;
} else {
  echo "Please search for a valid user!";
}
 ?>
        <div class="row">
        <div class="col-lg-12">

        </div>
        </div>

    </div>

    </div>

    <script src="assets/jquery-1.11.3-jquery.min.js"></script>
    <script src="assets/js/bootstrap.min.js"></script>

</body>
</html>

【问题讨论】:

  • 附注:您使用的是长期弃用的数据库适配器(旧的 mysql_...() 函数),并且您的脚本对 sql 注入攻击开放...请移植您的脚本将mysqliPDO 作为数据库适配器。检查官方文档。并了解使用“准备好的语句”和“参数绑定”来保护您的代码的优势。
  • 感谢您的提示,这实际上只是本地化的,一旦我将其“在线”移植,这将会改变,然后我将使用 mysqli 或 PDO :)
  • 问题 2 的答案显然是:在脚本的开头,您检查是否存在一个会话变量,其名称类似于作为参数指定的用户名。除了当前登录的用户之外,其他用户非常不太可能出现这种情况。所以你实际上阻止了你自己想要达到的目标。
  • 关于移植:这是一种完全不切实际的做法。唯一的方法是在您的开发环境中正确编码并仅在代码按需要工作时发布。一“在线移植”就“移植到PDO”是不现实的。立即行动。
  • 稍后从 mysql 更改为 pdo 意味着您要完成两次工作。第一次做对。

标签: php mysql dynamic user-profile


【解决方案1】:

问题主要在于您选择使用的 HTML。它给人一种作为用户主页的印象。您需要用新的 HTML 替换该 HTML。你需要一些这样的 PHP 代码

 ob_start();
 session_start();
 require_once 'dbconnect.php';

 if( !isset($_SESSION['user']) ) {
  header("Location: index.php");
  exit;
 }
 else {
   /* find out if a user exists and raise 404 if not? Here's how */

    $sql = 'SELECT COUNT(*) from users WHERE username = ? LIMIT 1';
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(1, $_GET['username'], PDO::PARAM_INT);
    $stmt->execute();
    if($stmt->fetchColumn()) {
        /* now an authenticated users is trying to see a profile page
           on your website for a user who exists */
        // CREATE THE APPROPRIATE HTML

    }
    else 
    {
        header('HTTP/1.0 404 not found');
    }
}

请注意,我使用了 PDO。不应使用 mysql_* 函数。您没有在当前代码中转义查询参数。致命的危险。

请注意,应删除原始代码中的以下行:

 $res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']);
 $userRow=mysql_fetch_array($res);

【讨论】:

  • 实际上你不需要这样一个明确的“检查用户是否存在”查询,OP 用来获取指定用户数据的查询就足够了。虽然显然它必须修改为参数绑定。
  • 我的第二个问题是:所以,我搜索了我自己的个人资料,它正在工作,但是当我搜索其他个人资料时,profile.php 只显示我自己的信息,顺便说一句,你能把你的代码改成“固定的 php 代码”吗?
  • 这是“固定”代码。作为 PDO 准备的语句,它不容易受到 sql 注入的影响
【解决方案2】:

对于您的问题 2:在您检查 $_GET 方法的位置添加以下条件

<?php
    $username = $_GET['username'];
    if (isset($username) === true && empty($_GET['username']) === false && $username != $userRow['userName'] ){
       echo $username;
    } else {
       echo "Please search for a valid user!";
    }
 ?>

对于您的问题 1:您可以在 SELECT Query 中检查您不是任何数组的 id 您可以将 Header Location 更改为 404 Page。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2014-10-09
    • 2016-06-26
    • 2014-05-10
    • 2021-06-23
    相关资源
    最近更新 更多