PHP Sessions回应每个用户名

时间:2014-12-31 16:46:13

标签: php mysql session username

我是PHP的新手,只读了整本书。我自己尝试了第一次真正的登录。我设置了我的数据库,用户使用电子邮件和密码登录。每个用户都有一个iduser和一个用户名。 使用会话,我怎样才能在只有登录用户的用户名在profile.php上回显的地方?现在我用每个用户名登录哪个用户并不重要在profile.php上回应。登录代码工作正常,只需要通过回显正确用户名的会话帮助。

我的代码:

home.php

<!DOCTYPE html>
<?php
include "header.php";
session_start();
session_destroy();
$_SESSION = array();
?>

<html>
<!--home page center login box-->
<div id="homebox1">
    <div id="logohome">
        <h2>Welcome</h2></br>
    </div>
    <div id="homecolumn1">
        <p>Login</p></br>
        <form id="login" action="login.php" method="post">
            <input name="emaillogin" placeholder="email" type="email" rows="20"> </input></br>
            <input name="passwordlogin" placeholder="password" type="password" rows="20"> </input></br>
            <input type="submit" value="Log In"> </input>
        </form>
    </div>
</div>
<!--footer1.php-->
</body>
</html>

的login.php

<?php
include "connect.php";
include "header.php";
session_start();

$sql = "select * from profile where email='" . $_POST["emaillogin"] . "' and password='" . md5($_POST["passwordlogin"]) . "'";
$res = mysqli_query($con, $sql);
if(mysqli_num_rows($res) > 0) {
    header("location: profile.php");
}else if(mysqli_num_rows($res) <= 0) { 
    session_destroy();
    include "home.php ";
    echo "incorrect email or password";
}
?>
<?php
//include "disconnect.php";
?>

profile.php

<?php
include "connect.php";
$res = mysqli_query($con, "select * from profile");
$num = mysqli_num_rows($res);
while ($dsatz = mysqli_fetch_assoc($res)) {
    echo $dsatz["username"];
}
?>

3 个答案:

答案 0 :(得分:3)

这是与您的个人资料中显示所有用户的原因相关的主要问题:

<强> profile.php

根据 JA 的建议,您需要根据会话用户名或ID(或用于区分表中用户的任何内容)对用户进行特定搜索,否则您将返回整个用户表(在你的情况下可能不是那么大,因为你刚开始测试水域,可以这么说)但是在一张大桌子里,这是一个坏主意。

此页面的辅助内容:您仍然希望在sql语句中使用绑定来帮助阻止sql注入,就像在login.php中一​​样(修订如下) )。正如 PeeHaa 所提到的,您需要确保在将用户输入的数据回显到浏览器时使用某种清理。这包括(但不限于)htmlspecialchars()htmlentities()strip_tags()等内容。这样做的原因是,如果某人决定撰写他们的name(或您对用户个人资料允许的任何其他内容):<script>some.Malicious('nastyjsCode')</script>当您{{1}时,它会将其作为嵌入式HTML写入您的网页}。

类似:

echo $_SESSION['name']

实际上会在您的源代码中生成:

// Lets say this is what was assigned from your database that
// the user input as their name at the time of sign-up
$_SESSION['name'] = "<script>some.Malicious('nastyjsCode')</script>";

// When you fetch it from your database or grab it from session
// echo to page like so
echo "Welcome ".htmlentities($_SESSION['name'],ENT_QUOTES)."!";

但会显示在页面上(这很好。这只是意味着这个用户有一个愚蠢的名字):

Welcome &lt;script&gt;some.Malicious(&#039;nastyjsCode&#039;)&lt;/script&gt;!

作为所有评论的摘要:

<强> home.php

Welcome <script>some.Malicious('nastyjsCode')</script>!

<强>的login.php

<?php
// Just session start before everything
session_start(); ?>
<!DOCTYPE html>
<html>
<?php 
// I don't know what this has in it, so it may or may not work here
// Since you have a close <body> I presume it has an open tag and
// such in this header.php file?
include("header.php"); ?>
<!--home page center login box-->
<div id="homebox1">
    <div id="logohome">
        <h2>Welcome</h2></br>
    </div>
    <div id="homecolumn1">
        <p>Login</p></br>
        <form id="login" action="login.php" method="post">
            <input name="emaillogin" placeholder="email" type="email" rows="20"> </input></br>
            <input name="passwordlogin" placeholder="password" type="password" rows="20"> </input></br>
            <input type="submit" value="Log In"> </input>
        </form>
    </div>
</div>
<!--footer1.php-->
</body>
</html>

答案 1 :(得分:0)

最简单的方法是将用户名(以及与之交互的任何其他用户信息)添加到$_SESSION数组,然后调用它而不是执行另一个SQL查询。

例如 login.php

if(mysqli_num_rows($res) > 0) {
  $_SESSION['user']=mysqli_fetch_assoc($res);

并在 profile.php 中,您只需echo $_SESSION['user']['username'];

答案 2 :(得分:0)

从快速浏览一下这个问题,似乎有两件事情遗失了。

<强> 1。不在会话中保存已登录用户的详细信息。:成功验证后,您需要保存用户详细信息。

if (mysqli_num_rows($res) > 0) {

    $result = mysqli_fetch_assoc($res);
    $_SESSION['userDetails'] = $result;

    header("location: profile.php"); 

<强> 2。在配置文件页面中,Sql不会过滤登录用户。:您可以在会话中保存登录用户的所有详细信息(如上所述),也可以只保存主要字段(user-id)并将其用作所有后续查询中的过滤器。

$res = mysqli_query($con, "select * from profile WHERE user-id = $_SESSION['userId] LIMIT 1");