count (): параметр должен быть массивом или объектом, который реализует счетную ошибку в php - PullRequest
1 голос
/ 01 мая 2020

Я создаю на своем веб-сайте систему добавления в корзину.

Если в корзине нет товаров, переменная $cart устанавливается на NULL.

Это приводит к следующей ошибке, когда я пытаюсь отобразить количество товаров в корзине: count(): Parameter must be an array or an object that implements Countable.

Вот мой php код:

<?php 
if ((isset($_SESSION['active_user_type']) && $_SESSION['active_user_type'] == "consumer") || !isset($_SESSION['active_user'])) {
?>
<div class="shopping_cart">
<div class="cart_title">
    <a href="view_cart.php">Shopping cart</a>
</div>

<?php
    $total = 0;
    if(isset($_SESSION['cart'])) {
        $cart = $_SESSION['cart'];
        for ($i=0; $i<count($cart); $i++) {
            $item_id = $cart[$i][0];
            $query = "SELECT * FROM items WHERE id=$item_id";
            $result = $db->query($query);
            if ($row = $result->fetch()) {
                $price = ($row['price']*$cart[$i][1]) + $row['shipping_price'];
            }
            $total += $price;
        }
    } else {
        $cart = NULL;
    }
?>
<div class="cart_details">
// the error seems to be from the line below:
    <?php echo count($cart); ?><br />
    <span class="border_cart"></span> Total: 
    <span class="price">
        <?php echo "BD " . number_format((float)$total,3,'.',''); ?>
    </span>
</div>
<div class="cart_icon">
    <a href="checkout.php" title="Checkout">
        <img src="images/shoppingcart.png" alt="" width="48" height="48" border="0" />
    </a>
</div>
</div>
<?php
}
?>

Ответы [ 3 ]

4 голосов
/ 01 мая 2020

Это потому, что вы рассчитываете на 'NULL', попробуйте так:

.
.
.
else
{
    $cart = [];
}
2 голосов
/ 01 мая 2020

Это потому, что вы пытаетесь сосчитать что-то, что не считается (как вы можете сосчитать количество элементов в нуле?). Начиная с документация:

7.2.0: count () теперь будет выдавать предупреждение о недопустимых счетных типах, передаваемых параметру array_or_countable .

, поэтому до версии 7.2.0 это предупреждение не выводилось. Во всех версиях, если obj в count(obj) не является допустимым массивом / счетным объектом, функция возвращает 1, за исключением count(null), который возвращает 0.


Вы можете либо:

  1. Привести его к массиву
  2. Явно установить его в пустой массив, если он пуст
  3. Поставить галочку на место перед отображением

1: <?php echo count((array)$cart);?>

2: else { $cart = []; }

3: <?php ($cart == null) ? '' : echo count($cart);?>

2 голосов
/ 01 мая 2020

Когда $cart == NULL (как назначено в вашем предложении else), он не может count, поскольку NULL не имеет интерфейса Countable. Начиная с PHP 7.2 , это приводит к появившемуся предупреждению, которое вы видели.

Но, похоже, вы не должны пытаться выводить корзину, если у вас ее нет, поэтому Вы должны просто переместить этот код в свой блок if, то есть

$total = 0;
if(isset($_SESSION['cart']))
{
    $cart = $_SESSION['cart'];
    for ($i=0; $i<count($cart); $i++)
    {
        $item_id = $cart[$i][0];
        $query = "SELECT * FROM items WHERE id=$item_id";
        $result = $db->query($query);
        if ($row = $result->fetch())
        {
            $price = ($row['price']*$cart[$i][1]) + $row['shipping_price'];
        }
        $total += $price;
    }
?>
<div class="cart_details"> <?php echo count($cart);?> <br />
    <span class="border_cart"></span> Total: <span class="price"><?php echo "BD " . 
  number_format((float)$total,3,'.',''); ?></span> </div>
<div class="cart_icon"><a href="checkout.php" title="Checkout"><img src="images/shoppingcart.png" 
alt="" width="48" height="48" border="0" /></a></div>
 </div>
<?php
}
else
{
    $cart = NULL;
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...