#php #html #mysql #pdo
#php #HTML #mysql #pdo
Вопрос:
У меня есть этот список «купонов», каждый из которых имеет уникальный «productid»
Теперь я пытаюсь преобразовать список в массив, используя:
$claimed = array($rowOrder['productid']);
Моя проблема в том, что когда я пытаюсь использовать «count» и «array_sum», он выводит отдельные числа:
$count_claimed = array(count($claimed));
echo array_sum($count_claimed);
Используя echo, которое я получаю, и вывод: «1111111»
Что я должен изменить, чтобы получить общее количество 7? (как показано с количеством «купонов»)
дополнительная информация:
«Купоны» выводятся этим SELECT
оператором, $rowOrder
вызывающим это.
public function SelectLst_ByUsrCustomerIDInfo($db, $usrcustomerid) {
$stmt = $db->prepare(
" SELECT o.orderid, o.productid, o.usrcustomerid, o.amount, o.amountrefunded, o.createddate, o.scheduleddate, o.useddate, o.expirationdate, p.photosrc
FROM `order` o LEFT JOIN `product` p ON o.productid = p.productid
WHERE usrcustomerid = :usrcustomerid"
);
$stmt->bindValue(':usrcustomerid', $usrcustomerid, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $rows;
}
Это называется следующим образом
$lstInfo = $mcOrder->SelectLst_ByUsrCustomerIDInfo($db, $usrcustomerid);
foreach($lstInfo as $rowOrder) {
if (isset($rowOrder['productid']) amp;amp; ($rowOrder['expirationdate'] > date("Y-m-d H:i:s"))) {
$claimed = array($rowOrder['productid']);
$count_claimed = array(count($claimed));
echo array_sum($count_claimed);
}
}
Комментарии:
1.
$claimed = array($rowOrder['productid']);
также будет массив длиной один . Вероятно, вы захотите поместить его в массив вместо того, чтобы присваивать его массиву, а затем использоватьcount()
отдельно (array_sum()
будет суммироваться все значения массива, состоящего из многих чисел).2. Вы должны показать еще немного кода — вы извлекаете эти данные из запроса? Если да, можете ли вы поделиться этим кодом?
3. обновил мой вопрос дополнительной информацией
4. И как вы вызываете
SelectLst_ByUsrCustomerIDInfo
? Также покажите этот код.5. снова обновленный вопрос
Ответ №1:
Выполнив это, count($lstInfo)
вы получите общее количество выбранных строк ( PDOStatement::fetchAll()
возвращает массив, и вы просто подсчитываете количество элементов в нем). Затем вы можете обрабатывать результаты в цикле и увеличивать вызываемую переменную $claimed
, если условие истинно.
$lstInfo = $mcOrder->SelectLst_ByUsrCustomerIDInfo($db, $usrcustomerid);
$total = count($lstInfo);
$claimed = 0;
foreach($lstInfo as $rowOrder) {
if (isset($rowOrder['productid']) amp;amp; ($rowOrder['expirationdate'] > date("Y-m-d H:i:s"))) {
$claimed = 1;
}
}
echo "Claimed $claimed of $total.";
Еще лучше, вы можете сделать это в одном запросе, используя COUNT()
и добавленное WHERE
условие. Это означает, что вы не получите итоговое значение, но, похоже, это тоже не было вопросом с самого начала.
$stmt = $db->prepare("SELECT COUNT(productid) as cnt
FROM `order` o
LEFT JOIN `product` p
ON o.productid = p.productid
WHERE usrcustomerid = :usrcustomerid
AND expirationdate > NOW()
GROUP BY usrcustomerid");
$stmt->execute([":usrcustomerid" => $usrcustomerid]);
$result = $stmt->fetch();
echo "Claimed ".$result['cnt'];
Комментарии:
1. я вижу, мне нужно посчитать внутри цикла for, спасибо за помощь.
Ответ №2:
Попробуйте это,
$claimed = array();
foreach($products as $rowOrder){
array_push($claimed,$rowOrder['productid']);
}
echo count($claimed);
echo array_sum($claimed);die;