Сначала по самой корзине. Вот что у вас происходит - total_sum($goods), и это постоянно ибо требуется всегда. А выгоднее не дергать БД постоянно, помещая в корзину минимум нужной информации о товаре. Для этого достаточно иметь структуру товаров в корзине как показано и получение всего товаров в корзине, и их сумма, это просто описать готовыми функциями:
$cart = [
345 => [
'count' => 4,
'price' => 150,
'props' => ['name' => 'Печеньки', 'brand' => 'ООО Тесто']
],
224 => [
'count' => 3,
'price' => 250,
'props' => ['name' => 'Семечки', 'brand' => 'АО Щелкай!']
]
];
//количество товаров в корзине
$count = array_sum(array_map('current', $cart));
//или с версии 5.5.0 можно так
$count = array_sum(array_column($cart, 'count'));
//сумма набранного
$total = array_sum(array_map('array_product', $cart));
Писать для этого такие функции как total_sum() и total_quantity() стоит ли?
Названия товаров и прочие параметры хранятся в массиве, значение которого функция array_product, при расчете суммы, возвращает равное 1, а значит не влияет на расчет.
При добавлении товаров в корзину из базы получается цена, название товара, и прочее необходимое. Корзина имеет два представления, но обслуживается одними и теми же данными, а значит для полного представления ее выгоднее иметь информацию уже в ней. То есть обращения к БД сводятся только к одноразовым запросам при добавлении нового товара в корзину.
Если товар добавляется только по одному, непонятен вообще второй аргумент функции addtocart(). И это связано с клиентской реализацией - как HTML структурой, так и функционалом. Обычно в таком случае, это кнопка "Добавить в корзину", серверу отправляется ID выбранного товара, он либо добавляется, либо икремент ранее добавленного. На клиенте при этом у товара будет информация типа "В корзине N штук".
Каким образом у вас клиентская часть организована (покажите результирующий html-код, а не шаблон на сервере с РНР вставками)?