mysql — сессии PHP повторяют каждое имя пользователя

Я новичок в 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"];
}
?>

1

Решение

Это главная проблема, связанная с тем, что все ваши пользователи отображаются в вашем профиле:

profile.php

По предложению J A вам нужно будет выполнить определенный поиск пользователя по имени пользователя или идентификатору сеанса (или тому, что вы используете для разграничения пользователей в таблицах), в противном случае вы вернете всю свою таблицу пользователей (которая в вашем случае, вероятно, не так уж велика, так как вы начинаете и просто тестировать воды, так сказать) но за большим столом это плохая идея.

Вторичный для этой страницы: Вы также по-прежнему хотите использовать привязку в своем выражении SQL, чтобы предотвратить внедрение SQL, как вы делаете в login.php страница (пересмотрено изложено ниже). Как упомянуто PeeHaa, вам нужно будет убедиться, что вы используете какую-то дезинфекцию при выводе пользовательских данных в браузер. Это будет включать (но не ограничиваясь) что-то вроде htmlspecialchars(), htmlentities(), или же strip_tags()…так далее. Причина этого в том, если кто-то решит написать свои name (или что-то еще, что вы разрешаете для профиля пользователя): <script>some.Malicious('nastyjsCode')</script> он запишет его как встроенный 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;!

Но будет отображаться на странице (это нормально. Это просто означает, что у этого пользователя тупое имя):

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

Как резюме из всех комментариев:

home.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>

login.php

<?php
session_start();
include("connect.php");
// You may not need this here. Likely you can put this down in the fail portion
// of the login. I don't know what's in it though. If there is html contained in
// this file, it may disrupt your header() function in the success portion of
// your script (header already sent error/warning)
include("header.php");

// I use PDO, so I am not 100% familiar with the procedural version of this function,
// but according to the PHP manual, this is the step for binding mysqli for
// prevention of sql injection attacks
$res = mysqli_prepare($con, "select * from profile where email = ? and password = ?");
// As mentioned by PeeHaa, the md5() is not good enough to store passwords. You will
// need to do stronger encryption. If your version of PHP allows automated salted encryption,
// use that, if not, you will want to seek out a more manual way of salting/encrypting
mysqli_stmt_bind_param($res, $_POST["emaillogin"],md5($_POST["passwordlogin"]));
mysqli_stmt_execute($res);

// Specifically returning 1 row, not just greater than 0 as noted
// by Emilio Gort in OP comments
if(mysqli_num_rows($res) === 1) {
// On success, fetch user data in an array
$result = mysqli_fetch_assoc($res);
// Assign single values or the entire data array as suggested by Mike
$_SESSION['username'] = $result['username'];
$_SESSION['email'] = $result['email'];
// etc..
header("location: profile.php");
// It is common practice to add exit after a header()
// so the script stops processing
exit;
}
// you don't have to specify the less-than/equal-to here because it's either
// equal to 1 or not
else {
// You may also want to consider redirecting back to home with a
// $_GET error code instead of echoing html:

// header('Location: home.php?err=login');

// Then on the home.php have a spot near the form that has:
// if(isset($_GET['err']) && $_GET['err'] == 'login')
//     echo 'incorrect email or password';

include("home.php");
// I suspect this header file should go here instead of top
// (if it contains html). If so, uncomment and remove from top
//include("header.php");
echo "incorrect email or password";
}

//include "disconnect.php";
?>
3

Другие решения

С первого взгляда на вопрос, кажется, отсутствуют две вещи.

1. Не сохранять данные пользователя, вошедшего в систему, в сеансе.: Вам необходимо сохранить данные пользователя после успешной аутентификации.

if (mysqli_num_rows($res) > 0) {

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

header("location: profile.php");

2. На странице профиля Sql не фильтрует вошедшего в систему пользователя.: Вы можете либо сохранить все данные вошедшего в систему пользователя в сеансе (как описано выше), либо просто сохранить основное поле (идентификатор пользователя) и использовать его в качестве фильтра во всех ваших последующих запросах.

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

Проще всего было бы добавить имя пользователя (и любую другую информацию пользователя, с которой вы взаимодействуете) в $_SESSION массив, а затем просто вызвать это, а не делать другой запрос SQL.

Например в login.php

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

И в profile.php ты только echo $_SESSION['user']['username'];,

0
По вопросам рекламы [email protected]