Avviso: rilevato un valore non numerico


123

Aggiornato di recente a PHP 7.1 e inizia a ricevere il seguente errore

Avvertenza: un valore non numerico rilevato nella riga 29

Ecco come appare la linea 29

$sub_total += ($item['quantity'] * $product['price']);

Su localhost tutto funziona bene ..

Qualche idea su come affrontare questo o di cosa si tratta?


4
var_dump($item['quantity'], $product['price'])
— u_mulder

2
Sembra un nuovo avviso in PHP 7 (come ben sai). php.net/manual/en/migration71.other-changes.php Quando ricevi l'errore, queste variabili hanno valori? Penso che potresti evitarlo inizializzandoli a 0.
— tjfo

1
@MichaelHanon dov'è la risposta a cui ti riferisci? qual è l'errore di sintassi?
— FKEinternet

1
$ sub_total + = ((int) $ articolo ['quantità'] * (int) $ prodotto ['prezzo']);
— Sono la persona più stupida

uso un formato legacy come questo a = a + b; o str = str. "<a href='".str2."'> asd </a>"; o $ this-> storeItems = $ this-> storeItems. $ str;
— sabre tabatabaee yazdi

Risposte:


106

Sembra che in PHP 7.1, verrà emesso un avviso se si incontra un valore non numerico. Vedi questo collegamento .

Di seguito è riportata la parte pertinente relativa all'avviso di avviso che stai ricevendo:

Sono stati introdotti nuovi errori E_WARNING e E_NOTICE quando stringhe non valide vengono forzate utilizzando operatori che si aspettano numeri o i loro equivalenti di assegnazione. Viene emesso un E_NOTICE quando la stringa inizia con un valore numerico ma contiene caratteri finali non numerici e un E_WARNING viene emesso quando la stringa non contiene un valore numerico.

Immagino che $ item ['quantity'] o $ product ['price'] non contengano un valore numerico, quindi assicurati che lo contengano prima di provare a moltiplicarli. Forse usa una sorta di condizionale prima di calcolare $ sub_total, in questo modo:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}

2
Ho avuto questo problema perché avevo ancora alcuni segni più nell'asp che stavo trasferendo a PHP. Ctrl + f e cerca + caratteri.
— MH

C'è un modo per disattivare questo avviso tramite php.ini?
— BeniRose

3
Grazie. Sto lavorando a un progetto precedente di Symfony 1.4, e sembra che ci siano alcuni posti in cui questo accade intenzionalmente, il che è stato un problema. Questo dovrebbe davvero essere un flag in php.ini che ti permette di disattivare questo livello di rigore.
— BeniRose

9
In alternativa puoi usare$sub_total += ((int)$item['quantity'] * (int)$product['price']);
— Sono la persona più stupida

2
Per essere onesti, non lo spegnerei, è uno degli avvisi più utili che possono effettivamente portarti a trovare un bug - nel nostro caso, uno che era in vigore da anni e non notato. Come ha detto Daniel, appare solo se provi ad applicare la matematica a una stringa non numerica. Non riesco a vedere un caso in cui questo sarebbe il comportamento desiderato. cioè "default" * 86400 sarebbe uguale a 0 e senza questo avviso, non lo sapresti mai a meno che non ti capiti di passare attraverso il codice.
— Steve Childs

230

Non esattamente il problema che hai avuto, ma lo stesso errore per le persone che effettuano ricerche.

Questo è successo a me quando ho passato troppo tempo su JavaScript.

Tornando a PHP ho concatenato due stringhe con " +" invece di " ." e ho ricevuto quell'errore.


24
Questa dannata cosa mi ha fatto scattare nel 2019, LOL. La concatenazione di stringhe di PHP deve essere ristrutturata!
— Daniel Dut

2
E qui 2 settimane dopo aver eseguito nodejs e tornato a PHP ho
— riscontrato di

3
non appena si tenta di concatenare una stringa con a +, si presume che sia un intvalore ... mentre gli operandi forniti non sono di alcun tipo di dato numerico.
— Martin Zeitler

1
haha, lo stesso è successo con me, passo troppo tempo su JS e quando si tratta di PHP cerco di usare il codice JS. Ma l'interprete PHP non me lo permette.
— Hemant Sankhla

1
Oh mio Dio. Ho cercato su Google per quasi un'ora intera solo per scoprire che ho usato +invece di .. Grazie!
— marvinpoo

53

Puoi risolvere il problema senza alcuna nuova logica semplicemente inserendo l'oggetto nel numero, che impedisce l'avviso ed è equivalente al comportamento in PHP 7.0 e inferiore:

$sub_total += ((int)$item['quantity'] * (int)$product['price']);

(La risposta di Daniel Schroeder non è equivalente perché $ sub_total rimarrebbe non impostato se si incontrano valori non numerici. Ad esempio, se stampi $ sub_total, otterrai una stringa vuota, che probabilmente è sbagliata in una fattura. - di casting assicurati che $ sub_total sia un numero intero.)


4
è una cattiva pratica. Devi filtrare i tuoi input
— Ciro Vargas

4
Questa sembra essere la risposta migliore. E per quanto ne sai questi valori provengono dal database, potresti non aver bisogno di uscire.
— MH

3
@Ciro Vargas: dipende dall'applicazione. In molti casi si desidera che un numero intero indefinito venga interpretato come zero. Comunque questo è l'equivalente del comportamento di PHP7.0 e non richiede una riscrittura del codice. (La risposta accettata richiede una riscrittura.)
— Roland Seuhs,

@RolandSeuhs Non sono sicuro di seguire, quando si moltiplicano due stringhe, "24" * "10" produrrà 240 in PHP, "24" * null produrrà 0, ma "24" * "cat" genererà l'errore menzionato sopra perché "cat" è un valore non numerico. Puoi lanciare "cat" su un int, ma questo non ti darà nemmeno un subtotale significativo. Per quanto riguarda la mia soluzione, funziona per determinare se quantità e prezzo sono numerici. Se sono stringhe "24" e "10", passa, ma se una delle due è una stringa non numerica, fallisce. Il modo in cui sub_total viene gestito non era proprio il mio obiettivo, mi dispiace se è venuto fuori in quel modo.
— DanielSchroederDev

3
***** PRICE dovrebbe essere (float) dovrebbe metterlo!
— Bhavin Rana

25

Nel mio caso è stato per colpa mia usato +come in un altro linguaggio ma in PHP l'operatore di concatenazione di stringhe è ..


5

Questo mi stava accadendo specificamente su PHPMyAdmin. Quindi, per rispondere più specificamente a questo , ho fatto quanto segue:

Nel file:

C:\ampps\phpMyAdmin\libraries\DisplayResults.class.php

Ho cambiato questo:

// Move to the next page or to the last one
$endpos = $_SESSION['tmpval']['pos']
    + $_SESSION['tmpval']['max_rows'];

A questa:

$endpos = 0;
if (!empty($_SESSION['tmpval']['pos']) && is_numeric($_SESSION['tmpval']['pos'])) {
    $endpos += $_SESSION['tmpval']['pos'];
}
if (!empty($_SESSION['tmpval']['max_rows']) && is_numeric($_SESSION['tmpval']['max_rows'])) {
    $endpos += $_SESSION['tmpval']['max_rows'];
}

Spero che qualcuno salvi dei guai ...


4

Ho avuto questo problema con il mio link di paginazione avanti e indietro ... è sufficiente impostare (int) davanti alla variabile $ Page + 1 e ha funzionato ...

<?php 
$Page = (isset($_GET['Page']) ? $_GET['Page'] : '');
if ((int)$Page+1<=$PostPagination) {
?>
<li> <a href="Index.php?Page=<?php echo $Page+1; ?>"> &raquo;</a></li>
<?php }
?>

3

Ho riscontrato il problema in phpmyadmin con PHP 7.3. Grazie @coderama, ho cambiato librerie / DisplayResults.class.php riga 855 da

// Move to the next page or to the last one
$endpos = $_SESSION['tmpval']['pos']
    + $_SESSION['tmpval']['max_rows'];

in

// Move to the next page or to the last one
$endpos = (int)$_SESSION['tmpval']['pos']
    + (int)$_SESSION['tmpval']['max_rows'];

Fisso.


3

Ciao, nel mio caso utilizzando (WordPress) e PHP7.4 ricevo un avviso sul problema del valore numerico. Quindi ho cambiato il vecchio codice come segue:

A partire dal:

$val = $oldval + $val;

Per:

$val = ((int)$oldval + (int)$val);

Ora l'avviso è scomparso :)


2

Controlla se non stai incrementando con qualche variabile che il suo valore sia una stringa vuota come "".

Esempio:

$total = '';
$integers = range(1, 5);

foreach($integers as $integer) {
    $total += $integer;
}

Super, questo è un caso mancato nella maggior parte delle altre risposte.
— Trendfischer

1

Prova questo.

$sub_total = 0;

e all'interno del tuo ciclo ora puoi usarlo

$sub_total += ($item['quantity'] * $product['price']);

Dovrebbe risolvere il tuo problema.


1

Ho appena guardato questa pagina perché ho avuto questo problema. Per me avevo numeri in virgola mobile calcolati da un array, ma anche dopo aver designato le variabili come virgolette l'errore è stato ancora fornito, ecco la semplice correzione e il codice di esempio sottostante che stava causando il problema.

Esempio PHP

<?php
$subtotal = 0; //Warning fixed
$shippingtotal = 0; //Warning fixed

$price = array($row3['price']);
$shipping = array($row3['shipping']);
$values1 = array_sum($price);
$values2 = array_sum($shipping);
(float)$subtotal += $values1; // float is irrelevant $subtotal creates warning
(float)$shippingtotal += $values2; // float is irrelevant $shippingtotal creates warning
?>

1
$sn = 0;//increment the serial number, then add the sn to job
for($x = 0; $x<20; $x++)
{
$sn++;
$added_date = "10/10/10";
$job_title = "new job";
$salary = $sn*1000;
$cd = "27/10/2017";//the closing date
$ins = "some institution";//the institution for the vacancy 
$notes = "some notes here";//any notes about the jobs

$sn_div = "<div class='sn_div'>".$sn."</div>";
$ad_div = "<div class='ad_div'>".$added_date."</div>";
$job_div = "<div class='job_div'>".$job_title."</div>";
$salary_div = "<div class='salary_div'>".$salary."</div>";
$cd_div = "<div class='cd_div'>".$cd."</div>";//cd means closing date
$ins_div = "<div class='ins_div'>".$ins."</div>";//ins means institution
$notes_div = "<div class='notes_div'>".$notes."</div>";


/*erroneous line*/$job_no = "job"+$sn;//to create the job rows
$$job_no = "<div class='job_wrapper'>".$sn_div.$ad_div.$job_div.$salary_div.$cd_div.$ins_div.$notes_div."</div>";

echo $$job_no;//and then echo each job

}

questo è il codice che avevo per eseguire il loop e creare nuovi elementi div html. Il codice ha funzionato bene e gli elementi sono stati formati, ma ho ricevuto lo stesso avviso in error_log.

Dopo aver letto le altre utili risposte, ho pensato che stavo riassumendo una stringa e un numero nella riga errata. Quindi ho cambiato il codice su quella riga in

/*erroneous line*/$job_no = "job"&&$sn;//this is the new variable that will create the job rows

Ora il codice funziona come prima ma questa volta senza avvisi. Spero che questo esempio possa essere utile a qualcuno.


1

Risolvi questo errore su WordPress

Avviso: un valore non numerico rilevato in C: \ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.php alla riga 694

Soluzione semplice qui!

  1. individuare un file di wp-includes\SimplePie\Parse\Date.php
  2. trova una riga n. 694
  3. mostri il codice $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. e modificare questo 3.) in questa riga $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));

1
$sub_total_price = 0; 

foreach($booking_list as $key=>$value) {
        $sub_total_price += ($price * $quantity); 
}

echo $sub_total_price;

funziona al 100% :)


1

Ciò accade di solito quando si con-cat le stringhe con il segno +. In PHP puoi fare la concatenazione usando il segno del punto (.) Quindi a volte inserisco accidentalmente il segno + tra due stringhe in PHP e mi mostra questo errore, poiché puoi usare solo i numeri di accesso +.


0

Assicurati che la struttura della tua colonna sia INT.


0

Se si incontra un valore non numerico nel codice, provare sotto uno. Il codice seguente viene convertito in float.

$PlannedAmount = ''; // empty string ''

if(!is_numeric($PlannedAmount)) {
           $PlannedAmount = floatval($PlannedAmount);
 }

 echo $PlannedAmount; //output = 0

0

in PHP se usi + per la concatenazione ti ritroverai con questo errore. In php + è un operatore aritmetico . https://www.php.net/manual/en/language.operators.arithmetic.php

uso errato dell'operatore +:

            "<label for='content'>Content:</label>"+
            "<textarea class='form-control col-xs-12' rows='7'cols='100' id='content' name='content'>"+$initcontent+"</textarea>'"+                 
            "</div>";

utilizzare . per la concatenazione

$output = "<div class='from-group'>".
            "<label for='content'>Content:</label>".
            "<textarea class='form-control col-xs-12' rows='7'cols='100' id='content' name='content'>".$initcontent."</textarea>'".                 
            "</div>";
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.