Rilevato valore numerico non ben formato


120

Ho un modulo che passa due date (inizio e fine) a uno script PHP che le aggiungerà a un DB. Ho problemi a convalidare questo. Continuo a ricevere i seguenti errori

Rilevato valore numerico non ben formato

Questo è quando uso quanto segue

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

Ma quando uso la funzione strtotime () come consigliato da molti siti ottengo una data di timestamp unix di 1/1/1970. Delle idee su come posso ottenere la data corretta?


5
Devi pubblicare ciò che $_GET['start_date']contiene.
JohnP

1
Presumo che il tuo $_GET['start_date']non sia un timestamp previsto dalla datefunzione come secondo argomento
Nemoden

La seconda risposta di DChaplin è più appropriata in questo caso
cw24

Ho capito quando ho provato a selezionare da un tavolo a cui non mi ero iscritto ..
Connor Leech il

Risposte:


225

Perché stai passando una stringa come secondo argomento alla funzione data, che dovrebbe essere un numero intero.

data stringa (stringa $ formato [, int $ timestamp = ora ()])

Prova strtotime che analizzerà qualsiasi descrizione datetime testuale in inglese in un timestamp Unix (intero):

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

1
Ottengo lo stesso errore nel costruttore di una classe, stavo eseguendo il debug e il problema in quel costruttore è che ricevo come parametro e numero interopublic function __construct(int $someId....)
Marcos Di Paolo

Con la digitazione dei parametri in PHP che diventa sempre più la 'norma', ciò che @MarcosDiPaolo ha menzionato sarà sicuramente visto più frequentemente. Un indizio morto è che la traccia dello stack punterà alla riga della dichiarazione del parametro che è stata digitata in modo errato.
parttimeturtle

Continuo a non capire qual è la linea di condotta qui @parttimeturtle
Marcos Di Paolo

@MarcosDiPaolo i tipi di parametri che passi a quel costruttore devono corrispondere ai tipi che vengono suggeriti nella definizione della funzione. "4" rappresentato da una stringa è diverso da 4 rappresentato da un numero intero. Quindi, conformati alla definizione della funzione o disattiva i tipi rigorosi, se hai veramente bisogno di unire valori "simili", ad es. Stringa "4" all'intero 4.
parttimeturtle

9

Semplicemente puoi risolvere questo problema usando la strtotime()funzione.

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

7

$_GET['start_date']non è numerico è la mia scommessa, ma un formato di data non supportato da strtotime. Sarà necessario riformattare la data in un formato utilizzabile per strtotime o utilizzare la combinazione di explode / mktime .

Potrei aggiungerti un esempio se fossi così gentile da pubblicare il formato che ricevi attualmente.


La trasmissione non risolverà il problema poiché PHP lo trasmetterà automaticamente una volta passato al metodo.
JohnP

5

Mi sono imbattuto in questa stessa situazione (nel mio caso con un valore di data in un campo PHP personalizzato in una vista Drupal) e quello che ha funzionato per me è stato usare intval invece di strtotime per trasformare il valore in un numero intero, perché fondamentalmente era un timestamp , ma sotto forma di stringa anziché di numero intero. Ovviamente non sarà così per tutti, ma potrebbe valere la pena provare.


5

Questo errore si verifica quando si eseguono calcoli con variabili che utilizzano lettere combinate con numeri (alfanumerici), ad esempio 24kb, 886ab ...

Ho avuto l'errore nella seguente funzione

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

L'applicazione carica le immagini ma non ha funzionato, ha mostrato il seguente avviso:

inserisci qui la descrizione dell'immagine

Soluzione: la intval()funzione estrae il valore intero di una variabile con dati alfanumerici e crea una nuova variabile con lo stesso valore ma convertita in un numero intero con la intval()funzione. Ecco il codice:

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

Questo mi ha aiutato molto -

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

1

Questa è una vecchia domanda, ma c'è un altro modo sottile in cui questo messaggio può accadere. È spiegato abbastanza bene qui, nei documenti .

Immagina questo scenario:

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

Ed MyCustomExceptionHandlerè definito approssimativamente come:

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

Ciò attiverà effettivamente una nuova eccezione nel gestore di eccezioni personalizzato perché la Exceptionclasse si aspetta un numero per il secondo parametro nel suo costruttore, ma PDOExceptionpotrebbe aver modificato dinamicamente il tipo restituito di $e->getCode()in una stringa.

Una soluzione alternativa per questo sarebbe definire il tuo gestore di eccezioni personalizzato come:

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

1

Il passaggio di una stringa non è necessariamente un problema, se contiene solo cifre.

Un altro motivo per cui questo può accadere è se hai uno spazio prima o dopo. Ad esempio "1557399276"


0

Se l'errore è al momento di qualsiasi calcolo, ricontrolla che i valori non contengano virgole (,). I valori devono essere solo in formato intero / float.


0

È necessario impostare il fuso orario utilizzando date_default_timezone_set ().


0

Nel mio caso era la chiave per sem_get

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

$ key dovrebbe essere un int, altrimenti otterrai il seguente errore:

Avviso PHP: un valore numerico non ben formato rilevato in


0

se $ _GET ['data_inizio'] è una stringa, convertila in numero intero o doppio per trattare numericamente.

$int = (int) $_GET['start_date']; //Integer
$double = (double) $_GET['start_date']; //It takes in floating value with 2 digits
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.