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 операциях используются так называемые не числовые значения (можете воспользоваться, к примеру, Гугл переводчиком).
Далее в сообщении на сайте указаны путь к файлу и номер строки, в которой сгенерировано это предупреждение.
Отключить вывод 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])) {
…и не забываем о закрывающей условие фигурной скобке! на фотке строка 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 на хостинге, я писал в этой статье…
На этих нотах нонешней музыки, пожалуй, закончу.
…если что-то не ясно, задавайте вопросы в комментариях…
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
Как только добавил его в корзину, и перешел в нее — получил такую ошибку: (она и на главной везде светится)
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