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.