За последние 24 часа нас посетили 21864 программиста и 1334 робота. Сейчас ищут 676 программистов ...

Простейшая авторизация... но мне не понятно.

Тема в разделе "PHP для новичков", создана пользователем Sofia, 29 сен 2008.

Статус темы:
Закрыта.
  1. Sofia

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

    С нами с:
    25 сен 2008
    Сообщения:
    963
    Симпатии:
    2
    Вроде бы все правильно, но не получается создать просто страницы простейшей авторизации:
    должно уметь:
    Регистрация
    - логин (a-z0-9)
    - пароль
    Вход
    - логин
    - пароль
    Cookie
    - уникальный идентификатор юзера
    - хэш
    При регистрации в базу данных записываеться логин пользователя и пароль(в двойном md5 шифровании)

    Значит что я делаю:
    вот БД в мускуле
    [sql]--
    - Структура таблицы `users`
    -
    CREATE TABLE `users` (
    `user_id` int(11) unsigned NOT NULL auto_increment,
    `user_login` varchar(30) NOT NULL,
    `user_password` varchar(32) NOT NULL,
    `user_hash` varchar(32) NOT NULL,
    `user_ip` int(10) unsigned NOT NULL default '0',
    PRIMARY KEY (`user_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;[/sql]

    создаем файлик register.php:
    PHP:
    1.  
    2. <?
    3. // Страница регистрации нового пользователя
    4.  
    5. # Соединямся с БД
    6. mysql_connect("localhost", "myhost", "myhost");
    7. mysql_select_db("testtable");
    8.  
    9.  
    10. if(isset($_POST['submit']))
    11. {
    12.     $err = array();
    13.  
    14.     # проверям логин
    15.    if(!preg_match("/^[a-zA-Z0-9]+$/",$_POST['login']))
    16.     {
    17.         $err[] = "Логин может состоять только из букв английского алфавита и цифр";
    18.     }
    19.    
    20.     if(strlen($_POST['login']) < 3 or strlen($_POST['login']) > 30)
    21.     {
    22.         $err[] = "Логин должен быть не меньше 3-х символов и не больше 30";
    23.     }
    24.    
    25.     # проверяем, не сущестует ли пользователя с таким именем
    26.    $query = mysql_query("SELECT COUNT(user_id) FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."'");
    27.     if(mysql_result($query, 0) > 0)
    28.     {
    29.         $err[] = "Пользователь с таким логином уже существует в базе данных";
    30.     }
    31.    
    32.     # Если нет ошибок, то добавляем в БД нового пользователя
    33.    if(count($err) == 0)
    34.     {
    35.        
    36.         $login = $_POST['login'];
    37.        
    38.         # Убераем лишние пробелы и делаем двойное шифрование
    39.        $password = md5(md5(trim($_POST['password'])));
    40.        
    41.         mysql_query("INSERT INTO users SET user_login='".$login."', user_password='".$password."'");
    42.         header("Location: login.php"); exit();
    43.     }
    44.     else
    45.     {
    46.         print "<b>При регистрации произошли следующие ошибки:</b><br>";
    47.         foreach($err AS $error)
    48.         {
    49.             print $error."<br>";
    50.         }
    51.     }
    52. }
    53. ?>
    54.  
    55.  
    56. <form method="POST">
    57. Логин <input name="login" type="text"><br>
    58. Пароль <input name="password" type="password"><br>
    59. <input name="submit" type="submit" value="Зарегистрироваться">
    60. </form>
    61. ?>
    создаем еще один файлик login.php:
    PHP:
    1. <?
    2. // Страница авторизации
    3.  
    4. # Функция для генерации случайной строки
    5. function generateCode($length=6) {
    6.     $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    7.     $code = "";
    8.     $clen = strlen($chars) - 1;  
    9.     while (strlen($code) < $length) {
    10.             $code .= $chars[mt_rand(0,$clen)];  
    11.     }
    12.     return $code;
    13. }
    14.  
    15.  
    16. # Соединямся с БД
    17. mysql_connect("localhost", "myhost", "myhost");
    18. mysql_select_db("testtable");
    19.  
    20. if(isset($_POST['submit']))
    21. {
    22.     # Вытаскиваем из БД запись, у которой логин равняеться введенному
    23.    $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");
    24.     $data = mysql_fetch_assoc($query);
    25.    
    26.     # Соавниваем пароли
    27.    if($data['user_password'] === md5(md5($_POST['password'])))
    28.     {
    29.         # Генерируем случайное число и шифруем его
    30.        $hash = md5(generateCode(10));
    31.            
    32.         if(!@$_POST['not_attach_ip'])
    33.         {
    34.             # Если пользователя выбрал привязку к IP
    35.            # Переводим IP в строку
    36.            $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
    37.         }
    38.        
    39.         # Записываем в БД новый хеш авторизации и IP
    40.        mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
    41.        
    42.         # Ставим куки
    43.        setcookie("id", $data['user_id'], time()+60*60*24*30);
    44.         setcookie("hash", $hash, time()+60*60*24*30);
    45.        
    46.         # Переадресовываем браузер на страницу проверки нашего скрипта
    47.        header("Location: check.php"); exit();
    48.     }
    49.     else
    50.     {
    51.         print "Вы ввели неправильный логин/пароль";
    52.     }
    53. }
    54. ?>
    55. <form method="POST">
    56. Логин <input name="login" type="text"><br>
    57. Пароль <input name="password" type="password"><br>
    58. Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br>
    59. <input name="submit" type="submit" value="Войти">
    60. </form>
    61. ?>
    ну и надо теперь проверить скрипт, создаем последний файлик check.php
    PHP:
    1.  
    2. <?
    3. // Скрипт проверки
    4.  
    5. # Соединямся с БД
    6. mysql_connect("localhost", "myhost", "myhost");
    7. mysql_select_db("testtable");
    8.  
    9. if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
    10. {  
    11.     $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");
    12.     $userdata = mysql_fetch_assoc($query);
    13.  
    14.     if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
    15.  or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR'])  and ($userdata['user_ip'] !== "0")))
    16.     {
    17.         setcookie("id", "", time() - 3600*24*30*12, "/");
    18.         setcookie("hash", "", time() - 3600*24*30*12, "/");
    19.         print "Хм, что-то не получилось";
    20.     }
    21.     else
    22.     {
    23.         print "Привет, ".$userdata['user_login'].". Всё работает!";
    24.     }
    25. }
    26. else
    27. {
    28.     print "Включите куки";
    29. }
    30. ?>
    должна работать регистрация и авторизация... ну должна и все!... работает только регистрация, авторизация нет... все перепроверила. не вижу ошибки. Еще надо чтоб после регистрации перенаправляло пользователя на index.php. вобщем в корень сайта, а у меня просто выдает что страница ненайдена. и при авторизации должно тоже перенаправлять на index.php, а авторизация вообще не работает... я уже сдаюсь и прошу специалистов помочь разобраться в моем корявом почерке. (большинство кусков было вытянуто с уроков Попова, часть с Нюки...) Если есть конечно желание и время, то помогите плз.
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Он Вас научит...
     
  3. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    *шёпотом* не надо в этом признаваться

    вот один из примеров авторизации, для понимания основ достаточно.
    http://php.ru/forum/viewtopic.php?t=1732

    Можете поискать по форуму, примеров много было.
     
  4. Anonymous

    Anonymous Guest

    предлагаю банить тех, кто его читает.!
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Sofia
    login.php или check.php не работает? И при чем тут register.php, если регистрация работает? Думаешь, кто-то /бесплатно/ будет эти полтораста строк кода дебагить? Вопрос должен быть ясным, код надо приводить только относящийся непосредственно к вопросу. Действуй!
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    надеюсь ты хоть деньги-то ему за это не платила?
     
  7. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    смотрит
     
  8. Sofia

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

    С нами с:
    25 сен 2008
    Сообщения:
    963
    Симпатии:
    2
    Luge я считаю что каждому человеку свойственно ошибаться, но самое главное - признавать свои ошибки. На мой взгляд - Попов единственный кто сделал PHP доступнее во всем рунете. Спасибо за ссылку, почитаю сейчас.

    Горбунов Олег тогда ПНХ тебе :) , ничего глупее я еще во всем рунете не видела, мозг у тебя не больше наперстка :)

    [vs] прочитай еще раз первый пост, последнее предложение. Ты думаешь я навязываю? А такие как ты, которые пальцы крутят и просто флудят на форуме, уже не в моде.

    Mr.M.I.T. заплатила конечно 1600р.
     
  9. Anonymous

    Anonymous Guest

    Бляяя я пацталом. =)

    Точно, надо их банить. У них фимоз головного мозга. И наличие сисек — не оправдание.
     
  10. Anonymous

    Anonymous Guest

    Тема закрыта. С проблемами Жени Попова разбирайтесь на его форуме поддержки.
    А тут зоопарк ламеров мне разводить не надо.
     
Статус темы:
Закрыта.