当前位置: 首页 > 知识库问答 >
问题:

参数必须是一个数组或一个实现可数的对象?

景国兴
2023-03-14

在我的网站上,我允许人们上传图片画廊。当他们点击图像时,底部有一个下一个和上一个按钮,这样他们就可以很容易地在图像中来回滚动。

我在位于/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_字段(“gallery”)获取gallery中的照片总数,并将该数字分配给变量max。

代码的其余部分是“下一个”和“上一个”按钮的工作方式。

我不知道出了什么问题。有人能帮忙吗?

共有1个答案

邹毅
2023-03-14

一般来说,解决方案很简单:

首先,使用var\u dump()what$photos返回。你就会知道问题出在哪里了。

count()。

就这样做吧:

$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;
?>

如果(!is_array($photos)| empty($photos))$photos=array(),则使用 之前<代码>$max=计数($photos)您解决了问题,任何非数组或空(0,NULL,FALSE,'')的内容都将被修复,并且您将在计数$max结果0,因为数组为空。

你不应该这样工作。您需要知道在变量中接收和期望的信息。代码必须保持干净,纠正此类错误是一种糟糕的做法。如果您收到一个数组,那么该数组是预期的,您必须在进行任何计算之前进行检查。

你也有错误

$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()为数值()检查,您在那里没有错误。

 类似资料: