I am creating a website with three types of users:
-those who are registered and are subscribed for current month -those that are registered, but are not subscribed for current month -users that are not registered (you cant be subscribed if you are not regitered)
I have created code that identifies these 3 kinds of users and acts accordingly. My question is, is that so? Iβve never done this before. Or should I reprogram my approach?
//login.php
//connect to database and see if a user and password combination exists. Store $exists=0 if not, and $exists=1 if it exists. session_start(); $conn = new mysqli($hn,$un,$pw,$db); if ($conn->connect_error){ die($conn->connect_error); } $query = "SELECT COUNT(1) as 'exists',expiration_date FROM table WHERE email = ? AND password = ?;"; $stmt = $conn->prepare($query); $stmt->bind_param("ss", $email, $password); $email = $_POST["email"]; $password = hash("hashingalgorithm", "salt".$_POST["password"]."salthere"); $stmt->execute(); /* Get the result */ $result = $stmt->get_result(); $num_of_rows = $result->num_rows; $row = $result->fetch_assoc(); $exists = $row["exists"]; $expiration_date = $row["expiration_date"]; /* free results */ $stmt->free_result(); /* close statement */ $stmt->close(); $conn->close(); date_default_timezone_set('Europe/Berlin'); if ($exists==0){ echo "Wrong email or password"; $_SESSION['loginerror'] = 2; header('Location: https://www.homepage.com/login'); }else if ($exists){ if (strtotime($expiration_date) < (strtotime("now"))){//logged in, but not subscribed session_destroy(); session_start(); $_SESSION["authenticated"] = true; header('Location: https://www.homepage.com'); }else{//logged in and ready to go $_SESSION["authenticated"] = true; $_SESSION["email"] = $email; header('Location: https://www.homepage.com'); } }else{ echo "An error with has occured."; }
Then on every page of my website I use this code to see which user visited me.
session_start(); if(isset($_SESSION["authenticated"]) && isset($_SESSION["email"])){ $email = $_SESSION["email"]; //connect to database and fetch expiration_date for a user with $email. Store it in $expiration_date $conn = new mysqli($hn,$un,$pw,$db); if ($conn->connect_error){ die($conn->connect_error); } $query = "SELECT expiration_date FROM table WHERE email = ?;"; $stmt = $conn->prepare($query); $stmt->bind_param("s", $email); $email = $_SESSION["email"]; $stmt->execute(); /* Get the result */ $result = $stmt->get_result(); $num_of_rows = $result->num_rows; $row = $result->fetch_assoc(); $expiration_date = $row["expiration_date"]; /* free results */ $stmt->free_result(); /* close statement */ $stmt->close(); $conn->close(); date_default_timezone_set('Europe/Berlin'); if (strtotime($expiration_date) < (strtotime("now"))){//logged in, but not subscribed session_destroy(); session_start(); $_SESSION["authenticated"] = true; header('Location: https://www.homepage.com'); }else{ //html for subsribed and registered user echo <<<_END //html here _END; } }else if(isset($_SESSION["authenticated"]) && !isset($_SESSION["email"])){ // user is logged in, but not subscribed; echo <<<_END //htmlhere _END; }else{// user is not registered nor is subscribed echo <<<_END //htmlhere _END; }
The code works, but I'm worried about accessing the database on every page after user registration and signing. I actually punish users for registering and subscribing. Is there a more efficient, effective way to solve this problem?
php login session
sanjihan
source share