UTC_TIMESTAMP() order by id desc limit 1', (string) $userId ); if (!$row || !isset($row['email_verifications'])) { return null; } return $row['email_verifications']; } public function findById(int $id): ?array { $row = DB::selectOne( 'select id, user_id, code_hash, expires_at, attempts, used_at from email_verifications where id = ? limit 1', (string) $id ); if (!$row || !isset($row['email_verifications'])) { return null; } return $row['email_verifications']; } public function incrementAttempts(int $id): bool { $result = DB::update( 'update email_verifications set attempts = attempts + 1 where id = ?', (string) $id ); return $result !== false; } public function markUsed(int $id): bool { $result = DB::update( 'update email_verifications set used_at = NOW() where id = ?', (string) $id ); return $result !== false; } }