I am working on a blog with PHP, specially in order to practice OOP.
Since the blogging system will handle users, i thought that a Validation class would be a good idea in order to not repeat code for both login and signup validation.
So far it works, but as you may notice, i'm using static methods from other class here, the UsersTable class, and i feel this is a "code smell".
validation.php:
class Validation
{
private static $emailValidationRegex = '/^[^\s@]+@[^\s@]+\.[^\s@]+/';
public static function fieldIsEmpty($field)
{
return empty($field);
}
public static function validateEmail($email)
{
return preg_match(self::$emailValidationRegex, $email);
}
public static function usernameExists($username)
{
if (UsersTable::getUserByUsername($username))
{
return true;
}
return false;
}
public static function emailExists($email)
{
if (UsersTable::getUserByEmail($email))
{
return true;
}
return false;
}
public static function redirectUser($validUser)
{
if ($validUser)
{
header('Location: ../index.php');
}
else
{
header('Location: ../login-page.php');
}
}
public static function loginValidation($usernameOrEmail, $password)
{
$validUser = false;
if (!self::fieldIsEmpty($usernameOrEmail) && !self::fieldIsEmpty($password))
{
$user = null;
if (self::validateEmail($usernameOrEmail))
{
if (self::emailExists($usernameOrEmail))
{
$user = UsersTable::getUserByEmail($usernameOrEmail);
}
}
else
{
if (self::usernameExists($usernameOrEmail))
{
$user = UsersTable::getUserByUsername($usernameOrEmail);
}
}
if ($user !== null)
{
if (password_verify($password, $user['password']))
{
$validUser = true;
}
}
}
self::redirectUser($validUser);
}
public static function signupValidation($email, $username, $password,
$passwordConfirmation, $name)
{
echo 'Working so far!';
}
}
users-table.php:
class UsersTable
{
public static function getAllUsers()
{
$statement = "SELECT * FROM `users`";
$query = Database::query($statement);
if ($query)
{
return $query->fetchAll(PDO::FETCH_ASSOC);
}
}
public static function getUserByID($id)
{
$statement = "SELECT * FROM `users` WHERE `id` = '$id' "
. "LIMIT 1";
$query = Database::query($statement);
if ($query)
{
return $query->fetch(PDO::FETCH_ASSOC);
}
}
public static function getUserByEmail($email)
{
$statement = "SELECT * FROM `users` WHERE `email` = '$email' "
. "LIMIT 1";
$query = Database::query($statement);
if ($query)
{
return $query->fetch(PDO::FETCH_ASSOC);
}
}
public static function getUserByUsername($username)
{
$statement = "SELECT * FROM `users` WHERE `username` = '$username' "
. "LIMIT 1";
$query = Database::query($statement);
if ($query)
{
return $query->fetch(PDO::FETCH_ASSOC);
}
}
public static function addUser($name, $email, $username, $password)
{
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$statement = "INSERT INTO `users` (`name`, `email`, `username`, "
. " `password`) VALUES ('$name', '$email', '$username', "
. "'$hashedPassword')";
$query = Database::query($statement);
}
}
login.php:
require_once('../config.php');
require_once('database.php');
require_once('users-table.php');
require_once('validation.php');
Database::connect();
Validation::loginValidation($_POST['username-email'], $_POST['password']);