За последние 24 часа нас посетили 53514 программистов и 1712 роботов. Сейчас ищут 869 программистов ...

Авторизация для нескольких юзеров

Тема в разделе "PHP для новичков", создана пользователем paqwerty, 28 май 2009.

  1. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Доброго времени суток!

    У меня есть задача - сделать систему доступа "юзер заходит на сайт, вводит логин-пароль и взависимости от его логин-пароля его перекидывает на определенную сраницу", т.е. есть, например, 3 прайса с разными ценами, есть, например, 9 юзеров, есть 3 группы, которые определяют какой прайс для какого юзера.

    Данную задачу я реализовал, но т.к. по php я не профи прошу вас помощи - как мне мой код реализовать через массив.

    Вот мой код:

    1. Файл логинов и паролей pass.php
    PHP:
    1.  
    2. <?
    3.  
    4. $logname = юзер1;
    5. $logname1 = юзер2;
    6. $logname2 = юзер3;
    7. $logname3 = юзер4;
    8. $logname4 = юзер5;
    9. $logname5 = юзер6;
    10. $logname6 = юзер7;
    11. $logname7 = юзер8;
    12. $logname8 = юзер9;
    13.  
    14. $password = пароль1;
    15. $password1 = пароль2;
    16. $password2 = пароль3;
    17. $password3 = пароль4;
    18. $password4 = пароль5;
    19. $password5 = пароль6;
    20. $password6 = пароль7;
    21. $password7 = пароль8;
    22. $password8 = пароль9;
    23.  
    24. ?>
    25.  
    2. Собственно файл авторизации login.php
    PHP:
    1.  
    2.  
    3. include ("pass.php");
    4. global $log;
    5. global $pass;
    6.  
    7. function login()
    8. {
    9.     include ("pass.php");
    10.     global $log;
    11.     global $pass;
    12.  
    13.     echo "<form method=POST action=admin2.php?auth=view>
    14.           <p>Введите пароль:</p>
    15.           <p><input type='text' name='log' size='20' value='$log'></p>
    16.           <p><input type='password' name='pass' size='20' value='$pass'></p>
    17.           <input type='submit' value='Вход'>
    18.           </form>";
    19. }
    20.  
    21. function view()
    22. {
    23.     include ("pass.php");
    24.     global $log;
    25.     global $pass;
    26.  
    27.     if ($pass != null)
    28.         {
    29.             switch ($pass) {
    30.             case $pass == $password:
    31.                 header('Refresh: 3; URL=http://www.pp.ru/150509.xls');
    32.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    33.                 exit;
    34.             break;
    35.             case $pass == $password1:
    36.                 header('Refresh: 3; URL=http://www.pp.ru/140509.xls');
    37.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    38.                 exit;
    39.             break;
    40.             case $pass == $password2:
    41.                 header('Refresh: 3; URL=http://www.pp.ru/140509.xls');
    42.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    43.                 exit;
    44.             break;
    45.             case $pass == $password3:
    46.                 header('Refresh: 3; URL=http://www.pp.ru/140509.xls');
    47.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    48.                 exit;
    49.             break;
    50.             case $pass == $password4:
    51.                 header('Refresh: 3; URL=http://www.pp.ru/140509.xls');
    52.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    53.                 exit;
    54.             break;
    55.             case $pass == $password5:
    56.                 header('Refresh: 3; URL=http://www.pp.ru/150509.xls');
    57.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    58.                 exit;
    59.             break;
    60.             case $pass == $password6:
    61.                 header('Refresh: 3; URL=http://www.pp.ru/150509.xls');
    62.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    63.                 exit;
    64.             break;
    65.             case $pass == $password7:
    66.                 header('Refresh: 3; URL=http://www.pp.ru/150509.xls');
    67.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    68.                 exit;
    69.             break;
    70.             case $pass == $password8:
    71.                 header('Refresh: 3; URL=http://www.pp.ru/150509.xls');
    72.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    73.                 exit;
    74.             break;
    75.             default:
    76.                 echo ("Неправильный пароль или логин!");
    77.                             }
    78.         }
    79.     else
    80.         {
    81.         echo "Неправильный пароль или логин!";
    82.         }
    83. }
    84.  
    85. switch ($auth)
    86. {
    87.     case "view": view(); break;
    88.     default: login(); break;
    89. }
    90.  
    91. ?>
    92.  
    Пробовал делать массив логин и паролей:
    PHP:
    1.  
    2. $name = array(1 => "юзер1", "юзер2", "юзер3", "юзер4");
    3. $par = array(1 => "пароль1", "пароль2", "пароль3", "пароль4");
    4.  
    и обрабатывать их так:
    PHP:
    1.  
    2. for ($counter=1; $counter<5; $counter++)
    3. {
    4.    if (($_POST['name'][$counter] == $log) && ($_POST['par'][$counter] == $pass))
    5.       {
    6.          switch ($pass)  {
    7.             case $pass == $par[1]:
    8.                 header('Refresh: 3; URL=http://www.pp.ru/150509.xls');
    9.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    10.                 exit;
    11.             break;
    12.             case $pass == $par[2]:
    13.                 header('Refresh: 3; URL=http://www.pp.ru/140509.xls');
    14.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    15.                 exit;
    16.             break;
    17.             case $pass == $par[3]:
    18.                 header('Refresh: 3; URL=http://www.pp.ru/140509.xls');
    19.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    20.                 exit;
    21.             break;
    22.             case $pass == $par[4]:
    23.                 header('Refresh: 3; URL=http://www.pp.ru/140509.xls');
    24.                 echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    25.                 exit;
    26.             break;
    27.             default:
    28.                 echo ("Неправильный пароль или логин!");
    29.                                 }
    30.       }
    31.       else
    32.          {
    33.             echo "Неправильный пароль или логин!";
    34.          }
    35. }
    36.  
    Но так не работает, и как мне реализовать группы - представить не могу.

    Помогите, кому не лень пожалуйста.
     
  2. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    я бы сделал маленькую бд с такой структурой:

    таблица users:
    user_id | user_name | user_pass | group_id
    1 | Вася | 123 | 33
    2 | Петя | 456 | 44

    таблица user_groups:
    group_id | group_name | price_type
    44 | Одмины | file-a.xls
    33 | Юзеры | file-b.xls


    алгоритм.

    Вводим логин и пасс
    находим по этим данным значение поля group_id
    [sql] select group_id from users where name=$name and pass=$pass [/sql]
    получаем переменную $group_id
    [sql]select price_type from user_groups where group_id=$group_id [/sql]
    получили $price_type

    а этот price_type можно подсунуть в редирект.

    этот пример не идеален, но для решения задачи вполне сойдет.
    можно сделать и на массивах, то так мне кажется намного удобнее и понятнее.
     
  3. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    а вот пример без mysql.

    PHP:
    1.  
    2. <?php
    3.  
    4. $redirect['Пользователь1']['Пароль1']='1.xls';
    5. $redirect['Пользователь2']['Пароль2']='2.xls';
    6. $redirect['Пользователь3']['Пароль3']='3.xls';
    7.  
    8. $login = $_POST['login'];
    9. $pass = $_POST['pass'];
    10.  
    11. header('Refresh: 3;'.$redirect[$login][$pass]);
    12. echo 'Через 10 сек. вы будете перенаправлены на новую страницу.';
    13.  
    14. ?>
    15.  
    разумеется, надо будет доделать проверку на наличие учетной записи и правильность пароля.
    тут поможет функция array_key_exists().
     
  4. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    El Loco, спасибо что помогаешь!

    Меня заинтересовал твой вариант с бд.

    Я правильно понимаю

    PHP:
    1.  
    2. $z = mysql_query("SELECT group_id FROM users WHERE users_name='$log'", $link_id);
    3.  
    $z - это содержимое поля group_id и если я например попрошу пхп вывести мне на экран $z, он мне выведед id конкретной записи???
     
  5. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    С $z я вроде как разобрался:

    PHP:
    1.  
    2. $link_id = db_connect();
    3. $z = mysql_query("SELECT group_id FROM users WHERE user_name='$log'", $link_id);
    4. while($query_data1 = mysql_fetch_row($z))
    5.     {
    6.     $zz = "$query_data1[0]";
    7.     echo "$zz";
    8.     }
    9.  
    Он мне показывает id группы для введенного логина, но когда пробую создать условие для этого номера - получается фигня:

    PHP:
    1.  
    2.     if($zz == 2)
    3.         {
    4.         echo "GOOD";
    5.         }
    6.     else
    7.         {
    8.         echo "BAD";
    9.         }
    10.     }
    11.  
    Он мнея всегда пишет BAD хотя на строчку выше он пишет для введенного логина id = 2

    ...
     
  6. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    А сели в условии поставить вмето == обратное <>, то выводит GOOD. Т.е. результат условия показывает, что id группы = 2 не равно 2...
     
  7. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Т.е. получается, что типы данных не совпадают что ли?...
     
  8. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Сообразил, у меня переменная $zz не передавалась в условие после цикла, тока не понимаю теперь как ее передать
     
  9. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    я не знаю как у тебя все организовано.
    все можно оформить одним файлом. там и городить особо нечего.
    должно быть что-то типа этого:
    PHP:
    1. <?
    2. // ...
    3. // подключение к бд
    4. // ...
    5. $z = mysql_query("SELECT group_id FROM users WHERE user_name='$log' LIMIT 0,1");
    6. if(mysql_num_rows($z)>0) {
    7.     $query_data1 = mysql_fetch_row($z))
    8.     $zz = "$query_data1[0]";
    9.     echo "$zz";
    10. } else echo 'Запрос вернул пустой результат!';
    11.  
    12. if($zz == '2')
    13.     echo "GOOD";
    14. else
    15.     echo "BAD";
    16.  
    17. ?>
    я тебе в принципе алгоритм написал. там ничего сложного.
    там даже можно одним запросом обойтись вместо двух. но я привел простой пример, чтобы было понятно, что откуда берется и передается.
     
  10. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    В итоге я сделал вот так:

    PHP:
    1.  
    2. <?php
    3.  
    4. include "./common_db.inc";
    5.  
    6. $link_id = db_connect();
    7. $z = mysql_query("SELECT * FROM users WHERE user_name='$log' AND user_pass='$pass'", $link_id);
    8.  
    9. while($query_data2 = mysql_fetch_row($z))
    10.     {
    11.     $login = "$query_data2[1]";
    12.     $password = "$query_data2[2]";
    13.     $group = "$query_data2[3]";
    14. //  echo "Логин - $login<br>Пароль - $password<br>Группа - $group<br>";
    15.     }
    16.  
    17. if($login == $log && $password == $pass)
    18.     {
    19.     $q = mysql_query("SELECT * FROM users_groups WHERE group_id='$group'", $link_id);
    20.     while($query_data1 = mysql_fetch_row($q))
    21.         {
    22.         $zz = "http://www.pp.ru/$query_data1[2]";
    23.         header ("Refresh: 3; URL=$zz");
    24.         echo 'Скачивание начнется через 10 секунд.';
    25.             exit;
    26.         }
    27.     }
    28. else
    29.     {
    30.     echo "Неверный логин или пароль";
    31.     }
    32.  
    33. echo "<form method=POST action=log.php>
    34.       <p>Введите пароль:</p>
    35.       <p><input type='text' name='log' size='20' value='$log'></p>
    36.       <p><input type='password' name='pass' size='20' value='$pass'></p>
    37.       <input type='submit' value='Вход'>
    38.       </form>";
    39.  
    40. ?>
    41.  
    Все супер. Только вот один вопрос остался. Когда я создавал БД, то поле с паролем я решил шифровать в MD5. И при авторизации не принимает пароль. Как решить эту проблемку?

    P.S.
    Для El Loco Спасибо!!!
     
  11. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    И с шифровкой разобрался, ура!
     
  12. El Loco

    El Loco Активный пользователь

    С нами с:
    26 дек 2008
    Сообщения:
    41
    Симпатии:
    0
    пару замечаний.
    цикл while вызывать в данном случае некрасиво, так как ты не перебираешь несколько строк.
    я в первом запросе добавил "LIMIT 0,1". это должно говорить о том, что запрос вернет одну строку.
    функция mysql_fetch_row вернет тебе один ряд.
    поэтому достаточно проверить, что запррос вернул ненулевой результат, и воспользоваться фукцией mysql_fetch_row.

    и в конце ты выводишь хтмл-код формы командой echo.
    это тоже некрасиво.
    достаточно перед этим закрыть пхп-код тегом ?> и вставить код формы в исходном виде.
    и я не понял зачем ты в форме пишешь
    HTML:
    1. value='$pass'
    и
    HTML:
    1. value='$log'
    если и выводят строку вперемешку с переменными, то принято соединять их точкой.
    PHP:
    1. <?
    2. $string = 'начало' . $my_var . 'продолжение';
    3. ?>
    в твоем случае я не знаю, зачем ты так делаешь.