Предупреждение PHP: count (): Параметр должен быть массивом или объектом, который реализует Countable? - PullRequest
0 голосов
/ 03 июня 2019

На моем сайте я разрешаю людям загружать галереи изображений.Когда они нажимают на изображение, внизу есть кнопки next и previous , чтобы они могли легко прокручивать изображения вперед и назад.

Я получаю приведенную ниже ошибку в моем журнале, расположенном по адресу / opt / cpanel / ea-php72 / root / usr / var / log / php-fpm /

NOTICE: PHP message: PHP Warning:  count(): Parameter must be an array or an object that implements Countable in . . . on line 12

Это говорито строке ниже в моем коде:

$max = count($photos);

Ниже приведен другой код, который поставляется с этой строкой:

$photos = get_field('gallery');
$max = count($photos);    <------- error line here -------->
$current = (isset($_GET['image'])) ? intval($_GET['image']) : false;
if ($current !== false) {
    if ($current > $max) $current = $max;
    if ($current < 1) $current = 1;
}

$next = (($current + 1) < $max) ? ($current + 1) : $max;
$prev = (($current - 1) > 1) ? ($current - 1) : 1;
?>

В основном этот код использует get_field ('gallery'), чтобы получить общее количество фотографий в галерее, а номер присваивается переменной max .

Остальной код - это как next и предыдущие кнопки работают.

Я не знаю, что не так.Может ли кто-нибудь помочь с этим?

1 Ответ

0 голосов
/ 03 июня 2019

В общем, решение простое:

Первая отладка с var_dump() что $photos возвращает. Чем вы будете знать, в чем проблема.

count() принять массив, и если у вас есть false, null или что-то еще, у вас будет ошибка.

Просто сделайте что-то вроде этого:

$photos = get_field('gallery');
if(!is_array($photos) || empty($photos)) $photos = array(); // FIX ERROR!!!
$max = count($photos);    <------- error line here -------->
$current = (isset($_GET['image']) && !empty($_GET['image']) && is_numeric($_GET['image'])) ? intval($_GET['image']) : 0;
if ($current > 0) {
    if ($current > $max) $current = $max;
    if ($current < 1) $current = 1;
}

$next = (($current + 1) < $max) ? ($current + 1) : $max;
$prev = (($current - 1) > 1) ? ($current - 1) : 1;
?>

С if(!is_array($photos) || empty($photos)) $photos = array(); до $max = count($photos); вы исправляете свою проблему, и все, что не является массивом или пустым (0, NULL, FALSE, ''), будет исправлено, и вы будете иметь в счетчике $max результат 0 потому что массив пуст.


ВАЖНО !!!

Вы не должны так работать. Вам нужно знать, какую информацию вы получаете и ожидаете в переменных. Код должен оставаться чистым, и исправление таких ошибок - плохая практика. Если вы получаете массив, то этот массив ожидается, и вы должны иметь проверки перед любым вычислением.


UPDATE:

Также у вас есть ошибка в

$current = (isset($_GET['image'])) ? intval($_GET['image']) : false;
if ($current !== false)

Я исправляю это так:

$current = (isset($_GET['image']) && !empty($_GET['image']) && is_numeric($_GET['image'])) ? intval($_GET['image']) : 0;
if ($current > 0)

Причина в том, что у вас есть расчеты ниже, и вы не ожидаете, что (false + 1) будет чем-то хорошим. false можно перевести на 0, но в вашем случае вы также можете получить ошибку. В этом случае я заменяю false на 0, добавляю empty() и is_numeric() check, и у вас там нет ошибок.

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