Un valor numérico no bien formado encontrado


120

Tengo un formulario que pasa dos fechas (inicio y finalización) a un script PHP que las agregará a una base de datos. Tengo problemas para validar esto. Sigo recibiendo los siguientes errores

Un valor numérico no bien formado encontrado

Aquí es cuando uso lo siguiente

date("d",$_GET['start_date']);

Pero cuando uso la función strtotime () como lo recomiendan muchos sitios, obtengo una fecha de marca de tiempo de Unix de 1/1/1970. ¿Alguna idea de cómo puedo obtener la fecha correcta?


5
Necesitas publicar lo que $_GET['start_date']contiene.
JohnP

1
Supongo que su $_GET['start_date']no es una marca de tiempo que se espera por datefunción como segundo argumento
Nemoden

La segunda respuesta de DChaplin es más apropiada en este caso
cw24

Obtuve esto al intentar seleccionar de una mesa a la que no me había unido ...
Connor Leech

Respuestas:


225

Porque está pasando una cadena como segundo argumento a la función de fecha, que debería ser un número entero.

cadena fecha (cadena $ formato [, int $ marca de tiempo = hora ()])

Pruebe strtotime, que analizará cualquier descripción textual de fecha y hora en inglés en una marca de tiempo de Unix (entero):

date("d", strtotime($_GET['start_date']));

1
Recibo el mismo error en el constructor de una clase, estaba depurando y el problema en ese constructor es que estoy recibiendo como parámetro y enteropublic function __construct(int $someId....)
Marcos Di Paolo

Con la escritura de parámetros en PHP cada vez más la 'norma', lo que @MarcosDiPaolo mencionó definitivamente se verá con más frecuencia. Un indicio es que el seguimiento de la pila apuntará a la línea de la declaración del parámetro que se está escribiendo incorrectamente.
tortuga a tiempo parcial

Todavía no entiendo cuál es el curso de acción aquí @parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo los tipos de parámetros que le pasa a ese constructor deben coincidir con los tipos que se insinúan en la definición de la función. "4" representado por una cadena es diferente de 4 representado por un número entero. Por lo tanto, cumpla con la definición de la función o desactive los tipos estrictos, si realmente necesita fusionar valores 'similares', por ejemplo, la cadena "4" con el entero 4.
parttimeturtle

9

Simplemente puede resolver este problema usando la strtotime()función.

date("d", strtotime($_GET['start_date']));

7

$_GET['start_date']no es numérico es mi apuesta, pero un formato de fecha no es compatible con strtotime. Deberá volver a formatear la fecha a un formato viable para strtotime o usar una combinación de explode / mktime .

Podría agregarle un ejemplo si tuviera la amabilidad de publicar el formato que recibe actualmente.


La transmisión no solucionará el problema, ya que PHP la transmitirá automáticamente cuando se pase al método.
JohnP

5

Me encontré con esta misma situación (en mi caso con un valor de fecha en un campo PHP personalizado en una vista de Drupal), y lo que funcionó para mí fue usar intval en lugar de strtotime para convertir el valor en un número entero, porque básicamente era una marca de tiempo , pero en forma de cadena en lugar de un número entero. Obviamente, ese no será el caso para todos, pero valdría la pena intentarlo.


5

Este error ocurre cuando realizas cálculos con variables que usan letras combinadas con números (alfanuméricos), por ejemplo 24kb, 886ab ...

Tuve el error en la siguiente función

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);       
    switch($last) {
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }
    return $this->fix_integer_overflow($val);
}

La aplicación carga imágenes pero no funcionó, mostró la siguiente advertencia:

ingrese la descripción de la imagen aquí

Solución: La intval()función extrae el valor entero de una variable con datos alfanuméricos y crea una nueva variable con el mismo valor pero convertida a un entero con la intval()función. Aquí está el código:

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $intval = intval(trim($val));
    switch($last) {
        case 'g':
            $intval *= 1024;
        case 'm':
            $intval *= 1024;
        case 'k':
            $intval *= 1024;
    }
    return $this->fix_integer_overflow($intval);
}

3

Esto me ayudó mucho -

$new_date = date_format(date_create($old_date), 'Y-m-d');

1

Esta es una vieja pregunta, pero hay otra forma sutil en la que este mensaje puede ocurrir. Se explica bastante bien aquí, en los documentos .

Imagina este escenario:

try {
  // code that triggers a pdo exception
} catch (Exception $e) {
  throw new MyCustomExceptionHandler($e);
}

Y MyCustomExceptionHandlerse define aproximadamente como:

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage(), $e->getCode());
  }
}

En realidad, esto activará una nueva excepción en el controlador de excepciones personalizado porque la Exceptionclase espera un número para el segundo parámetro en su constructor, pero PDOExceptionpodría haber cambiado dinámicamente el tipo de retorno de $e->getCode()a una cadena.

Una solución alternativa para esto sería definir su controlador de excepciones personalizado como:

class MyCustomExceptionHandler extends Exception {
  public function __construct($e) {
    parent::__construct($e->getMessage());
    $this->code = $e->getCode();
  }
}

1

Pasar una cadena no es necesariamente un problema, si solo contiene dígitos.

Otra razón por la que esto puede suceder es si tiene un espacio antes o después. Por ejemplo, "1557399276"


0

Si el error se produce en el momento de realizar algún cálculo, verifique que los valores no contengan ninguna coma (,). Los valores deben estar solo en formato entero / flotante.


0

Necesita establecer la zona horaria usando date_default_timezone_set ().


0

En mi caso fue la clave para sem_get

sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [,
          int $auto_release = 1 ]]] 
          ) : resource

$ key debe ser un int, de lo contrario, obtendrá el siguiente error:

Aviso de PHP: un valor numérico no bien formado encontrado en


0

si $ _GET ['start_date'] es una cadena, conviértala en entero o doble para tratar numéricamente.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.