PHP - Как я могу выполнить оператор SQL по условию, где

Я хочу знать, как выполнить команду 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;
    }      
}

Почему тег PDO. Похоже, вы используете MySqli?

Joseph_J 10.10.2018 09:00

Может у вас получится сделать это с ОДНИМ выбором с помощью "case"?

Mickaël Leger 10.10.2018 09:01

Проверьте тип равных, которые вы используете в таких вещах, как $stat = 'In-process' - это присвоение, а не (==)

Nigel Ren 10.10.2018 09:07

@NigelRen тоже сделал это, но ничего не происходит ...

Patricia Mari Maclang 10.10.2018 09:13
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
48
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы можете попробовать это.

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

Patricia Mari Maclang 10.10.2018 09:12

вы используете PDO?

Lakhwinder Singh 10.10.2018 09:14

Мне жаль, что я использую mysqli

Patricia Mari Maclang 10.10.2018 09:22

Вы можете использовать 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]);, однако, если его значение равно нулю, массив отрегулирует

Patricia Mari Maclang 10.10.2018 09:41

Это должно было отобразить для вас массив. Когда вы ссылаетесь на $resArr[1], вы говорите, что хотите взорвать элемент [1] массива. Вероятно, вам нужно изменить его на: echo implode(' ', $resArr);, чтобы вы ссылались на весь массив.

Joseph_J 10.10.2018 09:51

Другие вопросы по теме