2015-05-15 4 views
0

Я пытаюсь создать страницу, в которой я представляю инвентарь из бэкэнда MySQL. Вот приблизительный пример таблицы, которую я имею.Представляют уникальные элементы в той же категории

id,Server_Type,Status 
1,BL460,Available 
2,BL460,Available 
3,BL460,Reserved 
4,BL460,Reserved 
5,BL460,Reserved 
6,DL360,Reserved 
7,DL360,Reserved 
8,DL360,Reserved 
9,DL580,Available 
10,BL460,Available` 

Чтобы отобразить эти элементы на странице, мне нужно сгруппировать каждый элемент с помощью «Server_Type». Однако просто группировать элемент по «Server_Type» в моем SQL-запросе недостаточно, поскольку уникальный идентификатор каждого элемента должен быть сохранен и представлен.

Я хочу представить выбор конечному пользователю, как это на веб-странице (используя приведенную выше таблицу в наших данных):

BL460 - Amount: 3 DL360 - Amount: 0 DL580 - Amount: 1

ПРИМЕЧАНИЕ: Я нужны детали с 0 «Доступный» количество для отображения на странице.

Для конечного пользователя не имеет значения, какой уникальный идентификатор сервера - если он/она выбирает 2 BL460, тогда во время проверки любые 2 BL460s в состоянии «Доступный» необходимо переключить на " Зарезервированный статус - не имеет значения, какие из них (я думал только о том, чтобы сделать это по приказу ASC).

Проблема, которую я использую, заключается в том, как представить страницу в формате PHP. Мне нужен способ представить каждое значение в качестве опции на странице (даже идентификатор, хотя он останется скрытым на странице, поскольку это не важно для конечного использования). Я попытался сделать это как массив, но я не знаю достаточно о PHP, чтобы использовать данные массива и правильно представлять его на странице.

Кто-нибудь знает, как это можно сделать?

EDIT: Итак, позвольте мне добавить еще некоторую информацию - я сделал этот запрос: SELECT *, COUNT(CASE WHEN Status = 'Available' THEN 1 ELSE NULL END) AS Amount FROM products GROUP BY id

который представляет собой таблицу, как это:

id,Server_Type,Status,Amount 1,BL460,Available,1 2,BL460,Available,1 3,BL460,Reserved,0 4,BL460,Reserved,0 5,BL460,Reserved,0 6,DL360,Reserved,0 7,DL360,Reserved,0 8,DL360,Reserved,0 9,DL580,Available,1 10,BL460,Available,1

А может написать массив, как это : $amounts = array(); foreach($results as $entry) {if($entry['Amount'] == 1) {if(isset($amounts[$entry['Server_Type']])) {$amounts[$entry['Server_Type']]++;} else {$amounts[$entry['Server_Type']] = 1;}}};

Что дает результат, как это: array(2) { ["BL460"]=> int(3) ["DL580"]=> int(1) }

Но это все еще не дает мне Server_Types с 0 суммой (хотя я предположил, что могу просто определить другой массив, чтобы дать желаемый результат), и я не знаю достаточно о PHP, чтобы представить эти данные в html в описанном выше формате , Я полагаю, что моя самая большая проблема заключается в том, чтобы создать такой массив в формате html. Кто-нибудь знает - или ... знает ли кто-нибудь о лучшем решении?

+0

Это похоже, как простой цикл в PHP – Strawberry

ответ

1

Создайте свою форму в PHP с помощью простого запроса:

"SELECT id, Server_Type, Status FROM table ORDER BY Server_Type, id" 

Тогда, упрощенно, не потрудившись с HTML верстки и детали:

$parsedItems = []; 
foreach ($resultset as $item) { 
    if (!array_key_exists($item['Server_Type'], $parsedItems)) { 
     // initialize 
     $parsedItems[$item['Server_Type']] = [ 
      "ids" => [], 
      "amount" => 0 
     ]; 
    } 
    if ($item['Status'] === "Available") { 
     $parsedItems[$item['Server_Type']]['ids'][] = $item['id']; 
     $parsedItems[$item['Server_Type']]['amount']++; 
    } 
} 
foreach ($parsedItems as $item => $values) { 
    if ($values['amount'] > 0) { 
     echo "<button onclick=\"reserve('".implode(",", $values['ids'])."')\">Reserve {$item}</button>"; 
    } else { 
     echo "<button>{$item} out of stock!</button>"; 
    } 
} 

Вы должны также определить форму и резерв() функция JS:

<form name="myForm" id="myForm" action="reserve.php" method="POST"> 
    <input type="hidden" name="reserve_ids" id="reserve_ids" value=""> 
</form> 
<script type="text/javascript"> 
    function reserve(ids) { 
     document.getElementById('reserve_ids').value = ids; 
     document.getElementById('myForm').submit(); 
    } 
</script> 

Наконец, ваш reserve.php может быть что-то вроде этого:

$reserve_ids = explode(",", $_POST['reserve_ids']); 
// pick the first id, whatever... 
$id = mysqli_real_escape_string($dbh, $reserve_ids[0]); 

И обновить таблицу:

"UPDATE table SET Status='Reserved' WHERE id={$id}" 

Пожалуйста, имейте в виду, что это простой пример, чтобы проиллюстрировать возможные решения, подготовленные заявления должны быть использованы, вход должен быть отфильтрован, использовать защиту CSRF, и т.д. ...

Вы также должны подумать о параллелизме, 2 пользователя могут зарезервировать один и тот же идентификатор с таким подходом, поэтому вы должны проверить на reserve.php, что выбранный идентификатор по-прежнему доступен и переносит все это в транзакцию MySQL или что-то подобное ...

Надеется, что это помогает

1

вы можете использовать этот SQL, чтобы получить количество доступного сервера:

SELECT Server_Type, COUNT(*) as count FROM table Where `Status` = 'Available' GROUP BY Server_Type 

, но это не показывает 0 доступных серверов, если вы хотите обрабатывать его в PHP:

первым, магазин результат выше команды SQL в $ доступной переменной, а затем выбрать все типы серверов из таблицы с этим:

SELECT Server_Type FROM table GROUP BY Server_Type 

и хранить это приводит к $ server_types переменной, то цикл в PHP:

foreach ($server_types as $type){ 
    $converted_array = array_column($available, 'count', 'Server_Type'); 
    echo (array_key_exists($type, $converted_array)) ? $converted_array[$type] : 0; 
} 

примечание: $ converted_array просто конвертировать [0] => array('BL460'=>3) в ['BL460'] => 3.

+0

Спасибо за ответ, но не в «GROUP BY SERVER_TYPE» удалить столбец «ID» из результата запроса? – Wes

+0

вам нужно «id»? поэтому добавьте его в первый sql 'SELECT id, Server_Type, COUNT (*) как count ...', все в порядке? если нет, объясните, где вам нужно указать столбец id? – Mojbala

+0

Если вы выполняете 'SELECT id, Sever_Type' и' GROUP BY Server_Type', вы получаете только первый идентификатор первого Server_Type в запросе. Мне нужен идентификатор для каждого отдельного Server_Type. Причина, по которой мне нужен идентификатор, заключается в том, что я могу создать способ для моего процесса проверки, чтобы скрывать выбор «Доступный» до «Зарезервирован». Например, если есть 3 BL460, но кто-то выбирает только 2 из них, тогда мне нужно, чтобы процесс проверки изменил 2 BL460 с статуса «Доступный» на статус «Зарезервировано». Единственный способ, которым я это знаю, - включить столбец id в мой запрос. – Wes

Смежные вопросы