Count (): parameter moet een array zijn of een object dat teldbare fout in PHP

Ik maak een add-to-cart-systeem in mijn website.

Als er geen items in de winkelwagen zijn, is de variabele $cartingesteld op NULL.

Dit resulteert in de volgende foutmelding wanneer ik probeer het aantal items in de winkelwagentje te echelen: count(): Parameter must be an array or an object that implements Countableimplementeert.

Hier is mijn PHP-code:

<?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
}
?>

Antwoord 1, autoriteit 100%

Dit komt omdat je op ‘NULL’ rekent. Probeer het als volgt:

.
.
.
else
{
    $cart = [];
}

Antwoord 2, autoriteit 33%

Het is omdat je iets probeert te tellen dat niet telbaar is (hoe kun je het aantal elementen in null tellen?). Uit de documentatie:

7.2.0: count() geeft nu een waarschuwing over ongeldige telbare typen die zijn doorgegeven aan de parameter array_or_countable.

dus vóór versie 7.2.0 werd deze waarschuwing niet gegeven. Als in alle versies objin count(obj)geen geldig array/telbaar object is, retourneert de functie 1, met uitzondering van count(null)wat 0oplevert.


U kunt:

  1. Cast het naar een array
  2. Stel het expliciet in op een lege array als deze leeg is
  3. Zet een vinkje voordat je gaat echoën

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

2:else { $cart = []; }

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


Antwoord 3, autoriteit 33%

Wanneer $cart == NULL(zoals het is toegewezen in uw else-clausule) is het niet countin staat sinds NULLheeft geen Countable-interface. Vanaf PHP 7.2is dit resulteert in het waarschuwingsbericht dat u hebt gezien.

Maar het lijkt erop dat je niet moet proberen een winkelwagentje uit te voeren als je er geen hebt, dus je moet die code gewoon naar je if-blok verplaatsen, d.w.z.

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

Other episodes