Formato de fecha de inserción PHP mysql
Estoy usando jQuery datepicker, el formato del datepicker es este08/25/2012
Tengo errores al insertar a mi base de datos inserta solo 0000-00-00 00 00 00
Mi código es:
<?php
$id = $_POST['id'];
$name = $_POST['name'];
$date = $_POST['date'];
$sql = mysql_query( "INSERT INTO user_date VALUE( '', '$name', '$date')" ) or die ( mysql_error() );
echo 'insert successful';
?>
Estoy seguro de que mi inserción es correcta.
Como se indica en Literales de fecha y hora :
MySQL reconoce
DATE
valores en estos formatos:
Como una cadena en formato
'YYYY-MM-DD'
o'YY-MM-DD'
. Se permite una sintaxis "relajada": se puede utilizar cualquier carácter de puntuación como delimitador entre las partes de la fecha. Por ejemplo,'2012-12-31'
,'2012/12/31'
,'2012^12^31'
y'2012@12@31'
son equivalentes.Como una cadena sin delimitadores en formato
'YYYYMMDD'
o'YYMMDD'
, siempre que la cadena tenga sentido como fecha. Por ejemplo,'20070523'
y'070523'
se interpreta como'2007-05-23'
, pero'071332'
es ilegal (tiene partes de mes y día sin sentido) y se convierte en'0000-00-00'
.Como un número en formato
YYYYMMDD
oYYMMDD
, siempre que el número tenga sentido como fecha. Por ejemplo,19830905
y830905
se interpretan como'1983-09-05'
.
Por lo tanto, la cadena '08/25/2012'
no es un literal de fecha MySQL válido. Tiene cuatro opciones (en un vago orden de preferencia, sin más información sobre sus requisitos):
Configure Datepicker para proporcionar fechas en un formato compatible usando
altField
junto con sualtFormat
opción :<input type="hidden" id="actualDate" name="actualDate"/>
$( "selector" ).datepicker({ altField : "#actualDate" altFormat: "yyyy-mm-dd" });
O, si está contento de que los usuarios vean la fecha en
YYYY-MM-DD
formato, simplemente configure ladateFormat
opción :$( "selector" ).datepicker({ dateFormat: "yyyy-mm-dd" });
Utilice la función de MySQL
STR_TO_DATE()
para convertir la cadena:INSERT INTO user_date VALUES ('', '$name', STR_TO_DATE('$date', '%m/%d/%Y'))
Convierta la cadena recibida de jQuery en algo que PHP entienda como una fecha, como un
DateTime
objeto:$dt = \DateTime::createFromFormat('m/d/Y', $_POST['date']);
y luego:
obtener una cadena con el formato adecuado:
$date = $dt->format('Y-m-d');
obtener la marca de tiempo UNIX:
$timestamp = $dt->getTimestamp();
que luego se pasa directamente a
FROM_UNIXTIME()
la función de MySQL:INSERT INTO user_date VALUES ('', '$name', FROM_UNIXTIME($timestamp))
Manipule manualmente la cadena para convertirla en un literal válido:
$parts = explode('/', $_POST['date']); $date = "$parts[2]-$parts[0]-$parts[1]";
Advertencia
Su código es vulnerable a la inyección SQL. Realmente debería utilizar declaraciones preparadas , a las que pasa sus variables como parámetros que no se evalúan para SQL. Si no sabes de qué estoy hablando o cómo solucionarlo, lee la historia de Bobby Tables .
Además, como se indica en la introducción al capítulo del manual de PHP sobre las
mysql_*
funciones:Esta extensión está obsoleta a partir de PHP 5.5.0 y no se recomienda para escribir código nuevo, ya que se eliminará en el futuro. En su lugar, se debe utilizar la extensión mysqli o PDO_MySQL . Consulte también la descripción general de la API de MySQL para obtener más ayuda al elegir una API de MySQL.
Parece que está utilizando una columna
DATETIME
oTIMESTAMP
para contener un valor de fecha; Le recomiendo que considere usarDATE
el tipo de MySQL en su lugar. Como se explica en LosDATE
,DATETIME
yTIMESTAMP
Tipos :El
DATE
tipo se utiliza para valores con una parte de fecha pero sin parte de hora. MySQL recupera y muestra valores de FECHA en'YYYY-MM-DD'
formato. El rango admitido es'1000-01-01'
de'9999-12-31'
.El
DATETIME
tipo se utiliza para valores que contienen partes de fecha y hora. MySQL recupera y muestraDATETIME
valores en'YYYY-MM-DD HH:MM:SS'
formato. El rango admitido es'1000-01-01 00:00:00'
de'9999-12-31 23:59:59'
.El
TIMESTAMP
tipo de datos se utiliza para valores que contienen partes de fecha y hora.TIMESTAMP
tiene un rango de'1970-01-01 00:00:01'
UTC a'2038-01-19 03:14:07'
UTC.
Deberías considerar crear una marca de tiempo a partir de esa fecha con mktime()
p.ej:
$date = explode('/', $_POST['date']);
$time = mktime(0,0,0,$date[0],$date[1],$date[2]);
$mysqldate = date( 'Y-m-d H:i:s', $time );