1. Ограничьте количество предметов в корзине каким-то макс. значением, оно должно быть явно задано, но не вызывало дискомфорта у пользователей (оно должно иметь такое значение, чтобы в нормальных человеческих условиях оно едва достижимо).
$max_cart_item_count = 500;
$curr_cart_item_count = min(count($_SESSION['cart']), $max_cart_item_count);
for($i = 0; $i < $curr_cart_item_count; $i++)
....
2. Есть опасность применения SQL инъекций.
В этом месте, где подставляется переменная в текст запроса, если умело закомментировать кавычку, то можно получить полный доступ к базе.
WHERE `type`= '$id'
Избегайте подставлять любые переменные с пользовательскими данными в текст запроса ("с пользовательскими данными" и "в текст запроса" - нужно подчеркнуть и осмыслить как отдельные понятия с точки зрения безопасности). Для этого существует специальные методики подготовки запроса:
$stmt = $conn->stmt_init();
$stmt->prepare("SELECT * FROM `items` WHERE `type` = ?"); // подставляем текст запроса, причем на месте входных параметров ставим специальные маркеры - плейсхолдеры.
$stmt->bind_param("i", $id); // подставляем на место плейсхолдера значение параметра как целочисленный тип
$stmt->execute(); // вот теперь можно выполнить запрос
$result = $stmt->get_result();
while($row = $result->fetch_assoc())
{
// Обработка результатов
}