@Morozilnikkk

Вывод данных из MySql?

Всех приветствую!
Прошу помощи.

Я не опытный (в работе с БД подавно), поэтому прошу не ругать за глупые вопросы и не плеваться от говно-кода.
Постараюсь описать свою проблему максимально подробно.

На сайте имеется список людей. ФИО каждого человека идёт как ссылка с новой строки, обёрнутая в тэг li.
Список разделён на группы по буквам алфавита (пока что записал только 2 буквы). Пример на фото ниже( ФИО на фото забиты через html):

5b0d4d3939eda737158940.png

Планируется сделать поиск по ФИО, поэтому я занёс ФИО в БД MySQL. БД подключил к сайту, всё работает.
Структура списка такова:

<div id="1">
	<h2>
		А
	</h2>
	<div id="2">
		<li>
			<a href="#">
				ФИО человека 1
			</a>
		</li>
		<li>
			<a href="#">
				ФИО человека 2
			</a>
		</li>
	</div>

	<h2>
		Б
	</h2>
	<div id="2">
		<li>
			<a href="#">
				ФИО человека 1
			</a>
		</li>
		<li>
			<a href="#">
				ФИО человека 2
			</a>
		</li>
	</div>
</div>


Я бы хотел, чтобы:
1) ФИО из БД подставлялись вместо "ФИО человека 1", "ФИО человека 2" и тд.
2) ФИО подставлялись по алфавиту. То есть в блок с буквой А подставлялись фамилии на А, с Б фамилии на Б и тд.

Как я подключил БД и список ФИО:

<?php
  
$dbhost = "localhost";
$dbname = "Drivers_list";
$username = "root";
$password = "root";

$db = new PDO("mysql:host=$dbhost; dbname=$dbname", $username, $password);

function get_drivers_names() {
	global $db;
	$driver_names = $db->query("SELECT * FROM driver_names");
	return $driver_names;
}


Как я пытался вывести ФИО из БД в список на сайт:

5b0d548d07d8a456140318.png

Само собой это неправильно и получается вот так:

5b0d525452747050130201.png

Но как правильно сделать? Не в ручную же по id вбивать)

Повторюсь,
Я бы хотел, чтобы:
1) ФИО из БД подставлялись вместо "ФИО человека 1", "ФИО человека 2" и тд.
2) ФИО подставлялись по алфавиту. То есть в блок с буквой А подставлялись фамилии на А, с Б фамилии на Б и тд.

Вот сам пример БД:

5b0d52d3136c4762647088.png

Вроде описал понятно. Надеюсь, хоть кто-то дочитает мой глупый вопрос до конца и, возможно, поможет решить эту проблему. Всем спасибо
  • Вопрос задан
  • 487 просмотров
Решения вопроса 1
kimono
@kimono
Web developer
Запрос должен быть примерно таким:
SELECT LEFT(`name`, 1) `abc`, `id`, `name` FROM `persons` ORDER BY `name` ASC;

На выходе вы получите такой массив:
$data = [
  ['abc' => 'а', 'id' => 1, 'name' => 'Абрамов Михаил Фёдорович'],
  ['abc' => 'а', 'id' => 2, 'name' => 'Агутин Юрий Николаевич'],
  ['abc' => 'б', 'id' => 4, 'name' => 'Баринов Олег Юрьевич'],
];

Далее проходим по всему массиву и складываем по начальным буквам:
$alphabet = [];
foreach ($data as $row){
  $alphabet[$row['abc']][$row['id']] = $row['name'];
}

Получается что-то подобное:
$alphabet = [
  'а' => [
    1 => 'Абрамов Михаил Фёдорович',
    2 => 'Агутин Юрий Николаевич',
  ],
  'б' => [
    4 => 'Баринов Олег Юрьевич',
  ],
];

Дальше, я думаю, вы уже сами догадались:
foreach($alphabet as $alpha => $rows){
  echo '<h2>'.$alpha.'</h2>';
  echo '<ul>';
  foreach ($rows as $id => $name){
    echo '<li><a href="/person?id='.$id.'">'.$name.'</a></li>';
  }
  echo '</ul>';
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы