Попередження: зустрічається нечислове значення


122

Нещодавно оновлено до PHP 7.1 і почніть отримувати наступні помилки

Попередження: нечислове значення, що зустрічається у рядку 29

Ось як виглядає рядок 29

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

У localhost все працює чудово ..

Будь-які ідеї, як боротися з цим чи що це?


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

2
Виглядає як нове попередження в PHP 7 (як вам відомо). php.net/manual/en/migration71.other-changes.php Коли ви отримуєте помилку, чи мають ці змінні значення? Я думаю, ви могли цього уникнути, ініціюючи їх до 0.
tjfo

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
Чесно кажучи, я б не вимикав це, його одне з корисніших попереджень, яке насправді може призвести до пошуку помилки - у нашому випадку - таке, яке було роками і не помічено. Як сказав Даніель, це з’являється лише якщо ви спробуєте застосувати математику до нечислового рядка. Я не бачу випадку, коли це була б бажана поведінка. тобто "за замовчуванням" * 86400 дорівнюватиме 0 і без цього попередження ви ніколи не дізнаєтесь, якщо не трапиться через код.
Стів Чайлдс

230

Не зовсім проблема, яка ви мали, але така ж помилка для людей, які шукали.

Це сталося зі мною, коли я занадто багато часу витратив на JavaScript.

Повертаючись до PHP, я з'єднав два рядки з " +" замість " ." і отримав цю помилку.


24
Ця проклята річ спонукала мене в 2019 році, LOL. З'єднання рядків PHP потрібно реструктурувати!
Даніель

2
І ось через 2 тижні після того, як я роблю nodejs і повертаюся назад до PHP, я знову зіткнувся з цією помилкою lol
imin

3
як тільки рядок намагається об'єднати з a +, передбачається, що це intзначення ... в той час як дані операнди не мають жодного числового типу даних.
Мартін

1
Так, так само і зі мною, я витрачаю занадто багато часу на JS, а коли мова заходить про PHP, я намагаюся використовувати код JS. Але інтерпретатор PHP не дозволить мені це зробити.
Hemant Sankhla

1
Боже мій. Я майже цілу годину гугла, щоб дізнатися, що я використовувала +замість цього .. Дякую!
marvinpoo

52

Ви можете вирішити проблему без будь-якої нової логіки, просто вставивши річ у номер, що запобігає попередженню та еквівалентно поведінці в PHP 7.0 і нижче:

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

(Відповідь Даніеля Шредера не є еквівалентною, оскільки $ sub_total залишатиметься невідомим, якщо зустрічаються нечислові значення. Наприклад, якщо ви роздрукуєте $ sub_total, ви отримаєте порожній рядок, який, ймовірно, неправильний у рахунку-фактурі. - ви переконайтеся, що $ sub_total є цілим числом.)


4
це погана практика. Вам потрібно відфільтрувати свої дані
Ciro Vargas

3
Це, здається, найкраща відповідь. І оскільки ви знаєте, що ці значення надходять із бази даних, вам, можливо, не потрібно буде бігти.
MH

3
@Ciro Vargas: Це залежить від програми. У багатьох випадках ви хочете, щоб невизначене ціле число було інтерпретовано як нуль. У будь-якому випадку це еквівалент поведінки PHP7.0 і не потребує перезапису коду. (Відповідь потрібна для перезапису.)
Роланд Сеуз

@RolandSeuhs Я не впевнений, що слідую, коли множувати два рядки, '24' * '10' дасть 240 в PHP, '24' * null призведе до 0, але '24' * 'cat' видасть згадану помилку вище, тому що "cat" - це нечислове значення. Ви можете кинути "cat" на int, але це також не дасть вам значущої підсумкової інформації. Що стосується мого рішення, воно працює для визначення того, чи є кількість і ціна числовими. Якщо вони є рядками '24' і '10', це передається, але якщо будь-який є нечисловим рядком, він не працює. Те, як подолати sub_total, насправді не було моєю метою, вибачте, якщо воно вийшло саме так.
DanielSchroederDev

3
***** ЦІНА повинна бути (float), що повинна ставити це!
Бхавін Рана

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

}

це код, який я мав циклічно і створював нові елементи html div. Код спрацював нормально, і елементи були сформовані, але я отримав те саме попередження в log_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-include \ 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

Якщо у вашому коді виникає нечислове значення, спробуйте нижче одного. Наведений нижче код перетворюється на плаваючий.

$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.