Добрый день, у меня есть сайт блога, только начинаю делать. Аутентификация с сессий и тд, то есть можно получить логин пользователя при входе и вывести в приветствие при переходе на страницу после регистрации. Нужно сделать код php добавления поста. 2 таблицы: users - id, login, password. posts - id, user_id, post, date_of_publ, tags. Внешний ключ user_id таблицы posts ссылается на первичный id таблицы users. Логика (на данный момент) такая: при нажатии кнопки запостить нужно получить id из users аутентифицированного на данный момент пользователя и записать в user_id в posts, ну и остальные данные посредством INSERT INTO. Но не знаю как это реализовать, может надо сделать совсем по другому, как не понимаю. Подскажите, помогите Форма авторизации: PHP: <?php $host = 'MySQL-5.5'; $user = 'root'; $pass = ''; $db_name = 'practice.blog'; $link = mysqli_connect($host, $user, $pass, $db_name); // Проверка соединения if (!$link) { echo 'Не могу соединиться с БД. Код ошибки: ' . mysqli_connect_errno() . ', ошибка: ' . mysqli_connect_error(); exit; } session_start(); if (!empty($_POST['password']) and !empty($_POST['login'])) { $login = $_POST['login']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE login='$login' AND password='$password'"; $res = mysqli_query($link, $query); $user = mysqli_fetch_assoc($res); if (!empty($user)) { $_SESSION['auth']=true; $_SESSION['login']= $login; echo "yes";// прошел авторизацию header('Location: blogpage.php'); exit; } else { echo "no";// неверно ввел логин или пароль echo '<a href="index.php">Назад</a>'; } } Форма для поста (совсем лысая): PHP: <?php $host = 'MySQL-5.5'; $user = 'root'; $pass = ''; $db_name = 'practice.blog'; $link = mysqli_connect($host, $user, $pass, $db_name); // Проверка соединения if (!$link) { echo 'Не могу соединиться с БД. Код ошибки: ' . mysqli_connect_errno() . ', ошибка: ' . mysqli_connect_error(); exit; } session_start(); if (!empty($_SESSION['auth'])) { echo "yes"; } else{ echo "no"; } echo $_SESSION['login']; } Как получить id именно авторизированного пользователя и как вставить в таблицу постов? В какой форме получать id входа авторизации или поста? Как реализовать?
Добрый день! 1. Вообще-то в базе данных обычно хранят хэширванные пароли. Работают с паролями так PHP: //при регистрации пользователя $db_password = password_hash($_POST["password"], PASSWORD_DEFAULT); //сохранение в БД //При проверке введённого пароля if (password_verify($_POST['password'], $db_password)) ... 2.В случае совпадение имени и пароля, user_id можно передавать через $_SESSION["user_id"], причем $_SESSION['auth']) лишнее, т.к. $_SESSION["user_id"] > 0 достаточно для провери успешного логина. 3. Пример 1 PHP: $message = ""; if ( filter_input(INPUT_POST, 'login') ) { $conn = mysqli_connect('127.0.0.1:3306','root','','test'); $stmt = $conn->prepare("SELECT id, role, password FROM `users` WHERE login = ?"); $stmt->execute([$_POST['login']]); $stmt->bind_result($id, $role, $password); $stmt->fetch(); if ($password) { if (password_verify($_POST['password'], $password)) { session_start(); $_SESSION['user_id'] = $id; $_SESSION['role'] = $role; $message="OK"; } else { $message="Incorrect password"; } } else { $message="Not found user"; } echo $message; exit; } ?> <html> <head> <script> window.addEventListener("load", () => { var form = document.getElementById("log"); var go = document.getElementById("go"); var err = document.getElementById("error"); var inp = document.querySelectorAll("input"); //------------------------------------------------ for (i in [0,1]) { inp[i].addEventListener("click", () => { err.innerHTML=""; }); } //------------------------------------------------ form.addEventListener("submit", (e) => { e.preventDefault(); fd = new FormData(form); fetch("?", { method: "POST", body: fd, }) .then((response) => response.text()) .then((text) => { if(text == "OK") window.location = "blogpage.php"; else err.innerHTML = text; }); }); //------------------------------------------------ }); </script> </head> <body> <form id="log" method="post" action=""> <input type="text" name="login" placeholder="Name" required> <input type="password" name="password" placeholder="Password" required> <input type="submit" id="go" value="Login"> <div id="error"></div> </form> </body> </html> Пример 2 PHP: <?php if (filter_input(INPUT_POST, 'login')){ $conn = mysqli_connect('127.0.0.1:3306','root','','test'); $stmt = $conn->prepare("SELECT id FROM `users` WHERE login = ?"); $stmt->execute([$_POST['login']]); $stmt->bind_result($id); $stmt->fetch(); if($id) { session_start(); $_SESSION['user_id'] = $id; $message = ""; } else $message = "Not found user"; echo $message; exit; } else if(filter_input(INPUT_POST, 'password')) { session_start(); $conn = mysqli_connect('127.0.0.1:3306','root','','test'); $stmt = $conn->prepare("SELECT role, password FROM `users` WHERE id = ?"); $stmt->execute([$_SESSION['user_id']]); $stmt->bind_result($role, $password); $stmt->fetch(); if($password) { if (password_verify($_POST['password'], $password)) { session_start(); $_SESSION['role'] = $role; $message = ""; } else { $message = "Incorrect password"; } } echo $message; exit; } ?> <html> <head> <script> window.addEventListener("load", () => { var form = document.getElementById("log"); var go = document.getElementById("go"); var err = document.getElementById("error"); var inp = document.querySelectorAll("input"); //------------------------------------------------ inpAttr = { type:"password", name:"password", placeholder:"Пароль" }; inpSet = function(inpAttr){ inp[0].value=""; for(attr in inpAttr) inp[0].setAttribute(attr,inpAttr[attr]); } for (i in [0,1]) { inp[i].addEventListener("click", () => { err.innerHTML=""; }); } //------------------------------------------------ step = 1; form.addEventListener("submit", (e) => { e.preventDefault(); fd = new FormData(form); fetch("?", { method: "POST", body: fd, }) .then((response) => response.text()) .then((text) => { if(text) err.innerHTML = text; else { switch(step) { case 1: inpSet(inpAttr); go.value="Continue"; step++; break; case 2: form.submit(); break; } } }); }); //------------------------------------------------ }); </script> </head> <body> <form id="log" method="post" action="blogpage.php"> <input type="text" name="login" placeholder="Name" required> <input type="submit" id="go" value="Login"> <div id="error"></div> </form> </body> </html> Удачи!
Для проверки авторизации обычно просто проверяется наличие в сессии какого-то идентификационного поля (id/login): PHP: if (isset($_SESSION['id'])) { --- Добавлено --- Доп. условия, естественно, тоже могут быть, например проверка «времени жизни» сессии на стороне сервера. --- Добавлено --- Имя пользователя, название поста? А вот поле tags в посте не нужно, если это не кеш. Также продумайте, чтобы сразу после (первого) постинга пост не появлялся в публичных списках, а оставался «черновиком». Например, можно завести числовое поле «категория» с дефолтным значением «Черновик» (0 или NULL): https://gency.ru/comment/2