sql server - Login.php redirects to homepage instead of the header location

I am trying to make a notice board where only the admin can login and post updates(for a school) and I am very new to php. My code works fine in MAMP server on mac, but when I upload it to the 000webhost.com for testing purposes, it does not redirect to the correct page after login and redirects to the index.php page.
Here is my code. I did session_start in my conf.php file.
<?php
// Check if the user is already logged in, if yes then redirect him to welcome page
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true) {
header('location: logout.php');
exit;
}
//check if not authorized
// Include config file
require_once '../conf.php';
// Define variables and initialize with empty values
$email = $password = '';
$email_err = $password_err = '';
// Processing form data when form is submitted
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Check if email is empty
if (empty(trim($_POST['email']))) {
$email_err = 'Please enter email.';
} else {
$email = trim($_POST['email']);
}
// Check if password is empty
if (empty(trim($_POST['password']))) {
$password_err = 'Please enter your password.';
} else {
$password = trim($_POST['password']);
}
// Validate credentials
if (empty($email_err) && empty($password_err)) {
// Prepare a select statement
$sql = 'SELECT id, email, password FROM users WHERE email = ?';
if ($stmt = mysqli_prepare($link, $sql)) {
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, 's', $param_email);
// Set parameters
$param_email = $email;
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($stmt)) {
// Store result
mysqli_stmt_store_result($stmt);
// Check if email exists, if yes then verify password
if (mysqli_stmt_num_rows($stmt) == 1) {
// Bind result variables
mysqli_stmt_bind_result($stmt, $id, $email, $hashed_password);
if (mysqli_stmt_fetch($stmt)) {
//if ( password_verify( $password, $hashed_password ) ) {
if (($password == $hashed_password)) {
// Password is correct, so start a new session
//session_start();
// Store data in session variables
$_SESSION['loggedin'] = true;
$_SESSION['id'] = $id;
$_SESSION['email'] = $email;
// Redirect user to welcome page
header('Location: add_notice.php');
} else {
// Display an error message if password is not valid
$password_err = 'The password you entered was not valid.';
}
}
} else {
// Display an error message if email doesn't exist
$email_err = 'No account found with that email.';
}
} else {
echo 'Oops! Something went wrong. Please try again later.';
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Close connection
mysqli_close($link);
}
?>
Please help me with it. I would appreciate it a lot.
Answer
Solution:
Just to close off the question...
If you are callingsession_start()
in the conf.php file then it needs to be included before any call for$_SESSION[]
variables.
Right now you are checking for$_SESSION['loggedin']
before initialising the$_SESSION
variables withsession_start()
.
Move require_once '../conf.php'; above that if statement and it will work e.g.
<?php
// Include config file
require_once '../conf.php';
// Check if the user is already logged in, if yes then redirect him to welcome page
if (isset($_SESSION['loggedin']) && $_SESSION['loggedin'] === true) {
header('location: logout.php');
exit;
}
//check if not authorized
// Define variables and initialize with empty values
$email = $password = '';
$email_err = $password_err = '';
// Processing form data when form is submitted
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Check if email is empty
if (empty(trim($_POST['email']))) {
$email_err = 'Please enter email.';
} else {
$email = trim($_POST['email']);
}
// Check if password is empty
if (empty(trim($_POST['password']))) {
$password_err = 'Please enter your password.';
} else {
$password = trim($_POST['password']);
}
// Validate credentials
if (empty($email_err) && empty($password_err)) {
// Prepare a select statement
$sql = 'SELECT id, email, password FROM users WHERE email = ?';
if ($stmt = mysqli_prepare($link, $sql)) {
// Bind variables to the prepared statement as parameters
mysqli_stmt_bind_param($stmt, 's', $param_email);
// Set parameters
$param_email = $email;
// Attempt to execute the prepared statement
if (mysqli_stmt_execute($stmt)) {
// Store result
mysqli_stmt_store_result($stmt);
// Check if email exists, if yes then verify password
if (mysqli_stmt_num_rows($stmt) == 1) {
// Bind result variables
mysqli_stmt_bind_result($stmt, $id, $email, $hashed_password);
if (mysqli_stmt_fetch($stmt)) {
//if ( password_verify( $password, $hashed_password ) ) {
if (($password == $hashed_password)) {
// Password is correct, so start a new session
//session_start();
// Store data in session variables
$_SESSION['loggedin'] = true;
$_SESSION['id'] = $id;
$_SESSION['email'] = $email;
// Redirect user to welcome page
header('Location: add_notice.php');
} else {
// Display an error message if password is not valid
$password_err = 'The password you entered was not valid.';
}
}
} else {
// Display an error message if email doesn't exist
$email_err = 'No account found with that email.';
}
} else {
echo 'Oops! Something went wrong. Please try again later.';
}
// Close statement
mysqli_stmt_close($stmt);
}
}
// Close connection
mysqli_close($link);
}
?>
Share solution ↓
Additional Information:
Link To Answer People are also looking for solutions of the problem: a non-numeric value encountered in
Didn't find the answer?
Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.
Similar questions
Find the answer in similar questions on our website.
Write quick answer
Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.