Ответ 1
Как указано в Литература даты и времени:
MySQL распознает
DATE
значения в этих форматах:
Как строка в формате
'YYYY-MM-DD'
или'YY-MM-DD'
. Разрешен "расслабленный" синтаксис: любой символ пунктуации может использоваться как разделитель между частями даты. Например,'2012-12-31'
,'2012/12/31'
,'2012^12^31'
и'[email protected]@31'
эквивалентны.Как строка без разделителей в формате
'YYYYMMDD'
или'YYMMDD'
при условии, что строка имеет смысл в качестве даты. Например,'20070523'
и'070523'
интерпретируются как'2007-05-23'
, но'071332'
является незаконным (он имеет бессмысленные месячные и дневные части) и становится'0000-00-00'
.Как число в формате
YYYYMMDD
илиYYMMDD
, при условии, что число имеет смысл в качестве даты. Например,19830905
и830905
интерпретируются как'1983-09-05'
.
Следовательно, строка '08/25/2012'
не является допустимым литералом даты MySQL. У вас есть четыре варианта (в каком-то неопределенном порядке предпочтения, без дополнительной информации о ваших требованиях):
-
Настройте Datepicker для предоставления дат в поддерживаемом формате с помощью
altField
вместе сaltFormat
:<input type="hidden" id="actualDate" name="actualDate"/>
$( "selector" ).datepicker({ altField : "#actualDate" altFormat: "yyyy-mm-dd" });
Или, если вы довольны тем, что пользователи видят дату в формате
YYYY-MM-DD
, просто установите вместо параметраdateFormat
:$( "selector" ).datepicker({ dateFormat: "yyyy-mm-dd" });
-
Используйте функцию MySQL
STR_TO_DATE()
для преобразования строки:INSERT INTO user_date VALUES ('', '$name', STR_TO_DATE('$date', '%m/%d/%Y'))
-
Преобразуйте строку, полученную из jQuery, в то, что PHP понимает как дату, например объект
DateTime
:$dt = \DateTime::createFromFormat('m/d/Y', $_POST['date']);
а затем либо:
-
получить подходящую форматированную строку:
$date = $dt->format('Y-m-d');
-
получить временную метку UNIX:
$timestamp = $dt->getTimestamp();
который затем передается непосредственно в MySQL
FROM_UNIXTIME()
:INSERT INTO user_date VALUES ('', '$name', FROM_UNIXTIME($timestamp))
-
-
Вручную введите строку в действительный литерал:
$parts = explode('/', $_POST['date']); $date = "$parts[2]-$parts[0]-$parts[1]";
Предупреждение
-
Ваш код уязвим для SQL-инъекции. Вы действительно должны использовать подготовленные заявления, в которые вы передаете свои переменные как параметры, которые не оцениваются для SQL. Если вы не знаете, о чем я говорю, или как это исправить, прочитайте историю Bobby Tables.
-
Также, как указано в введение в главах руководства PHP по функциям
mysql_*
:Это расширение устарело с PHP 5.5.0 и не рекомендуется для написания нового кода, поскольку оно будет удалено в будущем. Вместо этого расширение mysqli или PDO_MySQL должно быть используемый. См. Также Обзор API MySQL для дальнейшей помощи при выборе API MySQL.
-
Кажется, вы используете столбец
DateTime
илиTIMESTAMP
для хранения значения даты; Я рекомендую вам вместо этого использовать MySQLDATE
. Как описано вDATE
,DateTime
иTIMESTAMP
Типы:Тип
DATE
используется для значений с частью даты, но без временной части. MySQL извлекает и отображает значения DATE в формате'YYYY-MM-DD'
. Поддерживаемый диапазон составляет от'1000-01-01'
до'9999-12-31'
.Тип
DateTime
используется для значений, содержащих как дату, так и время. MySQL извлекает и отображает значенияDateTime
в формате'YYYY-MM-DD HH:MM:SS'
. Поддерживаемый диапазон составляет от'1000-01-01 00:00:00'
до'9999-12-31 23:59:59'
.Тип данных
TIMESTAMP
используется для значений, содержащих как дату, так и время.TIMESTAMP
имеет диапазон'1970-01-01 00:00:01'
UTC до'2038-01-19 03:14:07'
UTC.