[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Просьба оценить код
code2node
Понемного изучаю PHP, ну и mySQL заодно. Проштудировал теорию, в качестве практики решаю задачки с одного сайта. Дошёл до более менее сложной (по моим меркам) задачи, и самостоятельно решил её. Всё работает, вроде как надо. Но понимаю, что код новичка не может быть хорошим, не говоря об идеальном. Поэтому хотелось бы попросить гуру и не очень оценить способ решения задачи и вообще выразить обоснованную критику по всему коду в целом. Буду благодарен за ответы ;)

Задача:
Цитата
Имеется таблица name, в которой одно из полей имеет имя name, и содержит фамилии людей. Необходимо создать скрипт index.php, который при первом обращении выводит весь русский алфавит и формирует список букв в виде ссылок ссылкок в том случае, если в таблице есть фамилии, начинающиеся на эти буквы. Если фамилий с такой буквой нет - буква должна выводится не подсвеченая.

Нажатие на букву-ссылку вызывает опять index.php, который сначала выводит вышеописанную конструкцию, а под ней выводит список, состоящий только из num (пусть для определённости 3) фамилий, начинающихся на выбранную букву. Если общее количество фамилий превышает num, то необходим вывести ссылки на страницы с продолжением этого списка.

Каждая фамилия в списке является ссылкой, нажатие на которую вызывает снова index.php. Теперь, кроме всего вышеописанного, добавляется еще "карточка" выбранного человека, состоящая из перечисления названий всех полей в таблице и соответствующих значений.


Решение:
<!DOCTYPE html>
<
html lang="ru">
<
head>
<
meta charset="UTF-8">
<
title>Фамилии</title>
<
style>
a.alph,
span.alph {
display: inline-block;
font-size: 30px;
color:#2055e5;
padding: 10px;
}

a.lastname {
font-size: 20px;
padding: 10px;
color:#2055e5;
}

a.page_num {
display: inline-block;
font-size: 18px;
color: #7a7686;
padding: 10px;
}


a:hover {
font-weight: bold;
}

span.card {
display: block;
margin-top: 30px;
font-size: 20px;
}
</style>
</
head>
<
body>

<?
$alph = ['А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ь','Ы','Ъ','Э','Ю','Я'];
$num = 3; //По сколько фамилий выводить на странице

// Подключаемся к базе

$link = mysqli_connect('localhost', 'root', '', 'web');
if (!$link) {
printf("Невозможно подключиться к базе данных. Код ошибки: %s\n", mysqli_connect_error());
exit;
}
// Запрашиваем все имена из базы и заносим в массив
$query = "SELECT name FROM name";
if ($result = mysqli_query($link, $query)) {
while ($row = mysqli_fetch_array($result, MYSQL_NUM)) {
$lastnames[] = $row[0];
}
}


// Перебираем буквы алфавита
foreach($alph as $letter) {
// Перебираем фамилии
foreach ($lastnames as $lastname) {
$printed = '';
// Проверяем есть ли фамилия на нужную букву
$res = preg_match("/^$letter.+/i", $lastname, $matches);
if ($res) {
// Если есть выводим букву ссылкой
echo "<a class='alph' href='?letter=$letter'>$letter</a>";
$printed = "yes";
break;
}
}

// Если нет, выводим букву в виде ссылки
if (!$printed) {
echo "<span class='alph'>$letter</span>";
}
}

echo "<hr>";

$get_let = $_GET["letter"];
if ($get_let && array_search($get_let, $alph) === FALSE) {
echo "Неверная буква!";
} elseif ($get_let) {
foreach ($lastnames as $lastname) {
// Проверяем есть ли фамилия на нужную букву
$res = preg_match("/^$get_let.+/iu", $lastname, $matches);
if ($res) {
// Заносим всё найденное в массив
$good[] = $matches[0];
}
}

// Разбиваем массив по кол-ву фамилий на страницу
$good = array_chunk($good, $num);
// Считаем кол-во страниц для вывода всех фамилий
$cnt = count($good);
// Номер страницы
if (is_numeric($_GET["page"])) {
$page_num = $_GET["page"];
} else {
$page_num = 1;
}
// Выводим фамилии из подмассива, основываясь на номере страницы
if ($page_num <= $cnt) {
foreach ($good[$page_num - 1] as $ln) {
echo "<a class='lastname' href='?letter=$get_let&page=$page_num&lastname=$ln'>$ln</a><br>";
}
}

echo "<hr>";
if ($cnt > 1) {
// Выводим номер страницы
for ($i = 1; $i <= $cnt; $i++) {
if ($page_num == $i) echo "<b>";
echo "<a class='page_num' href='?letter=$get_let&page=$i'>$i</a>";
if ($page_num == $i) echo "</b>";
}
}

// Выводим карточку пользователя
$name = $_GET["lastname"];
if ($name && array_search($name, $lastnames) === FALSE) {
echo "Неверная фамилия!";
} else {
$get_info = "SELECT * FROM name WHERE name='$name'";
if ($res = mysqli_query($link, $get_info)) {
while ($row = mysqli_fetch_array($res)) {
printf("<span class='card'> ID: %d<br>
Фамилия: %s<br>
Дополнительно: %s</span>"
, $row["id_name"], $row["name"], $row["description"]);
}
}
}
}

?>
</body>
</
html>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.