Доброй ночи, хабровча... Пхпсушники!
Возникла одна странная проблема, и я ума не приложу, что не так...
CODE (
SQL):
скопировать код в буфер обмена
CREATE TABLE `logs` (
`type` tinyint(1) NOT NULL COMMENT '0 - лог авторизации, 1 лог банов, 2 - лог действий',
`ip` varchar(23) DEFAULT NULL,
`status` tinyint(1) DEFAULT NULL COMMENT '0 - ошибка, 1 - успех, 2 - автомат после регистрации, 3 - автомат после смены имейла',
`email` varchar(50) DEFAULT NULL,
`password` varchar(40) DEFAULT NULL,
`ban_action` tinyint(1) DEFAULT NULL COMMENT '0 - забанен, 1 - разбанен',
`user_target_id` int(11) NOT NULL,
`till` int(11) DEFAULT NULL,
`isPerm` tinyint(1) DEFAULT NULL,
`user_init_id` int(11) DEFAULT NULL,
`text` text,
`date` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
Работаю через PDO, всё стандартно: $db = new PDO(и далее по тексту);
Проблемная функция:
PHP:
скопировать код в буфер обмена
function log_ban($id, $reason, $till=null, $isPerm=null){
global $db;
$ban_action = (!is_null($till)) ? 0
: 1; //0 - забанен, 1 - разбанен $db->exec('INSERT INTO `logs` (`type`, `ban_action`, `user_target_id`, `till`, `isPerm`, `user_init_id`, `text`, `date`) VALUES (1, '.$ban_action.', '.$id.', '.$till.', '.$_SESSION['id'].', "'.$reason.'", '.time().')'); }
Запрос может быть, например, таким:
CODE (
SQL):
скопировать код в буфер обмена
INSERT INTO `logs` (`type`, `ban_action`, `user_target_id`, `till`, `isPerm`, `user_init_id`, `text`, `date`) VALUES (1, 0, 3, 1486682564, 0, 1, "Безо всякой причины", 1484004164)
И проблема в том, что этот запрос абсолютно корректен. Он выполняется в любом MySQL-менеджере (я, например, юзаю HeidiSQL). Affected rows: 1 Найденные строки: 0 Предупреждения: 0 Длительность 1 query: 0,172 sec.
Но при вызове самой функции этот запрос не выполняется. Не, может он и выполняется, но ничего не происходит, а сам запрос возвращает (bool) false.
Подскажите, пожалуйста, в чём дело?
P.S. Да, датувремя я храню таймштампом в поле INT, ибо так при выборке получаю тот же таймштамп, а не дату 'YmdHis', которую нужно парсить. Если есть варианты лучше - с радостью посмотрю
(Добавление)
Всё, нашёл: количество полей и вставляемых значений не совпадало ("`isPerm`" есть, а "'.$isPerm.', " - нет). Удивительно, почему не выдавалась ошибка...
Мелкий пишет:Le0_Nard пишет:а не дату 'YmdHis', которую нужно парсить
А нафига её парсить? Где-то дёрнуть date_format сразу в запросе, где-то: (new \Datetime($datefromdb))->format('...');
Пока для меня это самый простой способ работы с датой. Можно быстро делать всякие
И не только. Например, я работаю с часовыми поясами пользователей. И так намного проще: беру время, прибавляю часовой пояс (таймштамп. Отрицательный или положительный), и после этого загоняю в dsteparser (DateTime с плюшками). И это, в моем виденьи, самый короткий путь.
Единственный минус: хранить нужно в bigint, ибо время в int "закончится" где-то в 2038 году.