Предостережение
Необходимо отметить, что PHP сохраняет значения типа integer какзнаковые с машинно-зависимым размером (C тип long). Все числа, переданные как integer, но выходящие за границы этого типа будут сохранены с типом float. При упаковке этих float как integer, они будут переданы с типом integer. Это может как совпадать, так и нет с заданным шаблоном.
Наиболее частым является случай, когда упаковываются беззнаковые числа типа integer. В системах, где integer имеет размер в 32 бита, число обычно передается по тому же шаблону, как если бы integer был беззнаковым (хотя, это зависит от определенных преобразований из знаковое в беззнаковое, согласно стандарту С). В системах, где тип integer имеет размер в 64 бита, тип float не имеет мантиссы, достаточной по размеру для хранения значения без потери точности. Если эти системы также имеют простой 64-битный С тип int (большинство UNIX систем не имеют), то единственным путем для использования формата I в верхнем разряде является создание отрицательных integer значений с тем же представлением как и в определенном беззнаковом значении.
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`email` varchar(255) NOT NULL,
`login` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`last_login` int(11) UNSIGNED,
PRIMARY KEY (`id`),
UNIQUE KEY `login` (`login`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `user_tokens` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` int(11) UNSIGNED NOT NULL,
`user_agent` varchar(255) NOT NULL,
`token` varchar(255) NOT NULL,
`created` int(11) UNSIGNED NOT NULL,
`expires` int(11) UNSIGNED NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `token` (`token`),
KEY `fk_user_id` (`user_id`),
KEY `expires` (`expires`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `user_tokens`
ADD CONSTRAINT `user_tokens_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE;
$view = function (string $viewFile, array $viewData) {
extract($viewData, EXTR_SKIP);
ob_start();
try {
include $viewFile;
} catch (Throwable $e) {
ob_end_clean();
throw new RuntimeException('Render error', 0, $e);
}
return ob_get_clean();
};
echo $view(
'layouts/main.php',
['main_content' => $view('pages/' . $page . '.php', $data), 'meta' => [], 'widgets' => []]
);