186 votes

Avertissement : Une valeur non numérique a été rencontrée

Récemment mis à jour vers PHP 7.1 et commencé à obtenir l'erreur suivante

Warning: Une valeur non numérique a été rencontrée sur la ligne 29

Voici à quoi ressemble la ligne 29

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

Sur localhost tout fonctionne bien..

Des idées sur la façon de résoudre cela ou ce que c'est ?

8 votes

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

4 votes

Il semble qu'il s'agisse d'un nouvel avertissement en 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.

1 votes

@MichaelHanon où se trouve la réponse à laquelle vous faites référence? Quelle est l'erreur de syntaxe?

450voto

Yassir Ennazk Points 580

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

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

En revenant à PHP, j'ai concaténé deux chaînes avec + au lieu de . et j'ai obtenu cette erreur.

0 votes

Dommage, je viens de me gratter la tête et bien sûr. J'ai quelque chose comme $a = "lorem" . $var-1 . "ipsum". En mettant entre parenthèses $a = "lorem" . ($var-1) . "ipsum", cela a résolu le problème.

40 votes

Cette fichue chose m'a joué un tour en 2019, LOL. La concaténation de chaînes de PHP doit être restructurée!

7 votes

Et ici, 2 semaines après avoir travaillé avec nodejs et être retourné à PHP, j'ai de nouveau rencontré cette erreur lol

140voto

Daniel.Schroeder Points 1147

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

Voici la partie pertinente concernant l'avertissement que vous recevez :

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

Je suppose que $sous_total, $item['quantity'] ou $product['price'] ne contient pas une valeur numérique, donc vous devez commencer à les déboguer, par exemple,

var_dump($sous_total, $item['quantity'], $product['price']);

et voir lequel est incorrect pour ensuite corriger la source de la valeur incorrecte.

Lorsque vous traitez des entrées utilisateur, assurez-vous que les valeurs contiennent une valeur numérique avant de les traiter. Peut-être utilisez une sorte de condition avant de calculer le $sous_total, comme ceci :

``

Seulement dans un cas rare, lorsque vous savez positivement qu'une certaine valeur non numérique peut être utilisée dans les calculs, vous pouvez la convertir en type numérique. Par exemple, dans certains codes hérités une chaîne vide peut être utilisée dans les calculs, ce qui était silencieusement converti en 0 dans les versions de PHP précédentes. Ici, vous pouvez ajouter une condition pour cette valeur exacte :

$item['quantity'] = ($item['quantity'] === "" ? 0 : $item['quantity']);
$sous_total += $item['quantity'] * $product['price'];

ce code ignorera une chaîne vide mais vous avertira si une autre valeur inattendue est rencontrée.

Mieux encore, assurez-vous simplement que $item['quantity'] est toujours de type numérique, de préférence en utilisant le système d'indication de type de PHP.

``

3 votes

J'ai eu ce problème parce que j'avais encore quelques signes plus dans le asp que je transférais en PHP. Ctrl+f et chercher les caractères +.

0 votes

Y a-t-il un moyen de désactiver cet avertissement via php.ini?

1 votes

@BeniRose L'avertissement ne sera lancé que si vous essayez d'appliquer des mathématiques à des valeurs non numériques, donc si vous essayez de multiplier les chaînes 'chat' * '10', il affichera une erreur. Si vous essayez '10' * '10', vous n'aurez aucun avertissement et l'entier 100. Désactiver cela pourrait être une mauvaise idée je pense. Voici quelques liens vers la documentation PHP qui pourraient vous aider si vous souhaitez le désactiver. php.net/manual/en/… php.net/manual/en/configuration.file.php

68voto

Roland Seuhs Points 1057

Avertissement de la communauté : utilisez la réponse suivante à vos propres risques. Le cast des valeurs de manière inconditionnelle peut entraîner des résultats inattendus. $a = "1,5"; $b = 2; echo (int)$a * (int)$b; vous donnerait silencieusement 2. $a = "$1500"; $b = 2; echo (int)$a * (int)$b; vous donnerait silencieusement zéro.

Vous pouvez résoudre le problème sans aucune nouvelle logique en castant simplement la chose en nombre, ce qui évite l'avertissement et est équivalent au comportement en PHP 7.0 et en dessous :

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

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

7 votes

C'est une mauvaise pratique. Vous devez filtrer vos entrées.

4 votes

Il semble que ce soit la meilleure réponse. Et pour tout ce que vous savez, ces valeurs proviennent de la base de données, vous n'avez peut-être pas besoin d'échapper.

3 votes

@Ciro Vargas: Cela dépend de l'application. Dans de nombreux cas, vous voulez qu'un entier indéfini soit interprété comme zéro. Quoi qu'il en soit, il s'agit de l'équivalent du comportement de PHP7.0 et ne nécessite pas une réécriture du code. (La réponse acceptée nécessite une réécriture.)

43voto

aladin Points 11

Dans mon cas, c'était parce que j'avais utilisé + comme dans d'autres langages mais en PHP l'opérateur de concaténation de chaînes est ..

5voto

coderama Points 2017

Cela m'arrivait spécifiquement sur PHPMyAdmin. Pour répondre plus spécifiquement à ceci, j'ai fait ce qui suit :

Dans le fichier :

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

J'ai changé ceci :

// Passer à la page suivante ou à la dernière
$endpos = $_SESSION['tmpval']['pos']
    + $_SESSION['tmpval']['max_rows'];

Par ceci :

$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 évitera des problèmes à quelqu'un...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X