У меня есть PHP
сайт. Я хочу создать signup-login process
. Я завершил процесс signup
, но когда мне log in
мне нужно будет выполнить некоторую проверку, только после этого он должен быть перенаправлен на страницу, на которую я хочу, чтобы он был перенаправлен.
У меня есть следующие страницы:
index.php,
login.php,
handleLogin.php, and
blog.php
Я хочу выполнить такую проверку, когда мы входим в систему с index.php
или любой другой страницы, но не со страницы blog
, в login
будет ссылка с именем header
, и когда кто-то захочет щелкнуть оттуда, появится страница login
и после logged in
произойдет перенаправление на index.php
. Но когда мы нажимаем с comment
на страницу blog
, сначала происходит перенаправление на страницу login
, а в случае успеха logged in
происходит перенаправление на страницу same
blog
.
Ниже приведены коды HTML
страницы login
:
<div class = "login_form">
<form action = "handleLogin.php" method = "POST" class = "login">
<div class = "mb-3">
<label for = "exampleInputEmail1" class = "form-label">Email address</label>
<input type = "email" name = "vEmail" class = "form-control" id = "exampleInputEmail1" aria-describedby = "emailHelp">
</div>
<div class = "mb-3">
<label for = "exampleInputPassword1" class = "form-label">Password</label>
<input type = "password" name = "vPass" class = "form-control" id = "exampleInputPassword1">
<div id = "emailHelp" class = "form-text">We'll never share your email & password with anyone else.</div>
</div>
<button type = "submit" class = "btn btn-primary mb-3">Log in</button>
<div class = "create_account">
<label for = "exampleInputEmail1" class = "form-label">Don’t have an account? <a href = "signup.php"
class = "signup_link">Sign up</a></label>
</div>
</form>
</div>
Ниже приведены коды HTML
страницы handleLogin
:
<?php
// session_start ();
// $bid = $_GET['b'];
$bid = '0';
$showAlert = "false";
if ($_SERVER["REQUEST_METHOD"]= = "POST"){
include '../partials/_dbconnect.php';
$viewerEmail = $_POST['vEmail'];
$viewerPass = $_POST['vPass'];
$loginSql = "SELECT * FROM `viewers` WHERE `viewer_email`='$viewerEmail'";
$loginResult = mysqli_query($conn, $loginSql);
$loginNumRows = mysqli_num_rows($loginResult);
if ($loginNumRows==1) {
$showAlert = "Password not match";
$loginRow = mysqli_fetch_assoc($loginResult);
if (PASSWORD_VERIFY($viewerPass, $loginRow['viewer_pass'])) {
session_start();
$_SESSION['loggedin'] = true;
$_SESSION['vid'] = $row['viewer_id'];
$_SESSION['viewer_email'] = $row['viewer_email'];
$_SESSION['viewer_name'] = $row['viewer_name'];
// start
$showAlert = "No authority";
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin']==true) {
// header("Location: ../mains/blog?logininsuccess=true&b=$bid");
// exist();
if (($bid!=0) && ($bid!=NULL)) {
header("Location: ../mains/blog?logininsuccess=true&b=$bid");
exist();
}
else {
// header("Location: ../index");
// exist();
$showAlert = "No bid";
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin']==true) {
$showAlert = "Unknown bid";
if (($bid=0) && ($bid=NULL) && ($bid='')) {
header("Location: ../index?no_bid");
exist();
}
else {
header("Location: login?loginsuccess=false&error=$showAlert");
}
}
else {
header("Location: login?loginsuccess=false&error=$showAlert");
}
}
}
else {
header("Location: login?loginsuccess=false&error=$showAlert");
}
// end
}
}
else {
$showAlert = "Email not exist";
}
header("Location: login?loginsuccess=false&error=$showAlert");
}
?>
Результат, который я получаю, следующий:
loginsuccess=false&error=Unknown%20bid
Ожидаемый мной результат следующий:
Когда $bid='0'
или $bid='NULL'
или $bid=''
или нет $bid
, то после logged in
стоит successful
, он должен перенаправить на index.php
, но если $bid='5'
, то он должен перенаправить на http://localhost/ows-backup-30-7-24/mains/blog?b=5
if (($bid=0) && ($bid=NULL) && ($bid='')) {
- Это не то, что вы думаете... Пожалуйста, посмотрите = vs. ==Не могли бы вы попробовать это
<?php
session_start(); // Ensure session is started at the beginning
if ($_SERVER["REQUEST_METHOD"] == "POST") {
include '../partials/_dbconnect.php';
$viewerEmail = $_POST['vEmail'];
$viewerPass = $_POST['vPass'];
$loginSql = "SELECT * FROM `viewers` WHERE `viewer_email`='$viewerEmail'";
$loginResult = mysqli_query($conn, $loginSql);
if ($loginResult) {
$loginRow = mysqli_fetch_assoc($loginResult);
if (password_verify($viewerPass, $loginRow['viewer_pass'])) {
$_SESSION['loggedin'] = true;
$_SESSION['vid'] = $loginRow['viewer_id'];
$_SESSION['viewer_email'] = $loginRow['viewer_email'];
$_SESSION['viewer_name'] = $loginRow['viewer_name'];
// Determine where to redirect based on $bid
if (isset($_GET['b']) && ($_GET['b'] == '0' || $_GET['b'] == NULL || $_GET['b'] == '')) {
header("Location: ../index.php");
exit();
} else if (isset($_GET['b'])) {
$bid = $_GET['b'];
header("Location: ../mains/blog.php?b=$bid");
exit();
} else {
// Default redirect if $bid is not set or invalid
header("Location: ../index.php");
exit();
}
} else {
$showAlert = "Password does not match";
}
} else {
$showAlert = "Email not found";
}
// Redirect with error message
header("Location: login.php?loginsuccess=false&error = " . urlencode($showAlert));
exit();
}
?>
это показывает мне ошибку Password does not match
. Я вставил новые данные, и мне показывает ту же ошибку.
Пожалуйста, объясните, как эта стена кода решит проблему. Ответы, содержащие только код, не являются хорошими ответами - Как ответить
Я бы рекомендовал избегать вложенных if
else
операторов, это значительно упростит ваш код и сделает его более понятным для вас и других.
В вашем скрипте есть ряд проблем:
$viewerEmail = $_POST['vEmail']; $viewerPass = $_POST['vPass']; $loginSql = "SELECT * FROM `viewers` WHERE `viewer_email`='$viewerEmail'";
Переменная $viewerEmail
никогда не экранируется, и злоумышленники могут этим воспользоваться.
Используйте следующее, чтобы обеспечить безопасность использования в запросе к базе данных:
$viewerEmail = mysqli_real_escape_string($conn, $_POST['vEmail']);
if (($bid=0) && ($bid=NULL) && ($bid='')) { header("Location: ../index?no_bid"); exist(); }
Вышеупомянутое устанавливает $bid
на 0
и оценивает ложно. Это означает, что он никогда не будет выполнен.
Вместо этого используйте empty($bid)
, так как он делает то, что вы хотите. Например:
if (empty($bid)) {
header("Location: ../index?no_bid");
exist();
}
$loginRow = mysqli_fetch_assoc($loginResult); ... $_SESSION['vid'] = $row['viewer_id']; $_SESSION['viewer_email'] = $row['viewer_email']; $_SESSION['viewer_name'] = $row['viewer_name'];
Переменная $row
никогда не определяется, ее следует обновить до $loginRow
.
Это более чистая версия вашего скрипта, которая может помочь все объяснить немного лучше:
<?php
/* only handle post requests */
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
exit();
}
/**
* Require database connection
* @var mysqli $conn
*/
require '../partials/_dbconnect.php';
/* Get possible request parameters */
$viewerEmail = $_POST['vEmail'];
$viewerPass = $_POST['vPass'];
$bid = $_GET['b'] ?? 0; // optionally set the bid
/* Fetch viewer from database */
$loginSql = "SELECT * FROM `viewers` WHERE `viewer_email`= ?";
$loginStmt = $conn->prepare($loginSql);
$loginStmt->bind_param('s', $loginEmail);
$loginEmail = $viewerEmail;
if (!$loginStmt->execute()) {
$error = urlencode('An error occurred');
header("Location: login?loginsuccess=false&error = {$error}");
exit();
}
$loginResult = $loginStmt->get_result();
$loginStmt->close();
/* Check if we got a user */
if (!$loginResult || $loginResult->num_rows < 1) {
$error = urlencode('Email not exist');
header("Location: login?loginsuccess=false&error = {$error}");
exit();
}
/* Get the user details */
$loginRow = $loginResult->fetch_assoc();
$loginResult->free();
if (!$loginRow) {
$error = urlencode('Email not exist');
header("Location: login?loginsuccess=false&error = {$error}");
exit();
}
/* verify the password */
if (!password_verify($viewerPass, $loginRow['viewer_pass'])) {
header("Location: login?loginsuccess=false&error=false");
exit();
}
/* Start and set login session data */
session_start();
$_SESSION['loggedin'] = true;
$_SESSION['vid'] = $loginRow['viewer_id'];
$_SESSION['viewer_email'] = $loginRow['viewer_email'];
$_SESSION['viewer_name'] = $loginRow['viewer_name'];
/* If for some reason the user is not logged in exit */
if (empty($_SESSION['loggedin'])) {
$error = urlencode('No authority');
header("Location: login?loginsuccess=false&error = {$error}");
exit();
}
/* If we have a bid, redirect to the blog */
if (!empty($bid)) {
header("Location: ../mains/blog?logininsuccess=true&b = {$bid}");
// exist();
exit();
}
/* If we get here, there is no bid and we can redirect to index */
header("Location: ../index?no_bid");
// exist();
exit();
mysqli_real_escape_string()
не следует рекомендовать. Им следует использовать подготовленные операторы с параметрами для защиты от SQL-инъекций.
Другая проблема с оператором if
заключается в том, что им следует использовать ||
, а не &&
.
@Jarryd Спасибо, брат. Я буду помнить ваши вещи в будущем, когда буду писать SQL
запросы.
@Barmar Спасибо за пересмотр запросов. Мне также было интересно, почему они использовали ||
вместо &&
. Еще хочу знать, что написать вместо mysqli_real_escape_string()
.
Ваш код открыт для SQL-инъекций