Advertencia: se encontró un valor no numérico

122

Recientemente actualizado a PHP 7.1 y comienza a recibir el siguiente error

Advertencia: un valor no numérico encontrado en la línea 29

Así es como se ve la línea 29

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

En localhost todo funciona bien.

¿Alguna idea de cómo abordar esto o qué es?

Imran Rafique
fuente
4
var_dump($item['quantity'], $product['price'])
u_mulder
2
Parece una nueva advertencia en PHP 7 (como ya sabe). php.net/manual/en/migration71.other-changes.php Cuando aparece el error, ¿esas variables tienen valores? Creo que podría evitarlo inicializándolos a 0.
tjfo
1
@MichaelHanon, ¿dónde está la respuesta a la que se refiere? ¿cuál es el error de sintaxis?
FKEinternet
1
$ sub_total + = ((int) $ artículo ['cantidad'] * (int) $ producto ['precio']);
Soy la persona más estúpida
utilizo un formato heredado como este a = a + b; o str = str. "<a href='".str2."'> asd </a>"; o $ this-> storeItems = $ this-> storeItems. $ str;
saber tabatabaee yazdi

Respuestas:

105

Parece que en PHP 7.1, se emitirá una advertencia si se encuentra un valor no numérico. Vea este enlace .

Aquí está la parte relevante que pertenece al aviso de advertencia que está recibiendo:

Se han introducido nuevos errores E_WARNING y E_NOTICE cuando se coaccionan cadenas no válidas utilizando operadores que esperan números o sus equivalentes de asignación. Se emite un E_NOTICE cuando la cadena comienza con un valor numérico pero contiene caracteres no numéricos al final, y se emite un E_WARNING cuando la cadena no contiene un valor numérico.

Supongo que $ artículo ['cantidad'] o $ producto ['precio'] no contienen un valor numérico, así que asegúrese de que lo tengan antes de intentar multiplicarlos. Tal vez use algún tipo de condicional antes de calcular el $ sub_total, así:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}
DanielSchroederDev
fuente
2
Tuve este problema porque todavía tenía algunos signos más en el asp que estaba transfiriendo a PHP. Ctrl + fy busque + caracteres.
MH
¿Hay alguna forma de desactivar esta advertencia a través de php.ini?
BeniRose
3
Gracias. Estoy trabajando en un proyecto heredado de Symfony 1.4, y parece que hay algunos lugares en los que esto sucede intencionalmente, lo cual ha sido un fastidio. Esto realmente debería ser una bandera en php.ini que le permita desactivar este nivel de rigor.
BeniRose
9
Alternativamente, puede usar$sub_total += ((int)$item['quantity'] * (int)$product['price']);
Soy la persona más estúpida.
2
Para ser justos, no apagaría esto, es una de las advertencias más útiles que realmente puede llevarlo a encontrar un error, en nuestro caso, uno que ha estado en su lugar durante años y no se ha notado. Como dijo Daniel, solo aparece si intentas aplicar las matemáticas a una cadena no numérica. No veo un caso en el que este sería el comportamiento deseado. es decir, "predeterminado" * 86400 sería igual a 0 y sin esta advertencia, nunca lo sabría a menos que pase por el código.
Steve Childs
230

No es exactamente el problema que tuvo, pero el mismo error para las personas que buscan.

Esto me sucedió cuando pasé demasiado tiempo en JavaScript.

Volviendo a PHP, concatené dos cadenas con " +" en lugar de " ." y obtuve ese error.

Yassir Ennazk
fuente
24
Esta maldita cosa me hizo tropezar en 2019, LOL. ¡Es necesario reestructurar la concatenación de cadenas de PHP!
Daniel Dut
2
Y aquí, 2 semanas después de hacer nodejs y regresar a PHP, enfrenté este error nuevamente lol
imin
3
tan pronto como se intenta concatenar una cadena con a +, se asume que es un intvalor ... mientras que los operandos dados no son de ningún tipo de datos numérico.
Martin Zeitler
1
jaja, lo mismo pasó conmigo, paso demasiado tiempo en JS y cuando se trata de PHP trato de usar código JS. Pero el intérprete de PHP no me deja hacer eso.
Hemant Sankhla
1
Oh Dios mío. He estado buscando en Google durante casi una hora solo para descubrir que usé en +lugar de .. ¡Gracias!
marvinpoo
52

Puede resolver el problema sin ninguna lógica nueva simplemente introduciendo la cosa en el número, lo que evita la advertencia y es equivalente al comportamiento en PHP 7.0 y siguientes:

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

(La respuesta de Daniel Schroeder no es equivalente porque $ sub_total permanecería sin establecer si se encuentran valores no numéricos. Por ejemplo, si imprime $ sub_total, obtendrá una cadena vacía, que probablemente sea incorrecta en una factura. - por emitiendo, asegúrese de que $ sub_total sea un número entero).

Roland Seuhs
fuente
4
esa es una mala práctica. Necesitas filtrar tus entradas
Ciro Vargas
3
Esta parece ser la mejor respuesta. Y por lo que sabe, estos valores provienen de la base de datos, es posible que no necesite escapar.
MH
3
@Ciro Vargas: Depende de la aplicación. En muchos casos, desea que un entero indefinido se interprete como cero. De todos modos, este es el equivalente al comportamiento de PHP7.0 y no requiere una reescritura del código. (La respuesta aceptada requiere una reescritura.)
Roland Seuhs
@RolandSeuhs No estoy seguro de seguir, al multiplicar dos cadenas, '24' * '10' producirá 240 en PHP, '24' * null producirá 0, pero '24' * 'cat' arrojará el error mencionado anterior porque 'gato' es un valor no numérico. Puedes lanzar 'cat' a un int, pero eso tampoco te dará un subtotal significativo. En cuanto a mi solución, funciona para determinar si la cantidad y el precio son numéricos. Si son cadenas '24' y '10', pasa, pero si alguna es una cadena no numérica, falla. La forma en que se trata el sub_total no era realmente mi objetivo, lo siento si salió de esa manera.
DanielSchroederDev
3
***** PRECIO debería ser (flotar) debería poner eso!
Bhavin Rana
25

En mi caso fue por mi uso +como en otro lenguaje pero en PHP el operador de concatenación de cadenas es ..

CodeToLife
fuente
5

Esto me estaba sucediendo específicamente en PHPMyAdmin. Entonces, para responder más específicamente a esto , hice lo siguiente:

En archivo:

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

Cambié esto:

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

A esto:

$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 alguien salve algún problema ...

coderama
fuente
4

Tuve este problema con mi enlace de paginación hacia adelante y hacia atrás ... simplemente establezca (int) delante de la variable $ Page + 1 y funcionó ...

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

Encontré el problema en phpmyadmin con PHP 7.3. Gracias @coderama, cambié las bibliotecas / DisplayResults.class.php línea 855 de

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

dentro

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

Fijo.

Enrique
fuente
3

Hola, En mi caso, al usar (WordPress) y PHP7.4, recibo una advertencia sobre el problema del valor numérico. Así que cambié el código anterior de la siguiente manera:

De:

$val = $oldval + $val;

A:

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

Ahora la advertencia desapareció :)

Jodyshop
fuente
2

Compruebe si no está incrementando con alguna variable que su valor sea una cadena vacía como ''.

Ejemplo:

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

foreach($integers as $integer) {
    $total += $integer;
}
Luiz Gustavo Martins
fuente
Genial, este es un caso que se pasa por alto en la mayoría de las otras respuestas.
Trendfischer
1

Prueba esto.

$sub_total = 0;

y dentro de tu bucle ahora puedes usar esto

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

debería resolver tu problema.

Wadday
fuente
1

Acabo de mirar esta página porque tenía este problema. Para mí, tenía números de punto flotante calculados a partir de una matriz, pero incluso después de designar las variables como puntos flotantes, todavía se dio el error, aquí está la solución simple y el código de ejemplo debajo que estaba causando el problema.

PHP de ejemplo

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

fuente
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

}

ese es el código que tenía que enlazaba y creaba nuevos elementos div html. El código funcionó bien y se formaron los elementos, pero recibí la misma advertencia en el error_log.

Después de leer las otras respuestas útiles, pensé que estaba sumando una cadena y un número en la línea errónea. Así que cambié el código en esa línea a

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

Ahora el código funciona como antes, pero esta vez sin advertencias. Espero que este ejemplo sea útil para alguien.

Neo
fuente
1

Resuelve este error en WordPress

Advertencia: un valor no numérico encontrado en C: \ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.php en la línea 694

¡Solución simple aquí!

  1. localizar un archivo de wp-includes\SimplePie\Parse\Date.php
  2. encontrar una línea no. 694
  3. tu muestras el codigo $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. y cambie este 3.) a esta línea $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
Nasirkhan Pathan
fuente
1
$sub_total_price = 0; 

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

echo $sub_total_price;

está funcionando al 100% :)

Imran Imu
fuente
1

Eso suele suceder cuando con-cat cadenas con el signo +. En PHP puede hacer una concatenación usando el signo de punto (.) Entonces, a veces coloco accidentalmente el signo + entre dos cadenas en PHP, y me muestra este error, ya que solo puede usar el signo + en números.

Aammour
fuente
0

Asegúrese de que la estructura de su columna sea INT.

Borgy ES
fuente
0

Si se encuentra un valor no numérico en su código, intente debajo de uno. El siguiente código se convierte en flotante.

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

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

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

en PHP si usa + para la concatenación, terminará con este error. En php + es un operador aritmético . https://www.php.net/manual/en/language.operators.arithmetic.php

uso incorrecto de + operador:

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

utilizar . para concatenación

$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>";
Señor
fuente