Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Вопрос по MySQL


Автор: aktuba 22.8.2007, 12:14
Есть таблица в базе. В таблице есть поле, тип DATETIME. Хочу туда занести дату время, делаю следующее:
Код

$date=time();
$sql="INSERT INTO tbltemp VALUES(NULL, '$date')";
mysql_query($sql);


Не работает. Заносятся нули. Почему?

Автор: Rigel 22.8.2007, 12:26
Цитата(aktuba @ 22.8.2007,  12:14)
Есть таблица в базе. В таблице есть поле, тип DATETIME. Хочу туда занести дату время, делаю следующее:
Код

$date=time();
$sql="INSERT INTO tbltemp VALUES(NULL, '$date')";
mysql_query($sql);


Не работает. Заносятся нули. Почему?

Я не знаю всю структуру таблицы, однако сильно подозреваю, что твое поле стоит не вторым... Пиши лучше так:
$sql="INSERT INTO `tbltemp` (field, date) VALUES('$wr',NOW())";
И будет тебе щастье...

Автор: aktuba 22.8.2007, 12:31
Цитата

Я не знаю всю структуру таблицы, однако сильно подозреваю, что твое поле стоит не вторым... Пиши лучше так:
$sql="INSERT INTO `tbltemp` (field, date) VALUES('$wr',NOW())";
И будет тебе щастье... 


Да суть не в этом. Да, оно не второе, но до него и после все нормально вставляется, а именно оно нет. Полный запрос выглядит примерно так:
Код

function dosql($login,$pass,$str) {
$md5=md5($pass);
$date=time();
$sql="INSERT INTO tbltemp(id,login,passwd,date,str) VALUES(NULL,'$login','$md5','$date','$str')";
}

Автор: Rigel 22.8.2007, 12:37
Цитата(aktuba @ 22.8.2007,  12:31)
Цитата

Я не знаю всю структуру таблицы, однако сильно подозреваю, что твое поле стоит не вторым... Пиши лучше так:
$sql="INSERT INTO `tbltemp` (field, date) VALUES('$wr',NOW())";
И будет тебе щастье... 


Да суть не в этом. Да, оно не второе, но до него и после все нормально вставляется, а именно оно нет. Полный запрос выглядит примерно так:
Код

function dosql($login,$pass,$str) {
$md5=md5($pass);
$date=time();
$sql="INSERT INTO tbltemp(id,login,passwd,date,str) VALUES(NULL,'$login','$md5','$date','$str')";
}

Значит, формат даты в переменной неверный. Если нужно вставить дату текущего момента, напиши так, как я показал в предыдущем письме - команда NOW()

Автор: silverghost 22.8.2007, 14:55
Если не нравится формат то можно и так 
Код

$sqli1 = "INSERT INTO themes VALUES('$uid', '$header', ' ".date("d.m.Y h:i")." ')";

Автор: -=Ustas=- 22.8.2007, 16:25
Цитата(aktuba @  22.8.2007,  12:14 Найти цитируемый пост)
Есть таблица в базе. В таблице есть поле, тип DATETIME. Хочу туда занести дату время, делаю следующее:

У тебя в SQL запросе несовпадение типов, т.к. ты пихаешь в это поле целое число
Код

$date=time();

Лучше всего, ( если тебе не нужно будет вычислять даты рождения в полях дат) используй тип INT, забивай туда даты как time() ( т.е. интеджер ) и не будет у тебя никаких проблем.

Автор: aktuba 22.8.2007, 17:51
-=Ustas=-, спасибо за подробное объяснение. +

Автор: BrainWorker 22.8.2007, 18:03
Цитата(aktuba @ 22.8.2007,  12:31)
Да суть не в этом. Да, оно не второе, но до него и после все нормально вставляется, а именно оно нет. Полный запрос выглядит примерно так:
Код

function dosql($login,$pass,$str) {
$md5=md5($pass);
$date=time();
$sql="INSERT INTO tbltemp(id,login,passwd,date,str) VALUES(NULL,'$login','$md5','$date','$str')";
}

Ты в своем запросе полю id (как я понимаю это первичный ключ) ставишь значени NULL!
Если ты полагаешься на автоматическую генерация ключа при создании новой записи, то не указывай id в списке полей запроса INSERT, но если указываешь, то указывай разумные и допустимые значения.

ID не может быть NULL ПО ОПРЕДЕЛЕНИЮ

Автор: sw04 23.8.2007, 00:20
Код

function dosql($login,$pass,$str) {
$sql="INSERT INTO tbltemp SET login='".$login."',
                                           passwd='".md5($md5)."',
                                           date='".time()."',
                                           str='".$str."';");
}

почему бы не так?

Автор: SelenIT 23.8.2007, 01:11
Цитата(-=Ustas=- @  22.8.2007,  16:25 Найти цитируемый пост)
в SQL запросе несовпадение типов, т.к. ты пихаешь в это поле целое число


-=Ustas=-, т.е. если в DATETIME-поле сунуть число, например, 20070823 или 20070823125959, то в итоге из-за несовпадения типов запишется дата 0000-00-00 00:00:00? В каких случаях и для каких типов таблиц это так (только что поэкспериментировал с MyISAM - не воспроизвелось, записалась сегодняшняя дата...)? Ни в коей мере не хочу снова поднять холивор на тему "INT vs. DATETIME", просто спрашиваю;)

Автор: Severyanin 23.8.2007, 07:37
Для MyISAM вообще обычно выдает ошибку записи - несовпадение типов, и не записывает ничего. Оператор INSERT  не выполняется.

Автор: sTa1kEr 23.8.2007, 09:08
Цитата(SelenIT @  23.8.2007,  01:11 Найти цитируемый пост)
 т.е. если в DATETIME-поле сунуть число, например, 20070823 или 20070823125959, то в итоге из-за несовпадения типов запишется дата 0000-00-00 00:00:00? В каких случаях и для каких типов таблиц это так (только что поэкспериментировал с MyISAM - не воспроизвелось, записалась сегодняшняя дата...)?

Нет, во всех типах таблицах все будет записываться корректно, если, конечно, формат верный и mysql удастся распарсить число. http://dev.mysql.com/doc/refman/4.1/en/datetime.html - здесь все подробно расписано как работает MySQL с датами.
Цитата

As a number in either YYYYMMDDHHMMSS or YYMMDDHHMMSS format, provided that the number makes sense as a date. For example, 19830905132800 and 830905132800 are interpreted as '1983-09-05 13:28:00'. 
As a number in either YYYYMMDD or YYMMDD format, provided that the number makes sense as a date. For example, 19830905 and 830905 are interpreted as '1983-09-05'. 

Цитата

Illegal DATETIME, DATE, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00 00:00:00', '0000-00-00', or 00000000000000). 

Единственный момент, когда могут быть проблемы с датами - это при работе через pdo_mysql с Prepared Statements. При биндинге даты она должна быть формата YYYY-MM-DD HH:MM:SS. Хотя это могли уже поправить, я не проверял.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)