Приветствую. Подскажите как сделать вывод данных из бд с последущей обработкой? Например есть база: ID, TYPE, NAME, ICON И нужно вывести все одним запросом, а потом разобрать на массивы по ячейке type PHP: $computer = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'pc'"); $notebook = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'notes'"); $phone = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'phone'"); $tablet = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'tabs'"); $monoblock = $mysqli->query("SELECT * FROM `categories` WHERE `type` = 'mono'"); while ($comp_row = $computer->fetch_assoc()) {} while ($note_row = $notebook->fetch_assoc()) {} while ($phone_row = $phone->fetch_assoc()) {} while ($tabs_row = $tablet->fetch_assoc()) {} while ($mono_row = $monoblock->fetch_assoc()) {} Как 5 действий заменить одним?
Если порядок групп не сильно важен, то PHP: $all = $mysqli->query("SELECT * FROM `categories` ORDER BY `type`");
А если это не все категории, а лишь часть? Попробуй такой запрос, автор: Код (Text): "SELECT * FROM `categories` WHERE `type` in ('pc','notes','phone','tabs','mono')"
а как обработать запрос? для каждой группы у меня цикл чтоб перебрать, на выходе имею одну переменную, со всеми записями, из выбранной группы --- Добавлено --- групп всего 5, в одной группе может быть любое количество категорий
Да точно также. Я же не знаю, какая у вас дальше архитектура обработки этого всего. Можно потом разбить полученный длинный массив на подмассивы по ключу. Можно не разбивать, а обрабатывать его целиком, как есть, меняя поведение обработки в зависимости от type, ведь type тоже будет храниться, у вас же выборка по всем колонкам. А можно оставить как есть, 5 запросов, 5 обработчиков. тогда, если хотите одним действием, вам хватит и Код (Text): SELECT * FROM `categories` А если хочется, чтобы все прям осталось по-старому, но было просто красивее, то вот ваш же код, но красивый, соответственно, его безопасность и прочие моменты на вашей совести: PHP: <?php $types = ['pc','notes','phone','tabs','mono']; function process_category_by_type($type){ $q_result = $mysqli->query("SELECT * FROM `categories` WHERE `type` = '". $type ."'"); while ($q_result_row = $q_result->fetch_assoc()) {} } foreach ($types as $type){ process_category_by_type($type); } Универсально, расширяемо, гибко. Но я понятия не имею, какая у вас задумка, учитывайте это.
Для выражения благодарности под каждым сообщением справа есть кнопка "лайк". Как раз на такие вот случаи, вместо тысячи слов --- Добавлено --- Можно, конечно, еще сократить: PHP: $types = ['pc','notes','phone','tabs','mono']; foreach ($types as $type){ $q_result = $mysqli->query("SELECT * FROM `categories` WHERE `type` = '". $type ."'"); while ($q_result_row = $q_result->fetch_assoc()) {} }
применительно к данной задаче, "типов" может стать допустим 256-1024-65536 и будет сделано 256-1024-65536 запросов к базе вместо одного. это создаст излишнюю и ненужную нагрузку, будет "торможение" программы. в общем плане это указывает на непонимание работы инструмента "база данных". так делают либо новички (которые конечно потом научаться), либо говнокодеры (тут ситуация сложнее). надеюсь не обидел никого.
Почему вы думаете что там будет столько типов? Может их там всего 30 будет от силы или 10, к примеру.
если там будет больше одного "типа" и будет написан подобный код (запросы в цикле), то можно обратиться к той части моего сообщения, где говориться про общий план. людям очень тяжело менять привычки программирования и единожды научившись выбирать из базы подобным образом, они начинают применять эти знания и в дальнейшем. а вот там уже может быть сколько угодно "типов". и поэтому лучше (я считаю) постараться научиться делать правильней, изучив возможность выбирать из базы без запросов в циклах.
@iliavlad я вот не совсем понимаю, что у него за задача. Сортировка по ордер бай там тогда тоже не нужна. Там достаточно всё выбрать, а после в цикле по условию искать типы и сваливать в соответствующие массивы.
PHP: $result = $mysqli->query("SELECT * FROM `categories`"); $result = $result->fetch_all(); $new_array_result = []; $type_array = ['pc', 'notes', 'phone', 'tabs', 'mono']; foreach ($result as $key) { foreach ($type_array as $key => $value){ if($key['type'] == $value){ $new_array_result[$key['type']] = $key; } } } echo '<pre>'; print_r($new_array_result); echo '</pre>'; --- Добавлено --- @iliavlad но знаешь я думаю, что запросы к бд, не хуже вот этого говна. С кучей циклов. И даже скажу больше если тут будет овер столько типов, как вы сказали лагать будет сильней, чем запросы в цикле к бд. Или вы овер типов хотите ручками все раскидывать?) --- Добавлено --- Я вот например вообще не понял что ТС хочет сделать. И зачем ему это ?) --- Добавлено --- @iliavlad и тем более --- Добавлено --- @iliavlad можешь продемонстрировать свой вариант, я могу ошибаться и не понимать как в этой ситуации можно сделать лучше, в связи с отсутствием опыта. Поделись своим мнением.
вне зависимости от количества типов в твоём варианте останется только 2 цикла. что уже лучше, чем количество циклов в варианте ТС или @Fell-x27 ну и как вариант, давай посмотрим на такую задачу. надо вывести таблицу с категориями с разбивкой по типам (т.е. для каждого нового типа выводим строку толстым шрифтом с названием этого типа). ниже код для иллюстрации PHP: $types = ['pc', 'notes', 'phone', 'tabs', 'mono']; // наши типы $columns = ['name','title', 'type']; // колонки, которые нам надо вывести $colCount = count($columns); // выбираем нужные типы и сортируем выборку по типам $result = $mysqli->query("SELECT " . implode(',',$columns) . " FROM `categories` WHERE `type` IN (" . implode(',', $types) . ") ORDER BY `type`"); $type = ''; // запоминаем текущий тип echo '<table>'; while ($row = $result->fetch_assoc()) { if ($type != $row['type']) { $type = $row['type']; // выводим строку жирным шрифтом с названием типа echo "<tr><td colspan='$colCount'><strong>$type</strong></td></tr>"; } echo '<tr>'; foreach ($columns as $col) { echo "<td>{$row[$col]}</td>"; } echo '</tr>'; } echo '</table>'; итого, у нас получился один запрос и один цикл
Я сказал, что понятия не имею, что автору нужно. Нужно с одним запросом? Есть вариант с одним запросом - на здоровье. Нужно просто было его "китайский" код причесать? я причесал. Какие вопросы, такие и ответы же. Я отдельно написал, что вся ответственность за происходящее в этом коде - строго на авторе поста. От себя я там ничего не внес А так, гадать на кофейной гуще можно бесконечно, проверено. Вполне возможно, что автору вообще не нужно ничего разбивать, и хватит всего одного запроса и всего одного цикла со SWITCH, учитывающим типы, без динамического расширения в реальном времени.