Formato de fecha de inserción PHP mysql

Resuelto Butternut asked hace 54 años • 11 respuestas

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.

Butternut avatar Jan 01 '70 08:01 Butternut
Aceptado

Como se indica en Literales de fecha y hora :

MySQL reconoce DATEvalores 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 YYYYMMDDo YYMMDD, siempre que el número tenga sentido como fecha. Por ejemplo, 19830905y 830905se 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):

  1. Configure Datepicker para proporcionar fechas en un formato compatible usando altFieldjunto con su altFormatopció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-DDformato, simplemente configure la dateFormatopción :

    $( "selector" ).datepicker({
        dateFormat: "yyyy-mm-dd"
    });
    
  2. 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'))
    
  3. Convierta la cadena recibida de jQuery en algo que PHP entienda como una fecha, como un DateTimeobjeto:

    $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))
      
  4. Manipule manualmente la cadena para convertirla en un literal válido:

    $parts = explode('/', $_POST['date']);
    $date  = "$parts[2]-$parts[0]-$parts[1]";
    

Advertencia

  1. 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 .

  2. 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.

  3. Parece que está utilizando una columna DATETIMEo TIMESTAMPpara contener un valor de fecha; Le recomiendo que considere usar DATEel tipo de MySQL en su lugar. Como se explica en Los DATE, DATETIMEy TIMESTAMPTipos :

    El DATEtipo 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 DATETIMEtipo se utiliza para valores que contienen partes de fecha y hora. MySQL recupera y muestra DATETIMEvalores 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 TIMESTAMPtipo de datos se utiliza para valores que contienen partes de fecha y hora. TIMESTAMPtiene un rango de '1970-01-01 00:00:01'UTC a '2038-01-19 03:14:07'UTC.

eggyal avatar Aug 25 '2012 08:08 eggyal

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 );
Mihai Iorga avatar Aug 25 '2012 08:08 Mihai Iorga