Меню навигации HTML PHP и циклы....

VovkaS

Guest
Меню навигации HTML PHP и циклы....

Делаю меню навигации но получается не то, что хотел бы.
Меню состоит из трех областей.

1 - берутся из базы годы, группируются и выводятся в ячейку в виде ссылок. Это происходит по умолчанию. По клику на этой ссылке
в базу уходит запрос на выборку специальности с учетом выбранного года. И формируется следующая часть меню.
2 - Специальности, эта часть меню заполняется после вышеописанного клика. По клику на этой менюшке формируется запрос с учетом года и специальности и выводятся фамилии.
3 - Фамилии. По клику на фамилии показывается персональная инфа...

И вот тут у меня насинаются косяки.
Меню Специальности очищается а фимилии скрывается вовсе.

Я понимаю, что неправильно написал код но разобраться немогу.
Да и вообще правильный механизм я избрал или нет. Может есть, что попроще(прозрачнее).

Вот код меню:
PHP:
<?  //Error_Reporting(E_ALL & ~E_NOTICE);
 require ("connect.php");
        $query = ("SELECT education FROM main GROUP BY education ORDER BY education");
      $result = mysql_query ($query)          or die ("Сбой на сервере, данные не найдены.");  ?>
        <table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="#000066">          <tr>
            <td>
              <table width="100%" border="0" cellspacing="1" cellpadding="3">
  <tr>
  <td width="%" align="center" valign="middle" bgcolor="#FFFFFF">Выпуск:
<?
  // Строим меню ГОДЫ
  while ($myrow = mysql_fetch_array($result)) {

  printf("<a href=\"%s?education=%s\"> %s</a>\n",$PHP_SELF,$myrow["education"],$myrow["education"]);}

?>

    </td>
  <td width="60%" align="center" valign="middle" bgcolor="#CCCCCC">Специальность:    
<?
  if (isset($_GET['education']))  {

  $query = ("SELECT education,specialty FROM main WHERE education=$education GROUP BY specialty ORDER BY specialty");  $result = mysql_query ($query)  or die ("Сбой на сервере, данные не найдены.");
  // Строим меню Специальности с учетом Года  
while ($myrow = mysql_fetch_array($result)) {

  printf("<a href=\"%s?specialty=%s&education=%s\"> %s</a>\n",$PHP_SELF,$myrow["specialty"],$myrow["education"],$myrow["specialty"]);}  }
  ?>

    </td>
  </tr>
<?
  if (isset($_GET['specialty']))  {
  $query = ("SELECT family FROM main WHERE education=$education AND specialty='$specialty' ORDER BY family");  $result = mysql_query ($query)         or die ("Сбой на сервере, данные не найдены.");  ?>
<tr align="center" valign="middle" bgcolor="#bcd8e9">  
<td colspan="2" height="18">Выпускники:   
 <?
 // Выводим Выпускников с учетом Года и Специальности  
while ($myrow = mysql_fetch_array($result)) {
  printf("<a href=\"%s?family=%s\"> %s</a>\n",$PHP_SELF,$myrow["family"],$myrow["family"]);}  }  
?>
    </td>  
</tr>  
</table>
            </td>
          </tr>
        </table>
А само меню в действии здесь.
http://mgrt.best-host.ru/base.php

Вообще хотелось бы написать более гибкое меню но не знаю на, что опираться.

-~{}~ 23.11.04 19:56:

Скажите хотябы правильным ли путем иду... или может есть другие способы, относительно простые, решения задачи построения меню?
 

Саня

Guest
В код вникать нет желания.

Наиболее примитивный принцип такой:
страница 1: года - ссылки на страницу 2 вида ?year=...;
страница 2: специальности - ссылки на страницу 3 вида ?year=$_GET["year"]&prof=...;
страница 3: выбор из базы данных фамилий, где год = $_GET["year"] и специальность = $_GET["prof"]. Каждая фамилия является ссылкой на страницу 4 вида ?id=...
страница 4: вывод информации о человеке с id = $_GET["id"].

Что ещё надо:
1. обязательно прочитать про SQL-инъекции;
2. обрабатывать ситуации, когда пользователь сам вбил содержимое переменных в адресной строке или сам вбил адрес любой страницы после первой. То есть на каждой странице проверять, все ли необходимые Гет-переменные есть и у всех ли допустимое значение.
 

VovkaS

Guest
Саня
Да с $_GET["year"] я облажался...

А можно обойтись одним обращением к базе? Где то запомнить результат и с ним уже работать?
 

Serguitar

Новичок->продвинутый
VovkaS
Можно. Можно передавать по-разному. Но лучше делать как тебе советует Саня.
 

Саня

Guest
VovkaS
Не вижу как. Есть 4 запроса: на выбор годов, специальностей, только фамилий с ид, информации по ид.
Их объединить может как-то и можно, но за такое надо расстреливать.

А если ты по поводу второго пункта моего предыдущего поста, то достаточно проверять только на иссет и ис_нумерик, а более серьёзная проверка не нужна, так как если пользователь вбил вместо года 1990 год 1991, и такого выпуска нет, то он и получит себе пустой список фамилий. От этого ничего ужасного не произойдёт. Просто, рекомендуется не допускать ошибки на сервере (или вывода текста об ошибке) и инъекции.
 

VovkaS

Guest
Саня по поводу запросов понял. писать столько раз сколько нужно.
Я думал может есть какие передовае способы считывания данных в массив или во, что то подобное..... но меня вполне устраивает вариант с кучей селектов...

По поводу проверки не совсем понял. В меню второго порядка нужно проверять не так:

if (isset($_GET['year']))

а так:

if (isset($_GET['year']) and (isset($_GET['prof']))

тоесть обе переменные?
 

Саня

Guest
Страница ; Проверка
1 ; -
2 ; isset($_GET['year']) && is_numeric($_GET['year'])
3 ; (isset($_GET['year']) && is_numeric($_GET['year'])) && (isset($_GET['prof']) && is_numeric($_GET['prof']))
4 ; isset($_GET['id']) && is_numeric($_GET['id'])
 

VovkaS

Guest
Саня
из мана:
is_numeric - определяет, является ли переменная числом или числовой строкой.
в данном случаи ($_GET['prof'])) - не число. А строка. Ее нужно проверять через is_string ? или нет?
 

Саня

Guest
VovkaS
Ясно. Тогда лучше не проверять. Тогда просто иссет...
Только я не исключаю, что лучше, чтобы это было число. Как я понимаю, сейчас есть одна таблица с инфой о человеке. В таблице есть поле "Специальность". У каждого написана в этом поле его специальность. То есть есть 100 программистов; в таблице 100 раз встречается слово "программист".
Лучше иметь ещё таблицу специальностей, где будет каждая специальность прописана по одному разу и каждой будет поставлен в соответствие уникальный код, который и будет храниться в таблице с личной инфой. Или можно хранить специальности в массиве. Принцип тот же.
Это более грамотно (отсутствует избыточность хранимой информации, можно грамотно построить индекс по данному полю), но не обязательно.
 
Сверху