Предупреждение: обнаружено нечисловое значение


123

Недавно обновлен до PHP 7.1 и начинает получать следующую ошибку

Предупреждение: в строке 29 обнаружено нечисловое значение

Вот как выглядит строка 29

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

На localhost все работает нормально ..

Есть идеи, как с этим справиться или что это такое?


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

2
Похоже на новое предупреждение в PHP 7 (как вы знаете). php.net/manual/en/migration71.other-changes.php Когда вы получаете сообщение об ошибке, имеют ли эти переменные значения? Я думаю, вы могли бы избежать этого, установив для них значение 0.
tjfo 04

1
@MichaelHanon, где ответ, о котором вы говорите? в чем ошибка синтаксиса?
FKEinternet

1
$ sub_total + = ((int) $ item ['количество'] * (int) $ product ['цена']);
Я самый глупый человек

Я использую устаревший формат, например: a = a + b; или str = str. "<a href='".str2."'> asd </a>"; или $ this-> storeItems = $ this-> storeItems. $ str;
saber tabatabaee yazdi

Ответы:


106

Похоже, что в PHP 7.1 при обнаружении нечислового значения будет выдано предупреждение. См. Эту ссылку .

Вот соответствующая часть получаемого вами предупреждения:

Были введены новые ошибки E_WARNING и E_NOTICE, когда недопустимые строки приводятся с использованием операторов, ожидающих числа или их эквиваленты присваивания. E_NOTICE выдается, когда строка начинается с числового значения, но содержит завершающие нечисловые символы, а E_WARNING выдается, когда строка не содержит числового значения.

Я предполагаю, что $ item ['количество'] или $ product ['price'] не содержат числового значения, поэтому убедитесь, что они содержат, прежде чем пытаться их умножить. Возможно, перед вычислением $ sub_total используйте какое-то условие, например:

<?php

if (is_numeric($item['quantity']) && is_numeric($product['price'])) {
  $sub_total += ($item['quantity'] * $product['price']);
} else {
  // do some error handling...
}

2
У меня была эта проблема, потому что у меня все еще было несколько плюсов в asp, которые я переводил на PHP. Ctrl + f и найдите символы +.
MH

Есть ли способ отключить это предупреждение через php.ini?
BeniRose

3
Спасибо. Я работаю над унаследованным проектом Symfony 1.4, и, похоже, есть несколько мест, где это происходит намеренно, что было проблемой. Это действительно должен быть флаг в php.ini, позволяющий отключить этот уровень строгости.
BeniRose

9
Как вариант, вы можете использовать$sub_total += ((int)$item['quantity'] * (int)$product['price']);
Я самый глупый человек

2
Честно говоря, я бы не стал выключать это, это одно из наиболее полезных предупреждений, которое может фактически привести вас к обнаружению ошибки - в нашем случае той, которая существовала годами и не замечена. Как сказал Даниэль, он появляется только в том случае, если вы пытаетесь применить математику к нечисловой строке. Я не вижу случая, когда это было бы желаемым поведением. т.е. "default" * 86400 будет равно 0, и без этого предупреждения вы никогда не узнаете, если не пройдете через код.
Стив Чайлдс

231

Не совсем то, что у вас было, но та же ошибка для поиска людей.

Это случилось со мной, когда я потратил слишком много времени на JavaScript.

Возвращаясь к PHP, я объединил две строки с « +» вместо « .» и получил эту ошибку.


24
Эта чертова штука сбила меня с толку в 2019 году, LOL. Конкатенация строк в PHP нуждается в реструктуризации!
Daniel

2
И вот через 2 недели после выполнения nodejs и возврата к PHP я снова столкнулся с этой ошибкой lol
imin

3
как только строка пытается быть объединена с a +, предполагается, что это intзначение ... в то время как указанные операнды не имеют какого-либо числового типа данных.
Мартин

1
ха-ха, со мной случилось то же самое, я слишком много времени трачу на JS, а когда дело касается PHP, я стараюсь использовать JS-код. Но интерпретатор PHP не позволяет мне этого делать.
Hemant Sankhla

1
О Боже. Я искал в Google почти целый час, чтобы узнать, что использовал +вместо .. Спасибо!
marvinpoo 02

53

Вы можете решить проблему без какой-либо новой логики, просто добавив значение в число, что предотвращает предупреждение и эквивалентно поведению в PHP 7.0 и ниже:

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

(Ответ Дэниела Шредера не эквивалентен, потому что $ sub_total останется неустановленным, если встречаются нечисловые значения. Например, если вы распечатаете $ sub_total, вы получите пустую строку, которая, вероятно, неверна в счете-фактуре. - by при кастинге убедитесь, что $ sub_total является целым числом.)


4
это плохая практика. Вам нужно отфильтровать свои входные данные
Сиро Варгас

4
Кажется, это лучший ответ. И, насколько вы знаете, эти значения взяты из базы данных, вам может не понадобиться бежать.
MH

3
@Ciro Vargas: Это зависит от приложения. Во многих случаях вы хотите, чтобы неопределенное целое число интерпретировалось как ноль. В любом случае это эквивалент поведения PHP7.0 и не требует переписывания кода. (Принятый ответ требует переписывания.)
Роланд Сеус,

@RolandSeuhs Я не уверен, что следую, при умножении двух строк, '24' * '10' даст 240 в PHP, '24' * null даст 0, но '24' * 'cat' выдаст указанную ошибку выше, потому что «кошка» - это нечисловое значение. Вы можете преобразовать cat в int, но это также не даст вам значимого промежуточного итога. Что касается моего решения, оно работает для определения того, являются ли количество и цена числовыми. Если это строки «24» и «10», он проходит, но если это нечисловая строка, он не выполняется. То, как разбираться с sub_total, на самом деле не было моей целью, извините, если так вышло.
DanielSchroederDev

3
***** ЦЕНА должна быть (плавающая) надо поставить!
Бхавин Рана

25

В моем случае это было из-за того, что я использовал +как на другом языке, но в операторе конкатенации строк PHP есть ..


5

Это происходило со мной специально на PHPMyAdmin. Чтобы более конкретно ответить на этот вопрос , я сделал следующее:

В файле:

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

Я изменил это:

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

К этому:

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

Надеюсь, что у кого-то будут проблемы ...


4

У меня была эта проблема с моей прямой и обратной ссылками на страницы .... просто установите (int) перед переменной $ Page + 1, и это сработало ...

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

Я столкнулся с проблемой в phpmyadmin с PHP 7.3. Спасибо @coderama, я изменил библиотеки / DisplayResults.class.php строку 855 с

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

в

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

Исправлена.


3

Здравствуйте! В моем случае, использующем (WordPress) и PHP7.4, я получаю предупреждение о проблеме с числовым значением. Поэтому я изменил старый код следующим образом:

Из:

$val = $oldval + $val;

Кому:

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

Теперь предупреждение исчезло :)


2

Убедитесь, что вы не увеличиваете с помощью какой-либо переменной, что ее значение является пустой строкой, например ''.

Пример:

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

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

Супер, это случай, упущенный в большинстве других ответов.
Trendfischer

1

Попробуй это.

$sub_total = 0;

и теперь в вашем цикле вы можете использовать это

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

Это должно решить вашу проблему.


1

Я только что посмотрел на эту страницу, так как у меня была эта проблема. Для меня у меня были числа с плавающей запятой, вычисленные из массива, но даже после обозначения переменных как с плавающей запятой ошибка все еще давалась, вот простое исправление и пример кода ниже, которые вызывали проблему.

Пример 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
$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

}

это код, который у меня был, который зацикливал и создавал новые элементы div html. Код работал нормально и элементы были сформированы, но я получил такое же предупреждение в error_log.

Прочитав другие полезные ответы, я решил, что суммирую строку и число в ошибочной строке. Поэтому я изменил код в этой строке на

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

Теперь код работает как раньше, но на этот раз без предупреждений. Надеюсь, этот пример будет кому-то полезен.


1

Решите эту ошибку на WordPress

Предупреждение: нечисловое значение встречается в C: \ XAMPP \ htdocs \ aad-2 \ wp-includes \ SimplePie \ Parse \ Date.php в строке 694

Здесь простое решение!

  1. найти файл wp-includes\SimplePie\Parse\Date.php
  2. найдите строку нет. 694
  3. вы показываете код $second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
  4. и измените это 3.) на эту строку $second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));

1
$sub_total_price = 0; 

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

echo $sub_total_price;

работает 100% :)


1

Это обычно случается, когда вы соединяете строки со знаком +. В PHP вы можете выполнить конкатенацию, используя знак точки (.) Поэтому иногда я случайно помещаю знак + между двумя строками в PHP, и он показывает мне эту ошибку, поскольку вы можете использовать знак + только в числах.



0

Если в вашем коде встречается нечисловое значение, попробуйте указать ниже. Приведенный ниже код преобразуется в float.

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

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

 echo $PlannedAmount; //output = 0

0

в PHP, если вы используете + для конкатенации, вы получите эту ошибку. В php + это арифметический оператор. https://www.php.net/manual/en/language.operators.arithmetic.php

неправильное использование оператора +:

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

использовать . для конкатенации

$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>";
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.