Я хочу знать, как выполнить команду foreach sql count в зависимости от ее статуса. Когда я попытался повторить его, все статусы превратились в номер 1. Я хочу поместить его в цикл вместо того, чтобы повторять оператор пять раз.
<?php
$statuses = array("In-process", "Approved", "Draft", "Approved" , "Rejected");
foreach ($statuses as $stat) {
$stmt = $db->prepare(
"SELECT COUNT(status) FROM `m2_exception_requests`
WHERE created_by= ? and status = ?"
) or die($db->error);
$stmt->bind_param("ss", $user_id , $stat);
$stmt->execute();
$result = $stmt->store_result();
if ($stat = 'In-process') {
$Inprocess1 = $result;
}
if ($stat = 'Approved') {
$Approved1 = $result;
}
if ($stat = 'Draft') {
$Draft1 = $result;
}
}
Возможный дубликат Как получить несколько подсчетов с помощью одного SQL-запроса?
Может у вас получится сделать это с ОДНИМ выбором с помощью "case"?
Проверьте тип равных, которые вы используете в таких вещах, как $stat = 'In-process' - это присвоение, а не (==)
@NigelRen тоже сделал это, но ничего не происходит ...






вы можете попробовать это.
<?php
$statuses = array("In-process", "Approved", "Draft", "Approved1" , "Rejected");
$statusVal = [];
foreach ($statuses as $stat) {
$stmt = $db->prepare(
"SELECT COUNT(status) FROM
`m2_exception_requests`
WHERE created_by= ?
and status = ?"
) or die($db->error);
$stmt->bind_param("ss", $user_id , $stat);
$stmt->execute();
$count = $stmt->rowCount();
$statusVal[$stat] = $count;
}
var_dump($statusVal);
вы получите такие значения
[
"In-process" => 1,
"Approved" => 2,
"Draft" => 3,
"Approved1" => 4,
"Rejected" => 5
]
Я не знаю, почему он показывает array(5) { ["In-process"]=> bool(true) ["Approved"]=> bool(true) ["Draft"]=> bool(true) ["Approved1"]=> bool(true) ["Rejected"]=> bool(true) }
вы используете PDO?
Мне жаль, что я использую mysqli
Вы можете использовать GROUP BY для получения количества записей в каждом статусе; ниже - простой SQL-запрос; вы конвертируете его в привязки параметров;
SELECT status, COUNT(status) FROM `m2_exception_requests` WHERE `created_by` = ? AND `status` IN ("In-process", "Approved", "Draft", "Approved1" , "Rejected") GROUP BY `status`
Вот динамическое и безопасное решение для SQL-инъекций:
Это будет использовать предложения IN и GROUP BY для получения ваших результатов.
$statuses = array("In-process", "Approved", "Draft", "Approved" , "Rejected");
$clause = implode(',', array_fill(0, count($statuses), '?')); //create your question marks
$types = 's' . str_repeat('s', count($statuses)); //create you bindings
$query = "SELECT COUNT(status)
FROM `m2_exception_requests`
WHERE created_by = ?
AND status IN($clause)
GROUP BY status";
$stmt = $db->prepare($query);
$stmt->bind_param($types, $user_id, ...$statuses);
$stmt->execute();
$resArr = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
if (!$resArr) exit('No rows');
var_export($resArr);
$stmt->close();
Удачи!
это работает, но могу я спросить, как я могу повторить это? Я пробовал работать с implode(" ",$resArr[1]);, однако, если его значение равно нулю, массив отрегулирует
Это должно было отобразить для вас массив. Когда вы ссылаетесь на $resArr[1], вы говорите, что хотите взорвать элемент [1] массива. Вероятно, вам нужно изменить его на: echo implode(' ', $resArr);, чтобы вы ссылались на весь массив.
Почему тег PDO. Похоже, вы используете MySqli?