Ошибка warning a non numeric value encountered in

I received this error after adding two formatted variables using the number_format() method. The reason is because this method usually formats your number with a , unless you specified the optional separator argument as null. For example, let’s say I have the following code:

$subtotal = 6556.7;
$vat = number_format(0.175 * $subtotal, 2);            // 1,147.42
$transactionfee = number_format(0.02 * $subtotal, 2);  // 131.13
$total = $subtotal + $vat + $transactionfee;           // 6556.7 + 1,147.42 + 131.13 = ERROR

This would trigger the following error because one of the variables contains a , which is invalid for a float type:

Warning: A non-numeric value encountered …

The number_format() method has the following method signature:

number_format(number,decimals,decimalpoint,separator).

By specifying the separator argument as '', this error could be fixed as follows:

$subtotal = 6556.7;
$vat = number_format(0.175 * $subtotal, 2, '.', '');           //1147.42
$transactionfee = number_format(0.02 * $subtotal, 2, '.', ''); //131.13
$total = $subtotal + $vat + $transactionfee;   // // 6556.7 + 1147.42 + 131.13 = 7835.25

Потихоньку перехожу с 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); не сработает. Или надо отключать все ворнинги, а это очень плохая идея.

С некоторых недавних пор владельцам сайтов доступен переход на обновлённую версию php 7.1, в частности ! на хостинге Джино теперь возможно перевести аккаунт аккурат на новую версию! (перед этим работала версия 7.0) — переход осуществляется легко и просто! (кто не знает как, ссылка на статью чуть ниже), однако — сегодня разговор не об этом.

Любое обновление, это, конечно, нужное дело! но вместе с обновлением могут прийти и какие-то ошибки в работу сайта, — например, я столкнулся с такой закавыкой: выскочило предупреждение в блоке, где использовались миниатюры постов. Предупреждение гласило Warning: A non-numeric value encountered in /home/users/c/что-то_ещё/domains/домен.ru/wp-includes/media.php on line 647 …это сообщает нам о том, что в операциях php обработки используются не числовые значения! …далее подробнее…с вариантами решения задачи…

  • как отключить предупреждение на фронтенде о не числовой php обработке

  • как отключить проверку не числовых значений в wp-config.php

как отключить предупреждение на фронтенде о не числовой php обработке

Warning: A non-numeric value encountered in …

Во-первых, нужно пояснить: данное сообщение всего-то предупреждение (в PHP 7.1), но не ошибка! — предупреждение!

Предупреждение сообщает о том, что в php операциях используются так называемые не числовые значения (можете воспользоваться, к примеру, Гугл переводчиком).

Далее в сообщении на сайте указаны путь к файлу и номер строки, в которой сгенерировано это предупреждение.

включить поддержку php 7.1 джино

Отключить вывод warning-предупреждения можно таким способом: (сразу говорю: этот вариант не совсем правильный; или совсем — не правильный, ибо мы предполагаем править ядро WP, а это нецелесообразно, ибо с очередными обновами WP правки затрутся!) рассматриваем его только знаний для (следующий способ из статьи — более верное решение…).

…а пока путь таков:

/wp-includes/media.php

…пройдя по которому, нужно отыскать функцию:

Функция: function wp_image_matches_ratio

/**
* Helper function to test if aspect ratios for two images match.
*
* @since 4.6.0
*
* @param int $source_width Width of the first image in pixels.
* @param int $source_height Height of the first image in pixels.
* @param int $target_width Width of the second image in pixels.
* @param int $target_height Height of the second image in pixels.
* @return bool True if aspect ratios match within 1px. False if not.
*/
function wp_image_matches_ratio( $source_width, $source_height, $target_width, $target_height ) {
/*
* To test for varying crops, we constrain the dimensions of the larger image
* to the dimensions of the smaller image and see if they match.
*/
if ( $source_width > $target_width ) {
$constrained_size = wp_constrain_dimensions( $source_width, $source_height, $target_width );
$expected_size = array( $target_width, $target_height );
} else {
$constrained_size = wp_constrain_dimensions( $target_width, $target_height, $source_width );
$expected_size = array( $source_width, $source_height );
}

// If the image dimensions are within 1px of the expected size, we consider it a match.
//if (is_numeric($constrained_size[0]) && is_numeric($expected_size[0])) { //это добавил
$matched = ( abs( $constrained_size[0] - $expected_size[0] ) <= 1 && abs( $constrained_size[1] - $expected_size[1] ) <= 1 );

return $matched;
//это добавил - закр. скобка }
}

Сама функция (ниже её имя): добавлена в WP 4.6 для коррекции и сверки параметров медиафайлов, скажем так, в свете сегодняшней темы:

function wp_image_matches_ratio( $source_width, $source_height, $target_width, $target_height )

призвана как:

Helper function to test if aspect ratios for two images match —

Вспомогательная функция для проверки, если пропорции двух картинок совпадают…

…и возвращает: return bool

True if aspect ratios match within 1px. False if not. —

true, если соотношения сторон совпадают 1px. false если нет.

И вот, коли какие-то несоответствия размеров обнаружены в связке ядра шаблона и ядра же вордпресс, выдаётся предупреждение.

В этом случае перехода на более свежую версию php стоит решать: оставаться ли на прежней, либо идти в ногу со временем, т.е обновиться до 7.1. Я всегда обновляюсь!

Однако более глубоко разбираться со всякими «непонятностями», правильнее где-нить на тестовом сайте: так мы и поступим.

А рабочие площадки стоит избавить от назойливой подсказки разработчику, но при этом оставить на новейшей 7.1 версии php! и наблюдать за совместимостью в процессе… мало ли что ещё!

Значит, для того, чтобы читатели сайта не пугались странных фраз (пока мы подгоняем наш сайт к обнове…)… нужно всего-то выключить «предупреждение отработки php!».

Вот те строки из показанной выше функции, которые нужно подредактировать:

}
//If the image dimensions are within 1px of the expected size, we consider it a match.
if (is_numeric($constrained_size[0]) && is_numeric($expected_size[0])) { //это добавил
$matched = ( abs( $constrained_size[0] - $expected_size[0] ) <= 1 && abs( $constrained_size[1] - $expected_size[1] ) <= 1 );

return $matched;
}

} //это добавил

Т.е перед строкой:

$matched = ( abs( $constrained_size[0] - $expected_size[0] ) <= 1 && abs( $constrained_size[1] - $expected_size[1] ) <= 1 );

нужно дописать эту (условие):

if (is_numeric($constrained_size[0]) && is_numeric($expected_size[0])) {

поддержка php 7-1 джино

…и не забываем о закрывающей условие фигурной скобке! на фотке строка 652.

Можете перекопировать функцию и просто раскомментировать в показанном примере строку и закрывающую скобку. Всё тут же заработает!

к оглавлению

как отключить проверку не числовых значений в wp-config.php

Этот способ наиболее логичен и правилен, ибо в этом случае мы правим файлы касаемые только нашего сайта — не ядра WP. Таким образом наши правки вне зависимости от обнов ВП!

Надлежит открыть файл wp_config.php (находится в корне сайта, там же где и robots.txt или .htaccess) и подредактировать условия константы «Дебаг» (WP_DEBUG),  чтобы отключить вывод предупреждения!

Итак:

wp-config.php

домен.ru/wp-config.php

Тут дело вот в чём: файл конфигурации у нас всех может незначительно отличаться… потому что некоторые админы добавляют какие-то удобные для себя разрешения и пр…

Словом, отыщите у себя в файле строку

define('WP_DEBUG', false);

строка должна быть! …и допишите прямо под ней «запрет» на вывод предупреждения-сообщения @ini_set(‘display_errors’, 0);

define('WP_DEBUG', false);
@ini_set('display_errors', 0);// ДОБАВИМ эту строку - отключим проверку
/** выдаётся ошибка в версии php 7.1 говорит о том что в операциях используются не числовые значения: проверка, например, миниатюр - картинки */

Либо же, если по каким-то странным причинам, Дебаг не отыскали — дописывайте обе строки…

define('WP_DEBUG', false);
@ini_set('display_errors', 0);

У меня строки даны в таком варианте! однако — замечу: false равно 0 и наоборот. Так что можно записать в обеих строках false — false или 0 — 0.

Этим, как понимаете, мы запрещаем вывод предупреждения «A non-numeric value encountered in…«…

Кое-что о константах WP можно почитать здесь…

О том, как вообще включается поддержка более новой версии php на хостинге, я писал в этой статье…

На этих нотах нонешней музыки, пожалуй, закончу.

…если что-то не ясно, задавайте вопросы в комментариях…

подписка feedburner Online консультация по настройкам и созданию сайтов на WordPress

…А мне остаётся только раскланяться… и пожелать полезной работы в сети

…город веб мастеров Михалика.ru © — запросто с WordPress — ATs media squad

…вопросы в комментариях — помогу, в чём дюжу…
mihalica.ru !

Михаил ATs — владелец блога запросто с Вордпресс — в сети нтернет давным-давно…

…веб разработчик студии ATs media: помогу в создании, раскрутке, развитии и целенаправленном сопровождении твоего ресурса в сети… — заказы, вопросы… разработка…


В логах вижу PHP Warning: A non-numeric value encountered in ругается на 496 строку
в файле код

if( ! function_exists( 'blance_add_image_size' ) ) {
	add_action( 'after_setup_theme', 'blance_add_image_size' );

	function blance_add_image_size() {

		if( ! function_exists( 'wc_get_image_size' ) ) return;

		$shop_catalog = wc_get_image_size( 'shop_catalog' );

/*495*/		$width = (int) ( $shop_catalog['width'] * 2 );
/*496*/		$height = (int) ( $shop_catalog['height'] * 2 );

		add_image_size( 'shop_catalog_jws', $width, $height, $shop_catalog['crop'] );
	}
}

причем есть похожая строка 495, но на нее не ругается.

Добрый день — поставил в товаре так. 

OcStore 3.0.2.0

Шаблон Frame

Тут рассматривали похожую — но не shiping 

image.png.83c7fe9f7f902b812dabedd84e51e56c.png

Как только добавил его в корзину, и перешел в нее — получил такую ошибку: (она и на главной везде светится)

Warning: A non-numeric value encountered in /var/www/users/wizard/domains/DOMASTER/catalog/model/extension/total/shipping.php on line 24Warning: A non-numeric value encountered in /var/www/users/wizard/domains/DOMASTER/catalog/model/extension/total/shipping.php on line 24Warning: A non-numeric value encountered in /var/www/users/wizard/domains/DOMASTER/catalog/model/extension/total/shipping.php on line 24Warning: A non-numeric value encountered in /var/www/users/wizard/domains/DOMASTER/catalog/model/extension/total/shipping.php on line 24

Но стоит с товара убрать доставку — ошибка исчезает. Что не так? Файл shiping.php Родной. В нем вообще ничего не менялось.

shipping.php

<?php
class ModelExtensionTotalShipping extends Model {
	public function getTotal($total) {
		if ($this->cart->hasShipping() && isset($this->session->data['shipping_method'])) {
			$total['totals'][] = array(
				'code'       => 'shipping',
				'title'      => $this->session->data['shipping_method']['title'],
				'value'      => $this->session->data['shipping_method']['cost'],
				'sort_order' => $this->config->get('total_shipping_sort_order')
			);

			if ($this->session->data['shipping_method']['tax_class_id']) {
				$tax_rates = $this->tax->getRates($this->session->data['shipping_method']['cost'], $this->session->data['shipping_method']['tax_class_id']);

				foreach ($tax_rates as $tax_rate) {
					if (!isset($total['taxes'][$tax_rate['tax_rate_id']])) {
						$total['taxes'][$tax_rate['tax_rate_id']] = $tax_rate['amount'];
					} else {
						$total['taxes'][$tax_rate['tax_rate_id']] += $tax_rate['amount'];
					}
				}
			}

			$total['total'] += $this->session->data['shipping_method']['cost'];
		}
	}
}

$total[‘total’] += $this->session->data[‘shipping_method’][‘cost’];   — т.е. ругается на эту строку. 

Прошу помощи форумчан


Изменено 11 октября 2020 пользователем wwizard

Понравилась статья? Поделить с друзьями:
  • Ошибка wargaming net error monitor
  • Ошибка webkit столкнулся с внутренней ошибкой iphone
  • Ошибка wargaming game center 8015
  • Ошибка webgl ваш браузер не поддерживает webgl
  • Ошибка wargaming error monitor как исправить