A non well formed numeric value encountered ошибка

This error occurs when you perform calculations with variables that use letters combined with numbers (alphanumeric), for example 24kb, 886ab …

I had the error in the following function

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);       
    switch($last) {
        case 'g':
            $val *= 1024;
        case 'm':
            $val *= 1024;
        case 'k':
            $val *= 1024;
    }
    return $this->fix_integer_overflow($val);
}

The application uploads images but it didn’t work, it showed the following warning:

enter image description here

Solution: The intval() function extracts the integer value of a variable with alphanumeric data and creates a new variable with the same value but converted to an integer with the intval() function. Here is the code:

function get_config_bytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $intval = intval(trim($val));
    switch($last) {
        case 'g':
            $intval *= 1024;
        case 'm':
            $intval *= 1024;
        case 'k':
            $intval *= 1024;
    }
    return $this->fix_integer_overflow($intval);
}

The function fix_integer_overflow

// Fix for overflowing signed 32 bit integers,
// works for sizes up to 2^32-1 bytes (4 GiB - 1):
protected function fix_integer_overflow($size) {
    if ($size < 0) {
        $size += 2.0 * (PHP_INT_MAX + 1);
    }
    return $size;
}

Почему возникла данная ошибка? Я знаю, что возникает она при математических действиях разных типов данных.
У меня 2 числа, целых.
Это может быть причиной того, что я получаю число из бд?


  • Вопрос задан

  • 1804 просмотра

Эта ошибка выдается (начиная с PHP 7.1) при использовании строк с операторами, ожидающими числа (+, -, …), когда строка начинается с цифр, но далее содержит не цифровые символы. Наверняка в базе сохранено число в текстовом поле и там присутствуют пробелы или непечатаемые символы (tab …). В большинстве случаев достаточно убрать лишние символы командой «trim(…)», но правильнее будет использовать типизацию и сохранять в базе целое число в поле соответствующего типа.

Пригласить эксперта


  • Показать ещё
    Загружается…

21 сент. 2023, в 08:33

10000 руб./за проект

21 сент. 2023, в 08:28

47000 руб./за проект

21 сент. 2023, в 07:57

20000 руб./за проект

Минуточку внимания

Потихоньку перехожу с PHP 5.6 на PHP7 (а точнее, сразу на 7.1). Ответ на вопрос «Зачем?» выходит за рамки данной заметки, поэтому сразу к сути. Если вы тоже решили обновить версию ПХП, вы можете столкнуться с рядом неприятных ошибок, одна из которых возникает из-за ужесточения правил работы числовых операторов, начиная с версии 7.1.

Новые ошибки уровней E_WARNING и E_NOTICE были добавлены при использовании некорректных строк с операторами, ожидающими числа (+ * / ** % << >> | & ^) и их эквивалентами с присваиванием. Ошибка уровня E_NOTICE выдается, когда строка начинается с цифр, но далее содержит не цифровые символы, и ошибка уровня E_WARNING выдается тогда, когда строка вообще не содержит цифр.

В ПХП версии 7.0 и ниже следующий код будет работать без ошибок:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
$a = 1 + '1text'; echo $a; // 2
$b = 1 + 'text'; echo $b; // 1
$c = ''; $d = 1 + $c; echo $d; // 1

В ПХП версии 7.1 и выше это код выдаст нотис в 5-ой строке, а также ворнинги в 8-ой и 12-ой:

Notice: A non well formed numeric value encountered in test.php on line 5
2
Warning: A non-numeric value encountered in test.php on line 8
1
Warning: A non-numeric value encountered in test.php on line 12
1

Первые два случая особых проблем не вызывают, потому что, если у вас в проекте встречается код, в котором математические операции выполняются над буквами, проблема явно не в ПХП.

А вот третий случай — числовые операции с пустой строкой — часто встречается в реальных проектах. Пустая строка в подобных случаях всегда считалась нулём. Так может быть, например, если вы берёте какое-то числовое значение из конфига, а оно не заполнено. Я заметил, что даже многие библиотеки подвержены данной проблеме.

Решение — одновременно простое и сложное. Нужно добавить явное приведение типа:

$c = '';
$d = 1 + (int)$c;

Проблема в том, что это приходится делать вручную, отследить все такие места автоматически, увы, не получится. И это ворнинг, а не нотис, поэтому отключение через error_reporting(E_ALL & ~E_NOTICE); не сработает. Или надо отключать все ворнинги, а это очень плохая идея.

The comment from OpaJaap to my article https://www.drafie-design.nl/set-suffusion-to-be-responsive/ was inspired me and woke me up to look again at codes.

If you don’t know who is Jacob N. Breetvelt aka OpaJaap, take a look at his brilliant plugin: WP Photo Album Plus. For old users who’s remembers and liked the functionality of PhotoSmash Galleries, the plugin of OpaJaap is the best solution for trying to. The plugin have literally hundreds of options and can be settled in each detail to obtain exactly the look and feel you need. The options are full documented at WPPA site, but also OpaJaap actively support it on WordPress forums.

For me, this guy is a legend, so, you can understand for what I tried immediately to solve the problems reported in his comment.

He said:

“I run php 7.2 and get a lot of errors like:
Methods with the same name as their class will not be constructors in a future version of PHP; Suffusion_Widgets has a deprecated constructor in …/wp-content/themes/suffusion/widgets/suffusion-widgets.php on line 10
and al lot of non-welformed numbers.”

I solved the problem of constructor methods last night and I published the results in my post: Solving the warnings generated by Suffusion on servers with PHP 7+

But I couldn’t see the problem with the numbers until now. As I told to OpaJaap in my reply, I always set “Auto-generate the CSS and print it in the HTML source (Least load on server, ugly page source code)” at the first option from Suffusion Options -> Back-end -> Site Optimization. By settling this, the warnings are avoided, no problem with numbers.

But on a new installation or on sites where that option remain default to “Auto-generate the CSS and link it as a file (Low load on server, elegant page source code)”, will observe in debug.log 3 notices like:

PHP Notice: A non well formed numeric value encountered in …../wp-content/themes/suffusion/suffusion-css-helper.php on line 426

OpaJaap was very kind and sent the explanation for warning and the fixes. They are quoted below:

– wp-content/themes/suffusion/suffusion-css-helper.php on line 426:
should read:

$content_width is_numeric( $widths[‘main-col’] ) ? $widths[‘main-col’] 30 : $widths[‘main-col’]; // Account for padding on the sides

The error comes when $widths[‘main-col’] contains e.g. ‘100%’ . One can not substract 30 from 100%

Same cause in /wp-content/themes/suffusion/suffusion-css-generator.php on line 419 and 420 (version 4.5.0, in 4.4.9: lines 403 and 404):
They should read:

div.bookentry .review { width: «.(is_numeric($widths[‘main-col’])?($widths[‘main-col’] — suffusion_get_numeric_size_from_field($suf_nr_main_cover_w, 108) — 80).»px«:$widths[‘main-col’]).»; }

#ie6 div.bookentry .review { width: «.(is_numeric($widths[‘main-col’])?($widths[‘main-col’] — suffusion_get_numeric_size_from_field($suf_nr_main_cover_w, 108) — 100).»px»:$widths[‘main-col’]).»; }

I made all changes in files and I assembled a new version of theme, thinking that will be easier for users to upgrade this way instead of replacing particular files.

Enjoy:  Suffusion 4.5.1

Post Views: 17

When you using @foreach value in a variable in your blade file and put any value and using any Mathematics function in your value for showing your document this type of error.


 @foreach($allcourses as $i => $allclass)

	<p>{{$allclass['total_fees_of_class']}}</p>
            <?php 
                        $fee = $allclass['total_fees_of_class']; 
                        $c = ($fee);
                        $a = (100);
                        $d = (20);
                        $e = $c * $d / $a;
                        $fee = $c + $e;
           ?>

               <span>
               		<b>{{$fee}}</b>
               </span>
@endforeach

Then, You can add (int) as prefix in your foreach value as “$c = (int)($fee);” and write as below code

               <?php 
                    $fee = $allclass['total_fees_of_class']; 
                    $c = (int)($fee);
                    $a = (100);
                    $d = (20);
                    $e = $c * $d / $a;
                    $fee = $c + $e;
               ?>

Your program will run.

  • Author
  • Recent Posts

Tagged : encountered / laravel / non well formed / numeric value / Syntax ERROR

Понравилась статья? Поделить с друзьями:
  • A d3d11 compatible gpu как исправить ошибку
  • A0b2 ошибка бмв е60
  • A0b2 ошибка bmw e60
  • A0b1 ошибка bmw e70
  • A generic error occurred in gdi ошибка