Aviso: um valor não numérico encontrado

123

Recentemente atualizado para PHP 7.1 e comece a obter o seguinte erro

Aviso: um valor não numérico encontrado na linha 29

Aqui está a aparência da linha 29

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

No localhost tudo funciona bem ..

Alguma ideia de como lidar com isso ou o que é?

Imran Rafique
fonte
4
var_dump($item['quantity'], $product['price'])
u_mulder
2
Parece um novo aviso no PHP 7 (como você sabe). php.net/manual/en/migration71.other-changes.php Quando você obtém o erro, essas variáveis ​​têm valores? Eu acho que você poderia evitar inicializando-os com 0.
tjfo
1
@MichaelHanon onde está a resposta a que você se refere? qual é o erro de sintaxe?
FKEinternet
1
$ sub_total + = ((int) $ item ['quantidade'] * (int) $ produto ['preço']);
Eu sou a pessoa mais estúpida de
eu uso o formato legado como este a = a + b; ou str = str. "<a href='".str2."'> asd </a>"; ou $ this-> storeItems = $ this-> storeItems. $ str;
sabre tabatabaee yazdi

Respostas:

106

Parece que no PHP 7.1, um Aviso será emitido se um valor não numérico for encontrado. Veja este link .

Aqui está a parte relevante que pertence ao aviso de Aviso que você está recebendo:

Novos erros E_WARNING e E_NOTICE foram introduzidos quando strings inválidas são coagidas usando operadores que esperam números ou seus equivalentes de atribuição. Um E_NOTICE é emitido quando a string começa com um valor numérico, mas contém caracteres não numéricos à direita, e um E_WARNING é emitido quando a string não contém um valor numérico.

Estou supondo que $ item ['quantidade'] ou $ product ['preço'] não contém um valor numérico, então certifique-se de que eles contenham antes de tentar multiplicá-los. Talvez use algum tipo de condicional antes de calcular o $ sub_total, assim:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}
DanielSchroederDev
fonte
2
Tive esse problema porque ainda tinha alguns sinais positivos no asp que estava transferindo para o PHP. Ctrl + fe procure + caracteres.
MH
Existe uma maneira de desligar este aviso via php.ini?
BeniRose
3
Obrigado. Estou trabalhando em um projeto Symfony 1.4 legado, e parece que há alguns lugares em que isso acontece intencionalmente, o que tem sido uma dor. Isso realmente deve ser um sinalizador no php.ini que permite que você desative esse nível de rigidez.
BeniRose
9
Como alternativa, você pode usar$sub_total += ((int)$item['quantity'] * (int)$product['price']);
Eu sou a pessoa mais estúpida de
2
Para ser justo, eu não desligaria isso, é um dos avisos mais úteis que pode realmente levar você a encontrar um bug - em nosso caso, um que já existia há anos e não era notado. Como disse Daniel, ele só aparece se você tentar aplicar a matemática a uma string não numérica. Não consigo ver um caso em que esse seja o comportamento desejado. ou seja, "default" * 86400 seria igual a 0 e, sem esse aviso, você nunca saberia, a menos que percorresse o código.
Steve Childs
230

Não é exatamente o problema que você teve, mas o mesmo erro para as pessoas que pesquisam.

Isso aconteceu comigo quando eu gastei muito tempo em JavaScript.

Voltando ao PHP, concatenei duas strings com " +" em vez de " ." e recebi esse erro.

Yassir Ennazk
fonte
24
Essa maldita coisa me fez tropeçar em 2019, LOL. A concatenação de strings do PHP precisa ser reestruturada!
Daniel Dut
2
E aqui 2 semanas depois de fazer nodejs e retornar ao PHP, eu enfrentei esse erro novamente lol
imin
3
assim que uma string está sendo tentada a ser concatenada com um +, assume-se que é um intvalor ... enquanto os operandos fornecidos não são de nenhum tipo de dados numérico.
Martin Zeitler
1
haha, o mesmo aconteceu comigo, eu gasto muito tempo em JS e quando se trata de PHP procuro usar código JS. Mas o interpretador PHP não me deixa fazer isso.
Hemant Sankhla
1
Oh meu Deus. Eu estive pesquisando por quase uma hora inteira apenas para descobrir que usei em +vez de .. Obrigado!
marvinpoo
53

Você pode resolver o problema sem nenhuma nova lógica apenas convertendo a coisa no número, o que evita o aviso e é equivalente ao comportamento no PHP 7.0 e abaixo:

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

(A resposta de Daniel Schroeder não é equivalente porque $ sub_total permaneceria indefinido se valores não numéricos fossem encontrados. Por exemplo, se você imprimir $ sub_total, obteria uma string vazia, que provavelmente está errada em uma fatura. - por cast, certifique-se de que $ sub_total é um inteiro.)

Roland Seuhs
fonte
4
essa é uma prática ruim. Você precisa filtrar suas entradas
Ciro Vargas
4
Esta parece ser a melhor resposta. E, pelo que você sabe, esses valores vêm do banco de dados, talvez você não precise escapar.
MH
3
@Ciro Vargas: Depende do aplicativo. Em muitos casos, você deseja que um número inteiro indefinido seja interpretado como zero. De qualquer forma, isso é equivalente ao comportamento do PHP7.0 e não requer uma reescrita do código. (A resposta aceita exige uma reescrita.)
Roland Seuhs
@RolandSeuhs Não tenho certeza se entendi, ao multiplicar duas strings, '24' * '10' produzirá 240 em PHP, '24' * null produzirá 0, mas '24' * 'cat' gerará o erro mencionado acima porque 'cat' é um valor não numérico. Você pode converter 'gato' em um int, mas isso também não fornecerá um subtotal significativo. Quanto à minha solução, ela serve para determinar se a quantidade e o preço são numéricos. Se forem strings '24' e '10', passa, mas se qualquer uma for uma string não numérica, falha. Como sub_total é tratado não era realmente meu objetivo, desculpe se saiu dessa forma.
DanielSchroederDev
3
***** PRICE deve ser (float) deve colocar isso!
Bhavin Rana
25

No meu caso foi por causa de mim usado +como em outra linguagem, mas no operador de concatenação de strings PHP é ..

CodeToLife
fonte
5

Isso estava acontecendo comigo especificamente no PHPMyAdmin. Então, para responder mais especificamente a esta , eu fiz o seguinte:

No arquivo:

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

Eu mudei isso:

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

Para isso:

$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'];
}

Espero que isso salve alguém alguns problemas ...

coderama
fonte
4

Eu tive esse problema com meu link de paginação para frente e para trás .... simplesmente defina (int) na frente da variável $ Page + 1 e funcionou ...

<?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 }
?>
Ajmal Aamir
fonte
3

Encontrei o problema no phpmyadmin com PHP 7.3. Obrigado @coderama, mudei a linha 855 de libraries / DisplayResults.class.php de

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

para dentro

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

Fixo.

Henry
fonte
3

Olá, No meu caso usando (WordPress) e PHP7.4 recebo um aviso sobre o problema de valor numérico. Então mudei o código antigo da seguinte maneira:

De:

$val = $oldval + $val;

Para:

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

Agora o aviso desapareceu :)

Jodyshop
fonte
2

Verifique se você não está incrementando com alguma variável se seu valor é uma string vazia como ''.

Exemplo:

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

foreach($integers as $integer) {
    $total += $integer;
}
Luiz gustavo martins
fonte
Super, este é um caso que não foi encontrado na maioria das outras respostas.
Trendfischer
1

Experimente isso.

$sub_total = 0;

e dentro do seu ciclo agora você pode usar isso

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

Isso deve resolver seu problema.

Wadday
fonte
1

Acabei de olhar para esta página porque tive esse problema. Para mim, eu tinha números de ponto flutuante calculados a partir de uma matriz, mas mesmo depois de designar as variáveis ​​como pontos flutuantes, o erro ainda era dado, aqui está a correção simples e o código de exemplo que estava causando o problema.

PHP de exemplo

<?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
?>

fonte
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

}

esse é o código que eu tinha que deu loop e criou novos elementos div html. O código funcionou bem e os elementos foram formados, mas recebi o mesmo aviso no error_log.

Depois de ler as outras respostas úteis, percebi que estava somando uma string e um número na linha errada. Então, mudei o código dessa linha para

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

Agora o código funciona como antes, mas sem avisos desta vez. Espero que este exemplo seja útil para alguém.

Neo
fonte
1

Resolva este erro no WordPress

Aviso: um valor não numérico encontrado em C: \ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.php na linha 694

Solução simples aqui!

  1. localizar um arquivo de wp-includes\SimplePie\Parse\Date.php
  2. encontre uma linha não. 694
  3. você mostra o código $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. e altere este 3.) para esta linha $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
Nasirkhan Pathan
fonte
1
$sub_total_price = 0; 

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

echo $sub_total_price;

está funcionando 100% :)

Imran Imu
fonte
1

Isso geralmente acontece quando você confunde strings com o sinal +. No PHP você pode fazer concatenação usando sinal de ponto (.) Então às vezes eu coloco acidentalmente + sinal entre duas strings em PHP, e isso me mostra este erro, já que você pode usar + sinal apenas em números.

ASammour
fonte
0

Certifique-se de que sua estrutura de coluna seja INT.

Borgy ES
fonte
0

Se um valor não numérico encontrado em seu código, tente abaixo de um. O código a seguir é convertido em float.

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

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

 echo $PlannedAmount; //output = 0
mallikarjun SK
fonte
0

em PHP, se você usar + para concatenação, acabará com este erro. Em php + é um operador aritmético . https://www.php.net/manual/en/language.operators.arithmetic.php

uso incorreto do operador +:

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

usar . para concatenação

$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>";
senhor
fonte