establecer la fecha en php antes de poner en una base de datos

Quiero poner la fecha de nacimiento de los usos en la base de datos ... así que escribí esta función:

      function setAge($day, $month, $year)
  {
      $date= strtotime("$day $month $year");

       mysql("UPDATE controlpanel
             SET date_of_birth=$date
             WHERE=".this->$userID) or die(mysql_error());
  }

No estoy seguro de si esto es correcto o la mejor manera de actualizar la fecha. La variable de campo es FECHA, .. No inserto fechas, solo la actualizo .. ¿Causará un error? ¿Es esta la mejor manera de poner una fecha de php a mysql?

preguntado el 08 de noviembre de 11 a las 10:11

6 Respuestas

Debe formatear la fecha en 'aaaa-mm-dd' para que su declaración SQL la inserte en MySQL.

respondido 08 nov., 11:15

Hay muchas cosas mal aquí.

  1. Su consulta tiene un formato incorrecto. No especifica qué campo está comparando en el WHERE cláusula. Necesitas hacer algo como WHERE userID = 123.

  2. No estás desinfectando tus valores. SIEMPRE SIEMPRE SIEMPRE utilice la función de filtrado adecuada en los datos de la consulta. Si no lo hace, está abierto a la inyección SQL. En este caso, probablemente desee utilizar mysql_real_escape_string().

  3. Su uso de strtotime() Está Mal. Puede formatearlo manualmente usando "{$year}-{$month}-{$day}".

Solo para enfatizar:

EN SERIO, DESINFECTE SUS DATOS ADECUADAMENTE. USTED WILL CONSIGUE HACKED.

respondido 08 nov., 11:15

las variables estarán seguras antes de que entren en la función no se preocupe ... lo notó con agrado ... fue un error poner año, mes, fecha - Con gran éxito

SIEMPRE es mejor desinfectar en el sitio de la consulta, en lugar de depender de otras partes del código que hagan la desinfección por usted. Significa que solo debe acordarse de desinfectar una vez, en lugar de cada vez que desee utilizar esa función. También hace que su código sea más fácil de leer, ya que está libre de molestas variables temporales que contienen versiones desinfectadas de sus datos. - Polinomio

mysql_query( "UPDATE `controlpanel`
                 SET `date_of_birth`='".$year."-".$month."-".$day."'
                 WHERE `userid`=".this->$userID);

Hay bastantes errores de código en su código. ¿Intentaste siquiera ejecutarlo?
De todos modos, este código elimina la necesidad de strtotime llamada.

respondido 08 nov., 11:15

No necesita una función personalizada ya que PHP tiene funciones de fecha predefinidas.

$date= date("Y-m-d", strtotime(mktime(0, 0, 0, $month, $day, $year)));

Puede usar strtotime () si lo desea.

consulte la documentación para obtener más detalles http://php.net/manual/en/function.mktime.php

respondido 08 nov., 11:15

Ya tienes día, mes y año desde el principio. No es necesario convertir a la marca de tiempo de Unix. No es un error incorrecto, es algo redundante. - Álvaro González

kolink es correcto ... en la fecha de la base de datos, el formato de tipo de datos es año-mes-día, también puede almacenar la fecha y la hora en la marca de tiempo, será más fácil de manejar ... a través de la marca de tiempo puede manejar la fecha y la hora de manera más flexible ...

respondido 08 nov., 11:15

Mal consejo. Los tipos de datos existen por una razón. Si maneja las fechas como números enteros, simplemente lo está haciendo más difícil sin una buena razón. - Álvaro González

Si observa el manual de PHP, verá que strtotime () devuelve un entero, más específicamente un Marca de tiempo de Unix. Si observa el manual de MySQL, verá que FECHA las columnas se manejan como instrumentos de cuerda.

Además de leer la documentación, puede ver que algo anda mal con una depuración simple. Si imprime su consulta con var_dump () y ejecútelo en su cliente MySQL favorito, verá que su fila se actualiza con un valor no válido (o recibe un mensaje de error, según la configuración del servidor).

Ahora, hay muchas formas de crear una cadena con el formato adecuado. Parece que tiene los componentes individuales guardados en variables PHP, por lo que puede usar sprintf ():

sprintf('%04d-%02d-%02d', $year, $month, $day)

Actualizar: Estoy agregando algunas otras versiones para complacer a @Col. Metralla:

sprintf('%s-%s-%s', $year, $month, $day)
"$year-$month-$day"
$year . '-' . $month . '-' . $day

respondido 08 nov., 11:16

@ Coronel Metralla - sprintf() es una forma práctica de generar una cadena con un formato fijo. Se encarga de convertir a enteros y agregar ceros iniciales según sea necesario y, a veces, es más limpio que la concatenación de cadenas sin procesar. Pensé que lo sabrías con 27K rep ;-P - Álvaro González

¿Qué sentido tiene agregar ceros al año? y en casting tambien? si desea validar su fecha, use checkdate () primero; hará la parte de validación explícitamente, no silenciosamente con un posible resultado erróneo como sprintf (). - Tu sentido común

@ Col.Shrapnel - He actualizado mi respuesta. Sé que no debería importarme, pero es solo que no quiero dar la peor respuesta en seis cuando soy el único que se preocupó por explicar por qué el código del OP era incorrecto y vincularlo a los capítulos del manual correspondientes. - Álvaro González

Gracias. la variante "$ año- $ mes- $ día" es la más natural de todos ellos. - Tu sentido común

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.