web-dev-qa-db-fra.com

Avertissement: une valeur non numérique rencontrée

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

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

Voici à quoi ressemble la ligne 29

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

Sur localhost tout fonctionne bien ..

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

75
Imran Rafique

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

Voici la partie pertinente qui concerne l'avertissement que vous recevez:

De nouvelles erreurs E_WARNING et E_NOTICE ont été introduites lorsque des chaînes non valides sont forcées à l'aide d'opérateurs qui attendent 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 devine soit $ item ['quantité'] ou $ produit ['prix'] ne contient pas de valeur numérique, assurez-vous de le faire avant d'essayer de les multiplier. Peut-être utiliser une sorte de condition 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...
}
67
Daniel.Schroeder

Pas exactement le problème que vous aviez mais la même erreur pour les personnes cherchant.

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

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

115
Yassir Ennazk

Vous pouvez résoudre le problème sans nouvelle logique en insérant simplement l'élément dans le nombre, ce qui empêche l'avertissement et équivaut au comportement décrit dans PHP 7.0 et les versions suivantes:

$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 affichez $ sub_total, vous obtiendrez une chaîne vide, ce qui est probablement faux dans une facture. - par vous assurez-vous que $ sub_total est un entier.)

42
Roland Seuhs

Dans mon cas, c’est à cause de moi que "+" est utilisé comme dans une autre langue, mais que dans PHP, la concaténation de chaînes est "." .

12
CodeToLife

Cela m'arrivait spécifiquement sur PHPMyAdmin. Donc, pour répondre plus précisément this , 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 sauver quelqu'un est un problème ...

5
coderama

J'ai eu ce problème avec ma pagination lien en avant et en arrière .... simplement placé (int) en face de 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 }
?>
3
bappi

J'ai rencontré le problème dans phpmyadmin avec PHP 7.3. Merci @coderama, j'ai changé la bibliothèque/DisplayResults.class.php line 855 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é.

2
Henry

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

Exemple:

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

foreach($integers as $integer) {
    $total += $integer;
}
2
$sub_total_price = 0; 

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

echo $sub_total_price;

ça marche à 100% :)

1
Imran Imu

Je viens de regarder cette page car j'ai eu ce problème. Pour moi, les nombres en virgule flottante étaient calculés à partir d’un tableau, mais même après avoir désigné les variables comme étant des virgules flottantes, l’erreur était toujours signalée.

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

Essaye ça.

$sub_total = 0;

et dans votre boucle maintenant, vous pouvez utiliser cette

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

Cela devrait résoudre votre problème.

1
Wadday

Résoudre 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 affichez le code $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. et changez ce 3.) en cette ligne $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
1
Nasirkhan Pathan

Cela se produit généralement lorsque vous jouez avec des signes +. Dans PHP, vous pouvez effectuer une concaténation en utilisant le signe de point (.) Ainsi, parfois, je mets accidentellement le signe + entre deux chaînes de caractères en PHP, et cette erreur me montre que vous pouvez utiliser le signe + uniquement.

1
ASammour
$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'ai eu 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 error_log.

Après avoir lu les autres réponses utiles, je pensais résumer une chaîne et un nombre dans la ligne erronée. J'ai donc changé le code sur 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 auparavant, mais sans avertissements cette fois. J'espère que cet exemple serait utile à quelqu'un.

1
Neo

Assurez-vous que votre structure de colonne est INT.

0
Borgy ES