Jak stwierdzono w Literały daty i czasu :
MySQL rozpoznaje DATE
wartości w tych formatach:
-
Jako ciąg w
'RRRR-MM-DD'
lub'RR-MM-DD'
format. Dozwolona jest „zrelaksowana” składnia:Dowolny znak interpunkcyjny może być użyty jako ogranicznik między częściami daty. Na przykład'2012-12-31'
,'31.12.2012'
,'2012^12^31'
oraz'[email protected] @31'
są równoważne. -
Jako ciąg bez ograniczników w
'RRRRMMDD'
lub'RRMMDD'
format, pod warunkiem, że ciąg ma sens jako data. Na przykład'20070523'
i'070523'
są interpretowane jako'2007-05-23'
, ale'071332'
jest nielegalne (ma bezsensowne części miesiąca i dnia) i staje się'0000-00-00'
. -
Jako liczba w
RRRRMMDD
lubRRMMDD
format, pod warunkiem, że liczba ma sens jako data. Na przykład19830905
i830905
są interpretowane jako'1983-09-05'
.
Dlatego ciąg '08/25/2012'
nie jest prawidłowym literałem daty MySQL. Masz cztery opcje (w niejasnej kolejności preferencji, bez żadnych dalszych informacji o twoich wymaganiach):
-
Skonfiguruj Datepicker, aby dostarczał daty w obsługiwanym formacie, używając
altField
wraz z jegoaltFormat
opcja :<input type="hidden" id="actualDate" name="actualDate"/>
$( "selector" ).datepicker({ altField : "#actualDate" altFormat: "yyyy-mm-dd" });
Lub, jeśli chcesz, aby użytkownicy widzieli datę w
RRRR-MM-DD
po prostu ustawdateFormat
opcja zamiast tego:$( "selector" ).datepicker({ dateFormat: "yyyy-mm-dd" });
-
Użyj
STR_TO_DATE( )
funkcja do konwersji ciągu:INSERT INTO user_date VALUES ('', '$name', STR_TO_DATE('$date', '%m/%d/%Y'))
-
Przekształć ciąg otrzymany z jQuery na coś, co PHP rozumie jako datę, na przykład
DateTime
obiekt:$dt = \DateTime::createFromFormat('m/d/Y', $_POST['date']);
a potem albo:
-
uzyskaj odpowiednio sformatowany ciąg:
$date = $dt->format('Y-m-d');
-
uzyskaj znacznik czasu UNIX:
$timestamp = $dt->getTimestamp();
który jest następnie przekazywany bezpośrednio do
FROM_UNIXTIME()
funkcja:INSERT INTO user_date VALUES ('', '$name', FROM_UNIXTIME($timestamp))
-
-
Ręcznie zmień ciąg na prawidłowy literał:
$parts = explode('/', $_POST['date']); $date = "$parts[2]-$parts[0]-$parts[1]";
Ostrzeżenie
-
Twój kod jest podatny na wstrzyknięcie SQL. Ty naprawdę powinien używać przygotowanych wyciągów , do którego przekazujesz zmienne jako parametry, które nie są oceniane pod kątem SQL. Jeśli nie wiesz, o czym mówię lub jak to naprawić, przeczytaj historię Tabele Bobby .
-
Ponadto, jak stwierdzono w wstępie do rozdziału podręcznika PHP na temat
mysql_*
funkcje:To rozszerzenie jest przestarzałe od PHP 5.5.0 i nie jest zalecane do pisania nowego kodu, ponieważ zostanie usunięte w przyszłości. Zamiast tego albo mysqli lub PDO_MySQL należy użyć rozszerzenia. Zobacz także Omówienie interfejsu API MySQL aby uzyskać dalszą pomoc przy wyborze interfejsu API MySQL.
-
Wygląda na to, że używasz
DATETIME
lubTIMESTAMP
kolumna do przechowywania wartości daty; Zalecam rozważenie użyciaDATE
MySQL zamiast tego wpisz. Jak wyjaśniono wDATE
,DATETIME
iTIMESTAMP
Rodzaje :DATA
typ jest używany dla wartości z częścią daty, ale bez części czasu. MySQL pobiera i wyświetla wartości DATE w'RRRR-MM-DD'
format. Obsługiwany zakres to'1000-01-01'
do'9999-12-31'
.DATETIME
type jest używany dla wartości, które zawierają zarówno części daty, jak i godziny. MySQL pobiera i wyświetlaDATETIME
wartości w'RRRR-MM-DD GG:MM:SS'
format. Obsługiwany zakres to'1000-01-01 00:00:00'
do'9999-12-31 23:59:59'
.TIMESTAMP
typ danych jest używany dla wartości, które zawierają zarówno części daty, jak i godziny.ZNACZNIK CZASOWY
ma zakres'1970-01-01 00:00:01'
UTC do'2038-01-19 03:14:07'
UTC.