Um valor numérico não bem formado encontrado

120

Eu tenho um formulário que passa duas datas (início e término) para um script PHP que irá adicioná-los a um banco de dados. Estou tendo problemas para validar isso. Eu continuo recebendo os seguintes erros

Um valor numérico não bem formado encontrado

É quando eu uso o seguinte

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

Mas quando uso a função strtotime () conforme recomendado por muitos sites, obtenho uma data de carimbo de data / hora Unix de 01/01/1970. Alguma ideia de como posso obter a data correta?

Deviland
fonte
5
Você precisa postar o que $_GET['start_date']contém.
JohnP
1
Suponho que seu $_GET['start_date']não seja um carimbo de data / hora esperado pela datefunção como um segundo argumento
Nemoden
A segunda resposta do DChaplin é mais apropriada neste caso
cw24
Eu entendi isso ao tentar selecionar em uma mesa da qual não participei.
Connor Leech

Respostas:

225

Porque você está passando uma string como o segundo argumento para a função de data, que deve ser um inteiro.

string data (string $ format [, int $ timestamp = time ()])

Tente strtotime, que irá analisar qualquer descrição textual de data e hora em inglês em um carimbo de data / hora Unix (inteiro):

date("d", strtotime($_GET['start_date']));
DChaplin
fonte
1
Recebo o mesmo erro no construtor de uma classe, estava depurando e o problema nesse construtor é que estou recebendo como parâmetro e inteiropublic function __construct(int $someId....)
Marcos Di Paolo
Com a digitação de parâmetros no PHP se tornando cada vez mais a 'norma', o que @MarcosDiPaolo mencionou com certeza será visto com mais frequência. Um dado morto é que o rastreamento da pilha apontará para a linha da declaração do parâmetro que está sendo digitada incorretamente.
parttimeturtle
Ainda não entendi o que fazer aqui @parttimeturtle
Marcos Di Paolo
@MarcosDiPaolo os Tipos de parâmetros que você passa para aquele construtor devem corresponder aos Tipos que estão sendo sugeridos na definição da função. "4" representado por uma string é diferente de 4 representado por um inteiro. Portanto, esteja em conformidade com a definição da função ou desative os tipos estritos, se você realmente precisar aglutinar valores 'semelhantes', por exemplo, string "4" para o inteiro 4.
parttimeturtle
9

Simplesmente você pode resolver esse problema usando a strtotime()função.

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

$_GET['start_date']não é numérico, aposto, mas um formato de data não compatível com strtotime. Você precisará reformatar a data para um formato viável para strtotime ou usar a combinação de explode / mktime .

Eu poderia adicionar um exemplo se você fizesse a gentileza de postar o formato que você recebe atualmente.

Wesley van Opdorp
fonte
A conversão não corrigirá o problema, pois o PHP irá automaticamente lançá-lo quando passado para o método.
JohnP
5

Eu me deparei com a mesma situação (no meu caso com um valor de data em um campo PHP personalizado em uma visualização Drupal), e o que funcionou para mim foi usar intval em vez de strtotime para transformar o valor em um inteiro - porque era basicamente um carimbo de data / hora , mas na forma de uma string em vez de um inteiro. Obviamente, esse não será o caso para todos, mas pode valer a pena tentar.

seda de aranha
fonte
5

Este erro ocorre quando você realiza cálculos com variáveis ​​que usam letras combinadas com números (alfanuméricos), por exemplo 24kb, 886ab ...

Eu tive o erro na seguinte função

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);
}

O aplicativo carrega imagens, mas não funcionou, exibindo o seguinte aviso:

insira a descrição da imagem aqui

Solução: a intval()função extrai o valor inteiro de uma variável com dados alfanuméricos e cria uma nova variável com o mesmo valor, mas convertida em um inteiro com a intval()função. Aqui está o 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);
}
Vladimir Salguero
fonte
3

Isso me ajudou muito -

$new_date = date_format(date_create($old_date), 'Y-m-d');
Tushar Walzade
fonte
1

Essa é uma pergunta antiga, mas há outra maneira sutil pela qual essa mensagem pode acontecer. Está muito bem explicado aqui, na documentação .

Imagine este cenário:

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

E MyCustomExceptionHandleré definido aproximadamente como:

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

Na verdade, isso irá disparar uma nova exceção no manipulador de exceções personalizado, porque a Exceptionclasse está esperando um número para o segundo parâmetro em seu construtor, mas PDOExceptionpode ter alterado dinamicamente o tipo de retorno de$e->getCode() para uma string.

Uma solução alternativa para isso seria definir seu manipulador de exceções personalizado como:

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

Passar uma string não é necessariamente um problema, se ela contiver apenas dígitos.

Outra razão para isso acontecer é se você tiver um espaço antes ou depois. Por exemplo, "1557399276"

Nuno
fonte
0

Se o erro for no momento de qualquer cálculo, verifique se os valores não contêm vírgulas (,). Os valores devem estar apenas no formato inteiro / flutuante.

Arghadeeph Halder
fonte
0

Você precisa definir o fuso horário usando date_default_timezone_set ().

AlanP
fonte
0

No meu caso, era a chave para sem_get

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

$ key deve ser um int, caso contrário, você obterá o seguinte erro:

Aviso de PHP: Um valor numérico não bem formado encontrado em

M em
fonte
0

se $ _GET ['data_de_início'] é uma string, converta-a em número inteiro ou duplo para negociar numericamente.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
A.Aleem11
fonte