Эта тема на forum.dklab.ru


oberon: Не получается в инсерте
Народ, честное слово, не лень. Искал по книгам (скачал приличон из сети), искал тут. Ну нет ни одного нормального примера, хотя чувсивую, что ответ лежит где-то на поверхности.
Я НЕ МОГУ ПЕРЕДАТЬ В ИНСЕРТЕ ДАТУ ИЗ PHP В MYSQL! Ну не могу никак определить формат! Передаю и как текст ("12.10.2008" или "2008-01-02") или в формате timestamp... Поле в БД datetime. При попытке сохранения сохраняется "0000-00-00", хоть плач :(
Листинг программы:
// оба варианта подставлял уже. результат тот же фиговый :(
$date_date = date("Y-m-d", mktime(0, 0, 0, $Day, $Month, $Year));
$date_strtotime = strtotime($Day.".".$Month.".".$Year);
oberon: Вторая часть... первая случайно уже ушла наверх
$mysqli = new mysqli("localhost","root","","bs_prs");
if( mysqli_connect_errno() ){
die("Íåâîçìîæíî ïîäêëþ÷èòüñÿ: " . mysqli_connect_error());
exit;
}
$mysqli->query("SET NAMES cp1251");
$prepared_query = "insert into Member(user_name,password,email,sex,birthdate) values(?,?,?,?,?)";
$stmt = $mysqli->prepare($prepared_query);
$stmt->bind_param("sssid",$UserName,$Password1,$EMail,$Sex,$date_strtotime);
$stmt->execute();
$stmt->close();

Короче, подскажите, В КАКОМ ФОРМАТЕ мне надо подставлять переменную $date_strtotime, чтобы она записалась в поле типа datetime.
dimagolov:
YYYY-MM-DD вполне прокатит

только в кавычках оно должно быть, как строка
oberon:
Ура! Прокатило!
Время туда тоже можно дописать, если что? В смысле YYYY-MM-DD HH:MM;SS.MsMsMs типа "2008-01-05 23:59:59.997"?
Юрий Насретдинов:
Используйте обычный int для хранения даты, и вставляйте дату в формате unix time. Это намного проще и более гибко.
oberon:
Мне необходима часто дата намного ранее 1970 года. Это будет археологический форум. Юникс к сожалению не катит :(
dimagolov:
Юрий Насретдинов, datetime & timestamp в MySQL это два совершенно разных типа данных и конвертируются один в другой далеко не всегда.
oberon:
Согласен :) Да и мне надо даты намного ранешние, чем юникс понимает.
Если единственный способ - передача стрингом, то на этом и остановлюсь. Хорошо бы станадртные функции были б на эту тему... Форматирование данных даты ДЛЯ записи-чтения в/из БД. Ведь далеко не однозначно все трактуется в стрингах, когда локаль выдает совершенно разные форматы.
Ладно, будем бороться со змием сами :)
Спасибо за ответы
dimagolov:
oberon, для археологии стандартные типы данных скорее всего не подойдут вообще, так как сильно не уверен, что даже datetime сможет хранить даты в XV веке до н.э. поэтому настоятельно рекомендую эксперементом определить как далеко в прошлое вы сможет забраться, так как даже официальный ман не говорит особо определенно на эту тему http://dev.mysql.com/doc/refman/5.1/en/datetime.html. возможно, кроме даты надо будет хранить флаг BC/AC

п.с. все трактуется однозначно, как - читайте в мане, ссылку я дал

п.п.с. а совсем бронебойно хранить в bigint год (хватит и на диназавров как я понимаю и даже до создания земли, 64bit signed, т.е. 2^63-1 максимум лет в прошлое. ну а дату в годе можно хоть секундами, хоть милисекундами от начала года хранить.
oberon:
С динозаврами соглашусь. Вот только юникс не согласится. Ему автомобили ближе :) Он даже Монро уже не помнит. Только АББУ и Битлз немного :)
Будут ли стандартные функции преобразования меток времени юникса работать с такими бигинтовскими мостнарми? Вряд ли...
А насколько глубоко модно уйти в datetime я экспериментировал с MS SQL. Вперед точно до 31.12.9999. Назад до начала нашей эры. Для датировок до нашей эры такое поле вряд ли нужно, поскольку до нашей эры уже нет датировок с привязкой к месяцу, дню. Там только годы. Для этого хватит и простого интеджера.
Мне нужно поле datetime иочных датировок примерно с 14 века нашей эры.
dimagolov:
с такой постановкой должно прокатить, просто у даты будет 2 формата: BC (год) и AC (datetime)
oberon:
Правильно. Так и сделаю. Вопрос у меня был о передаче значения даты в базу. В MS SQL через Си++ я передавал внутренним форматом ctime, но в PHP подобных форматов просто нет. Теперь я ориентируюсь на передачу через стринг.
dimagolov:
oberon, забудьте про платформо-зависимый ужас в MS SQL / MSVC. Строки они на любой платформе строки, только кодировка правильная должна быть и все.
oberon:
Со строками мне все ясно. Кстати, с кодировками проблем мне еще хватит... Я работаю в немецкой винде, а проги делать под русские платформы надо :)
Я пытался выяснить нет ли возможности передавать дату из ропграммы в БД через ДРУГОЙ формат, кроме строкового. Как выяснилось, можно в int, но мне не подошло по причине малой величины юниксовой метки во глубину веков :)
Спасибо всем.
Думаю, тему можно закрывать :)

Эта тема на forum.dklab.ru