我是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"];
}
?>
答案 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 <script>some.Malicious('nastyjsCode')</script>!
作为所有评论的摘要:
<强> 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");