I'm writing a very simple CRUD application, and I'm wondering if the way I'm using static
methods throughout the code makes sense. I'd very much like to simplify the code if possible.
Any feedback and criticism is very much welcome!
<?php
class Database {
private const DB_DSN = "127.0.0.1";
private const DB_USER = "root";
private const DB_PASSWORD = "root";
private const DB_NAME = "testDB";
private const DB_PORT = 8889;
static function connect() {
return new PDO(
"mysql:host=".self::DB_DSN.";port=".self::DB_PORT.
";dbname=".self::DB_NAME,
self::DB_USER,
self::DB_PASSWORD,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION),
);
}
static function create() {
$pdo = new PDO(
"mysql:host=".self::DB_DSN.";port=".self::DB_PORT,
self::DB_USER,
self::DB_PASSWORD,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION),
);
$pdo->exec("CREATE DATABASE IF NOT EXISTS ".self::DB_NAME);
return self::connect();
}
}
class User {
private const TABLE_NAME = "users";
public $uid;
public $username;
public $email;
public $hash;
public $created;
public $verified;
public $pdo;
private function __construct() {
}
public static function signUp($pdo, $username, $email, $password) {
if (self::exists($pdo, $username)) {
return false;
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("INSERT INTO `users` SET `username`=?, `email`=?, `hash`=?");
$stmt->execute([$username, $email, $hash]);
return self::fromUId($pdo, $pdo->lastInsertId());
}
public static function login($pdo, $username, $password) {
if (!self::exists($pdo, $username)) {
return false;
}
$stmt = $pdo->prepare("SELECT * FROM `users` WHERE `username` = ?");
$stmt->execute([$username]);
$user = $stmt->fetchObject("User");
$user->pdo = $pdo;
return password_verify($password, $user->hash) ? $user : false;
}
public static function exists($pdo, $username) {
$stmt = $pdo->prepare("SELECT `uid` FROM `users` WHERE `username` = ?");
$stmt->execute([$username]);
return $stmt->fetch(PDO::FETCH_COLUMN);
}
public static function fromUId($pdo, $uid) {
$stmt = $pdo->prepare("SELECT * FROM `users` WHERE `uid` = ?");
$stmt->execute([$uid]);
$user = $stmt->fetchObject("User");
$user->pdo = $pdo;
return $user;
}
public function verify() {
$stmt = $this->pdo->prepare("UPDATE `users` SET `verified` = 1 WHERE `uid` = ?");
if ($stmt->execute([$this->uid])) {
$this->verified = true;
return true;
} else {
return false;
}
}
}
$db = Database::create();
$db->exec(
"CREATE TABLE IF NOT EXISTS `users` (
`uid` int NOT NULL PRIMARY KEY AUTO_INCREMENT,
`username` varchar(100) NOT NULL UNIQUE,
`email` varchar(100) NOT NULL UNIQUE,
`verified` boolean DEFAULT 0,
`hash` varchar(255) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
)"
);
$db->exec(
"CREATE TABLE IF NOT EXISTS `images` (
`id` int NOT NULL PRIMARY KEY AUTO_INCREMENT,
`uid` int NOT NULL,
`image` varchar(255) NOT NULL,
`like_count` int NOT NULL DEFAULT 0
)"
);
$user = User::signUp($db, 'JohnDoe', '[email protected]', '12345');
?>
User::verify()
used? \$\endgroup\$