Avertissement: une valeur non numérique rencontrée

123

Récemment mis à jour vers PHP 7.1 et commencez à recevoir l'erreur suivante

Avertissement: une valeur non numérique rencontrée en ligne 29

Voici à quoi ressemble la ligne 29

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

Sur localhost, tout fonctionne bien.

Des idées comment aborder ceci ou ce que c'est?

Imran Rafique
la source
4
var_dump($item['quantity'], $product['price'])
u_mulder
2
On dirait un nouvel avertissement dans PHP 7 (comme vous le savez). php.net/manual/en/migration71.other-changes.php Lorsque vous obtenez l'erreur, ces variables ont-elles des valeurs? Je pense que vous pourriez l'éviter en les initialisant à 0.
tjfo
1
@MichaelHanon où est la réponse à laquelle vous faites référence? quelle est l'erreur de syntaxe?
FKEinternet
1
$ sub_total + = ((int) $ item ['quantité'] * (int) $ produit ['prix']);
Je suis la personne la plus stupide
j'utilise un format hérité comme celui-ci a = a + b; ou str = str. "<a href='".str2."'> asd </a>"; ou $ this-> storeItems = $ this-> storeItems. $ str;
sabre tabatabaee yazdi

Réponses:

106

Il semble que dans PHP 7.1, un avertissement sera émis si une valeur non numérique est rencontrée. Voir ce lien .

Voici la partie pertinente qui se rapporte à l'avis d'avertissement que vous recevez:

De nouvelles erreurs E_WARNING et E_NOTICE ont été introduites lorsque des chaînes invalides sont forcées à l'aide d'opérateurs attendant des nombres ou leurs équivalents d'affectation. Un E_NOTICE est émis lorsque la chaîne commence par une valeur numérique mais contient des caractères non numériques de fin, et un E_WARNING est émis lorsque la chaîne ne contient pas de valeur numérique.

Je suppose que $ item ['quantity'] ou $ product ['price'] ne contient pas de valeur numérique, alors assurez-vous qu'ils le font avant d'essayer de les multiplier. Peut-être utiliser une sorte de conditionnel avant de calculer le $ sub_total, comme ceci:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}
DanielSchroederDev
la source
2
J'ai eu ce problème parce que j'avais encore quelques signes positifs dans l'asp que je transférais vers PHP. Ctrl + f et recherchez + caractères.
MH
Existe-t-il un moyen de désactiver cet avertissement via php.ini?
BeniRose
3
Merci. Je travaille sur un ancien projet Symfony 1.4, et il semble qu'il y ait quelques endroits où cela se produit intentionnellement, ce qui a été pénible. Cela devrait vraiment être un indicateur dans php.ini qui vous permet de désactiver ce niveau de rigueur.
BeniRose
9
Sinon, vous pouvez utiliser$sub_total += ((int)$item['quantity'] * (int)$product['price']);
Je suis la personne la plus stupide
2
Pour être juste, je ne désactiverais pas cela, c'est l'un des avertissements les plus utiles qui peuvent réellement vous amener à trouver un bogue - dans notre cas, un bug qui était en place depuis des années et qui n'avait pas été remarqué. Comme l'a dit Daniel, il n'apparaît que si vous essayez d'appliquer des mathématiques à une chaîne non numérique. Je ne vois pas de cas où ce serait le comportement souhaité. c'est-à-dire que "par défaut" * 86400 serait égal à 0 et sans cet avertissement, vous ne le sauriez jamais à moins que vous ne parcouriez le code.
Steve Childs
230

Pas exactement le problème que vous avez rencontré, mais la même erreur pour les personnes qui recherchent.

Cela m'est arrivé lorsque j'ai passé trop de temps sur JavaScript.

Pour en revenir à PHP, j'ai concaténé deux chaînes avec " +" au lieu de " ." et j'ai obtenu cette erreur.

Yassir Ennazk
la source
24
Cette fichue chose m'a fait trébucher en 2019, LOL. La concaténation de chaînes de PHP doit être restructurée!
Daniel Dut
2
Et ici 2 semaines après avoir fait nodejs et retourné à PHP, j'ai de nouveau rencontré cette erreur lol
imin
3
dès qu'une chaîne est tentée d'être concaténée avec a +, on suppose qu'il s'agit d'une intvaleur ... alors que les opérandes donnés ne sont pas de type de données numérique.
Martin Zeitler
1
haha, la même chose s'est produite avec moi, je passe trop de temps sur JS et quand il s'agit de PHP, j'essaye d'utiliser du code JS. Mais l'interpréteur PHP ne me laisse pas faire ça.
Hemant Sankhla
1
Oh mon Dieu. J'ai cherché sur Google pendant presque une heure pour découvrir que j'avais utilisé à la +place .. Merci!
marvinpoo
53

Vous pouvez résoudre le problème sans aucune nouvelle logique en convertissant simplement l'objet dans le nombre, ce qui empêche l'avertissement et équivaut au comportement de PHP 7.0 et inférieur:

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

(La réponse de Daniel Schroeder n'est pas équivalente car $ sub_total resterait non défini si des valeurs non numériques sont rencontrées. Par exemple, si vous imprimez $ sub_total, vous obtiendrez une chaîne vide, ce qui est probablement faux dans une facture. - par vous assurez que $ sub_total est un entier.)

Roland Seuhs
la source
4
c'est une mauvaise pratique. Vous devez filtrer vos entrées
Ciro Vargas
4
Cela semble être la meilleure réponse. Et pour autant que vous sachiez que ces valeurs proviennent de la base de données, vous n'aurez peut-être pas besoin de vous échapper.
MH
3
@Ciro Vargas: Cela dépend de l'application. Dans de nombreux cas, vous souhaitez qu'un entier non défini soit interprété comme zéro. Quoi qu'il en soit, c'est l'équivalent du comportement de PHP7.0 et ne nécessite pas de réécriture du code. (La réponse acceptée nécessite une réécriture.)
Roland Seuhs
@RolandSeuhs Je ne suis pas sûr de suivre, lors de la multiplication de deux chaînes, '24' * '10' produira 240 en PHP, '24' * null produira 0, mais '24' * 'cat' lancera l'erreur mentionnée ci-dessus car «cat» est une valeur non numérique. Vous pouvez convertir 'cat' en un entier, mais cela ne vous donnera pas non plus de sous-total significatif. Quant à ma solution, elle fonctionne pour déterminer si la quantité et le prix sont numériques. S'il s'agit de chaînes «24» et «10», il réussit, mais si l'une ou l'autre est une chaîne non numérique, elle échoue. Comment gérer le sous_total n'était pas vraiment mon objectif, désolé si cela se passait de cette façon.
DanielSchroederDev
3
***** PRIX devrait être (float) devrait mettre ça!
Bhavin Rana
25

Dans mon cas, c'était à cause de moi utilisé +comme dans un autre langage, mais en PHP, l'opérateur de concaténation de chaînes est ..

CodeToLife
la source
5

Cela m'arrivait spécifiquement sur PHPMyAdmin. Donc, pour répondre plus précisément à cela , j'ai fait ce qui suit:

Dans le fichier:

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

J'ai changé ceci:

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

Pour ça:

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

J'espère que cela sauvera quelqu'un d'un problème ...

coderama
la source
4

J'ai eu ce problème avec mon lien de pagination avant et arrière .... il suffit de définir (int) devant la variable $ Page + 1 et cela a fonctionné ...

<?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
la source
3

J'ai rencontré le problème dans phpmyadmin avec PHP 7.3. Merci @coderama, j'ai changé la ligne 855 des bibliothèques / DisplayResults.class.php de

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

dans

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

Fixé.

Henri
la source
3

Bonjour, Dans mon cas en utilisant (WordPress) et PHP7.4, je reçois un avertissement concernant un problème de valeur numérique. J'ai donc changé l'ancien code comme suit:

De:

$val = $oldval + $val;

À:

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

Maintenant, l'avertissement a disparu :)

Jodyshop
la source
2

Vérifiez si vous n'incrémentez pas avec une variable que sa valeur est une chaîne vide comme «».

Exemple:

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

foreach($integers as $integer) {
    $total += $integer;
}
Luiz Gustavo Martins
la source
Super, c'est un cas manqué dans la plupart des autres réponses.
Trendfischer
1

Essaye ça.

$sub_total = 0;

et dans votre boucle, vous pouvez maintenant utiliser ceci

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

Cela devrait résoudre votre problème.

Wadday
la source
1

Je viens de regarder cette page car j'avais ce problème. Pour moi, j'avais des nombres à virgule flottante calculés à partir d'un tableau, mais même après avoir désigné les variables comme des points flottants, l'erreur était toujours donnée, voici le correctif simple et l'exemple de code en dessous qui causaient le problème.

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

la source
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

}

c'est le code que j'avais qui a bouclé et créé de nouveaux éléments div html. Le code a bien fonctionné et les éléments ont été formés, mais j'ai reçu le même avertissement dans le journal d'erreur.

Après avoir lu les autres réponses utiles, j'ai pensé que je résumais une chaîne et un nombre dans la ligne erronée. J'ai donc changé le code de cette ligne en

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

Maintenant, le code fonctionne comme précédemment mais sans avertissement cette fois. J'espère que cet exemple serait utile à quelqu'un.

Néo
la source
1

Résolvez cette erreur sur WordPress

Avertissement: une valeur non numérique rencontrée dans C: \ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.php à la ligne 694

Solution simple ici!

  1. localiser un fichier de wp-includes\SimplePie\Parse\Date.php
  2. trouver une ligne no. 694
  3. vous montrez le code $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. et changez ceci 3.) sur cette ligne $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
Nasirkhan Pathan
la source
1
$sub_total_price = 0; 

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

echo $sub_total_price;

ça marche à 100% :)

Imran Imu
la source
1

Cela se produit généralement lorsque vous con-cat des chaînes avec le signe +. En PHP, vous pouvez faire une concaténation en utilisant le signe point (.) Donc, parfois, je mets accidentellement le signe + entre deux chaînes en PHP, et cela me montre cette erreur, car vous ne pouvez utiliser que des chiffres + signe.

ASammour
la source
0

Assurez-vous que la structure de votre colonne est INT.

Borgy ES
la source
0

Si une valeur non numérique est rencontrée dans votre code, essayez en dessous de un. Le code ci-dessous est converti en float.

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

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

 echo $PlannedAmount; //output = 0
mallikarjun SK
la source
0

en PHP si vous utilisez + pour la concaténation, vous vous retrouverez avec cette erreur. En php + est un opérateur arithmétique . https://www.php.net/manual/en/language.operators.arithmetic.php

mauvaise utilisation de l'opérateur +:

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

utiliser . pour la concaténation

$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>";
Seigneur
la source