Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > php+mysql Регистрация пользователей


Автор: Well 23.11.2005, 01:31
Я начинаю только учиться php smile
немного чего уже понял, есть желание написать скрипт авторизации и регистрации пользователей!
Только что то сам смысл написания скрипта немного не понятен!
Если у кого есть что то в исходниках
И в готовом коде буду только благодарен! smile

Автор: Mal Hack 23.11.2005, 01:35
http://vingrad.ru/PHP-ART-002849

Автор: Well 23.11.2005, 01:41
пасибо почитаю!!! smile а что то по проше есть? не вкурсе?

Автор: R.M. 23.11.2005, 02:10
Well

Принцип такой:

Регистрация
Делаеш файл с формой и файл обработчик
Форма - соответствующие поля
Обработчик делаеш INSERT в базу полей

пример
Код
$ins = mysql_query("INSERT INTO users VALUES ('id','".$_POST['login']."','".$_POST['password']."')");


Авторизация
Через escape или просто сравнивай вводимое поле и поле из базы

Да и вобще если ты тока начал попробуй с чегонить полегче

Автор: sugee 23.11.2005, 11:21
После того как юзер авторизировался он должен ходить по сайту под своим логином беспрепятственно. Чтобы при переходе на другие страницы передавать туда логин-пароль их надо сохранить в сессии.
для этого в самом начале скрипта пиши
Код

session_start();

Дальше проверяешь ввел ли он логин-пароль и есть ли они в базе данных
Код

if(isset($_POST['login'])&&isset($_POST['password'])||isset($_SESSION['login'])) {

  if(isset($_POST['login'])&&isset($_POST['password']))
   { $login=$_POST['login'];
     $password=$_POST['password'];
     $_SESSION['login']=$_POST['login']; 


mysql_connect('', '', '');
mysql_select_db('');
$q1=mysql_query("select `log` from `passwords` where `log`='$login'");
$q2=mysql_query("select `passwd` from `passwords` where `passwd`='$password'");
 if(mysql_num_rows($q1)==1&&mysql_num_rows($q2)==1) {
$_SESSION['login']=$_POST['login'];
//...
//собственно страница
//...

   }
 } 

Это я описал авторизацию, с самой регистрацией то есть с занесением новой пары логин-пароль в базу данных все более понятно, но если есть проблемы - пиши.



Автор: Well 23.11.2005, 21:10
Вот что выдает мне страница!!!

При использование во этого скрипта!!!http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=download_file&articleid=2849&attachid=1 что то не могу догнать

Warning: Cannot add header information - headers already sent by (output started at C:\Server_web\www\inc\top.php:20) in C:\Server_web\www\mod\mod4.php on line 34


а вот сама и 34 строка! header( "Location: index.php?mod=mod1" . $par );

Автор: Well 23.11.2005, 21:52
Цитата(Well @ 23.11.2005, 22:10)
Вот что выдает мне страница!!!

При использование во этого скрипта!!!http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=download_file&articleid=2849&attachid=1  что то не могу догнать

Warning: Cannot add header information - headers already sent by (output started at C:\Server_web\www\inc\top.php:20) in C:\Server_web\www\mod\mod4.php on line 34





а вот сама и 34 строка!  header( "Location: index.php?mod=mod1" . $par );


ВСе разобрался сам! smile

Автор: R.M. 24.11.2005, 09:38
Well

Обрати внимание, перед функцией session_start(); не должно быть никаких выводов на экран, желательно вообще сразу после <? ставить

Автор: Well 24.11.2005, 13:27
спасибо учту! smile

Автор: AntonioBanderaz 24.11.2005, 13:36
А если пользователей много - получишь перехлёст сессии...
Сначала надо ставить session_name(mirotime());

Автор: Guest 24.11.2005, 17:24
Цитата(AntonioBanderaz @ 24.11.2005, 13:36)
А если пользователей много - получишь перехлёст сессии...

Можно про это поподробнее..... smile

Автор: AntonioBanderaz 24.11.2005, 18:54
Здесь был уже такой топик, поиск...

Автор: patt 24.11.2005, 20:47
Что то не находит.....

Автор: Well 24.11.2005, 23:49
У меня вопрос возник!!!!
Когда я залогинелся я делаю Редирект на страницу http://++++++++/index.php?mod=mod90
На которой пользователь заполняет форму и посылает их в mysql
а мне он выдает такой http://++++++++/index.php?mod=mod90fields и соответственно загружаеться другая страница что енто может быть и как от этого избавиться! smile

Автор: Простодушный user 25.11.2005, 01:51
2Well
код в студию!!! smile

Автор: Well 25.11.2005, 02:18
Код

<?php

 // Функция получения IP пользователя
 function get_ip()
  {
   if ($ip = getenv("HTTP_CLIENT_IP"))
    {  return $ip;  }

   if ($ip = getenv("HTTP_X_FORWARDED_FOR"))
    {
     if ($ip == '' || $ip == "unknown")
      {  $ip = getenv("REMOTE_ADDR");  }

     return $ip;
    }
   if ( $ip = getenv("REMOTE_ADDR") )
    {  return $ip;  }
  }

 // Вычисляе хэш безопасности
 function hash( $user , $user_agent , $user_ip , $tm )
  {  return md5( $user ) . md5( $user_agent ) . md5( $user_ip ) . md5( $tm );  }

 // Получаем текущее время с учетом дробных частей секунды
 function getmicrotime()
  {
   $mt = explode( " ", microtime() );
   return ( (float)$mt[0] + (float)$mt[1] );
  }

 // Редирект с параметром
 function redirect( $par )
  {
   header( "Location: index.php?mod=mod90" . $par );
   exit;
  }

 // Продление сессии (проверка, что пользователь - авторизован)
 function check()
  {
   // Ищем пользователя с именем, указанным в куках
   $result = mysql_query( "SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_COOKIE['name'] ) . "' LIMIT 1" );

   // Еслии пользователя с таким именем нет, делаем редирект
   if( mysql_num_rows( $result ) == 0 )
    {
     setcookie( "time" , "" , time() - 900 , "/" );
     setcookie( "name" , "" , time() - 900 , "/" );

     redirect( "not_auth" );
    }

   // Парсим полученную запись.
   global $user;
   $user = mysql_fetch_object( $result );

   // Количсетво минут для жизни сессии
   $minutes = 15;
   // Ищем, есть ли активная сессия
   $result = mysql_query( "SELECT `*` FROM `auth_sessions` WHERE `member` = " . $user -> id . " AND `hash` = '" . hash( $user -> name , $_SERVER['HTTP_USER_AGENT'] , get_ip() , $_COOKIE['time'] ) . "' AND `time` > " . ( time() - ( $minutes * 60 ) ) . " LIMIT 1 " );

   // Если нету активной сессии, перекидываем на фору авторизации
   if( mysql_num_rows( $result ) == 0 )
    {
     setcookie( "time" , "" , time() - 900 , "/" );
     setcookie( "name" , "" , time() - 900 , "/" );

     redirect( "not_auth" );
    }

   // Если авторизированный пользователь хочет выйти
   if( isset( $_GET['quit'] ) )
    {
     // Удаляем запись о сессии пользователя
     mysql_query( "DELETE FROM `auth_session` WHERE `id` = " . $user -> id . " AND `hash` = '" . hash( $user -> name , $_SERVER['HTTP_USER_AGENT'] , get_ip() , $_COOKIE['time'] ) . "'" );

     // чищаем куки и усианавливаем время жизни в прошлом
     setcookie( "time" , "" , time() - 900 , "/" );
     setcookie( "name" , "" , time() - 900 , "/" );

     // Возвращаем значение "Ложь"
     return FALSE;
    }
   // Иначе, т.е. если пользователь не хочет выходить
   else
    {
     // Обновляем время последней активности пользователя на текущее.
     mysql_query( "UPDATE `auth_session` SET `time` = " . time() . " WHERE `member` = " . $user -> id . " AND `hash` = '" . hash( $user -> name , $_SERVER['HTTP_USER_AGENT'] , get_ip() , $_COOKIE['time'] ) . "'" );

     // Продлеваем время жизни кук
     setcookie( "time" , $_COOKIE['time'] , time() + ( $minutes * 60 ) , "/" );
     setcookie( "name" , $_COOKIE['name'] , time() + ( $minutes * 60 ) , "/" );

     // Возвращаем значение "Истина"
     return TRUE;
    }
  }

 // Функция авторизации
 function auth()
  {
   // Ищем пользователя с именем, указанным в куках
   $result = mysql_query( "SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_POST['name'] ) . "' AND `password` = '" . md5( $_POST['pass'] ) . "' LIMIT 1" );

   // Еслии пользователя с таким именем нет, делаем редирект
   if( mysql_num_rows( $result ) == 0 )
    {  redirect( "mod94" );  }

   // Парсим полученную запись.
   $user = mysql_fetch_object( $result );

   // Получаем текущее время с учетом дробных частей секунды
   $tm = getmicrotime();
   // Вставляем запись в таблицу с сессиями.
   mysql_query( "INSERT INTO `auth_sessions` VALUES( " . $user -> id . " , " . time() . " , '" . hash( $user -> name , $_SERVER['HTTP_USER_AGENT'] , get_ip() , $tm ) . "' )" );

   // Ставим пользователю куки с его логинов и уникальным временем авторизации. Время жизни кук - 15 минут
   setcookie( "time" , $tm , time() + 900 , "/" );
   setcookie( "name" , $user -> name , time() + 900 , "/" );

   // делам редирект без параметра, т.к. никаких ошибок не было
   redirect( "" );
  }

 // Функция регистрации
 function reg()
  {
   // Ищем пользователя с именем, указанным в форме регистрации
   $result = mysql_query( "SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_POST['name'] ) . "' LIMIT 1" );

   // Если пользователь найден, делаем редиркт
   if( mysql_num_rows( $result ) == 1 )
    {  redirect( "mod93" );  }

   // Иначе, регистрируем пользователя
   mysql_query( "INSERT INTO `auth_members` VALUES ( '' , '" . mysql_escape_string( $_POST['name'] ) . "' , '" . md5( $_POST['pass1'] ) . "' )" );
   $_POST['pass'] = $_POST['pass1'];

   // Делаем как бы автоматическую авторизацию после регисрации.
   auth();
  }

 // ---------------
 // Соединение с MySQL не комментирую, т.к. не в тему статьи

 $host = "localhost";
 $port = "3306";
 $user = "";
 $pass = "";
 $dbnm = "";

 $h = ( empty( $post ) ) ? $host : $host . ":" . $port;

 $db = mysql_connect( $h , $user , $pass );

 if( !$db )   // Если соединиться не удалось:
  {
   print ("Datebase connection failed.");
   exit();
  }

 if( ! mysql_select_db( $dbnm ) )
  {
   print ("Datebase select failed.");
   exit();
  }

 // ---------------

 // Если нажата кнопка с именем blogin (Авторизация)
 if( $_SERVER['REQUEST_METHOD'] == "POST" && isset( $_POST['blogin'] ) )
  {
   // Если поле логина или пароля пустое - делаем редирект
   if( empty( $_POST['name'] ) || empty( $_POST['pass'] ) )
    {  redirect( "mod91" );  }

   // В протовном случае переходим к авторизации
   auth();
  }

 // Если нажата кнопка с именем breg (Регистрация)
 if( $_SERVER['REQUEST_METHOD'] == "POST" && isset( $_POST['breg'] ) )
  {
   // Если поле логина или пароля или его подтверждения - пусты делаем редирект
   if( empty( $_POST['name'] ) || empty( $_POST['pass1'] ) || empty( $_POST['pass2'] ) )
    {  redirect( "fields" );  }

   // Если введенные пароли не совпадают - делаем редирект
   if( md5( $_POST['pass1'] ) != md5( $_POST['pass2'] ) )
    {  redirect( "mod92" );  }

   // Иначе переходим к функции регистрации
   reg();
  }

 // Если у поьзователя стоят куки и функция check() скажет что пользователь залогинен
 if( isset( $_COOKIE['time'] ) && isset( $_COOKIE['name'] ) && check() == TRUE )
  {  print "Welcome $name.<br><a href='?quit'>Выйти</a>";  }
 // иначе
 else
  {
   // Если была ошибка, выводим соответствующее сообщение
   if( ! empty( $_GET['mod'] ) )
    {
     switch( $_GET['mod'] )
      {
       case "nepass":   print "Пароли не совпадают";
            break;
       case "not_auth": print "Логин или пароль неверный.";
            break;
       case "fields":   print "Не заполнены все поля";
            break;
       case "exists":   print "Пользователь с таким именем уже существует";
            break;
      }

     print "<br><br>";
    }
   // И показываем форму

?>
<form action='' method='POST'>
Логин: <input type='text' name='name' maxlength='127' value=''><br>
Пароль: <input type='password' name='pass' maxlength='127' value=''><br>
<input type='Submit' name='blogin' value='Залогинется'><br>
</form>
Регистрация: <form action='' method='POST'>
Логин: <input type='text' name='name' maxlength='127' value=''><br>
Пароль: <input type='password' name='pass1' maxlength='127' value=''><br>
Повторите пароль: <input type='password' name='pass2' maxlength='127' value=''><br>
<input type='Submit' name='breg' value='Регнуться'>
</form>
<?php
  }

?>

Автор: Mal Hack 25.11.2005, 21:12
Цитата(Well @ 24.11.2005, 23:49)
а мне он выдает такой http://++++++++/index.php?mod=mod90fields и соответственно загружаеться другая страница что енто может быть и как от этого избавиться

Вот этого быть не может точно. Где-то что-то ты поменял, причем очень сильно.
ЗЫ: А зачем было переделывать коды ошибок?

А, ну дык правильно. У тебя идет редирект вот тут:
Код

redirect( "fields" );

Что делает редирект?
Код

header( "Location: index.php?mod=mod90" . $par );

ВОт и получается, что он тебя редиректит на mod90fields

Автор: Well 25.11.2005, 23:34
для ЧЕГО Я ПЕРЕДЕЛАЛ КОД ОШИБКИ ДЛЯ того что бы когда кто то из "левых" пытаеться полазить !!! записывались его все "фичи"!!
Добавлено @ 23:42
Mal Hack у меня к те вопрос! скорее всего глупый вопрос!
Ну вот скрипт работает! а как теперь сделать что бы модули не выводились пока не зарегистрируешься!!!!
под модулями я имею ввиду "mod90","mod1","mod2" ну и так далее!
какоцйй код нужно написать чтобы он проверял авторизован ли пользователь или нет!!! Мне бы хотя бы принцып !!
Всего ентого! smile

Автор: Mal Hack 25.11.2005, 23:49
Цитата(Well @ 25.11.2005, 23:34)
для ЧЕГО Я ПЕРЕДЕЛАЛ КОД ОШИБКИ ДЛЯ того что бы когда кто то из "левых" пытаеться полазить !!! записывались его все "фичи"!!

смысла нет.

Автор: Well 25.11.2005, 23:51
я туда другие страницы повесил!!!!

Автор: korisarimi 16.10.2006, 11:57
Прочитал весь топ и так не нашел ответа на то как исправить все таки ошибки:

Цитата

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in z:\home\test1.ru\www\qwe.php on line 133

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in z:\home\test1.ru\www\qwe.php on line 107

Warning: Cannot modify header information - headers already sent by (output started at z:\home\test1.ru\www\qwe.php:2) in z:\home\test1.ru\www\qwe.php on line 35


И я не пойму, как сделать работоспособной функцию header(), если уже определены параметры заголовков?

Mal Hack, убедительная просьба переделай свой скрипт в факе, дабы новичкам вроде меня было не та трудно.

Автор: SFY 3.8.2007, 15:21
korisarimi
+1

Точно те же ошибки.
Скрипт нерабочий.

Автор: Severyanin 7.8.2007, 13:15
А каким образом можно определить время жизни сессии?

Автор: MoLeX 7.8.2007, 13:38
session.gc_maxlifetime=1440 -  Промежуток времени (в секундах), по истечении которого данные сеанса считаются недействительными и уничтожаются. Отсчет начинается с момента последнего обращения пользователя в текущем сеансе (ц)
 

Автор: Severyanin 8.8.2007, 06:39
Mal Hack, ссылку кидали не мне, но меня очень выручили smile . Спасибо

Автор: Mal Hack 8.8.2007, 12:49
SFY
korisarimi, а слабо самим вывести mysql_error() и исправить  ошибку?

Автор: Fally 9.8.2007, 16:01
SFY
korisarimi, найдите такую строку:

Код

$result = mysql_query( "SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_POST['name'] ) . "' AND `password` = '" . md5( $_POST['pass'] ."'" );

и удалите вокруг символа * обратные кавычки (те, что располагаются на клавише "Ё"), возможно не только в этом примере.. это первое что я увидел... т.е. результат исправления у вас будет такой:
Код

$result = mysql_query( "SELECT * FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_POST['name'] ) . "' AND `password` = '" . md5( $_POST['pass']."'" );

Не вздумайте убрать обратные кавычки у имени таблицы и имён полей... в принципе плохо не будет, но если вдруг у вас какое-либо поле или таблица имеют имя идентичное одному из ключевых слов языка SQL то будет плохо ;)
Вот это:
Код

Warning: Cannot modify header information - headers already sent by (output started at z:\home\test1.ru\www\qwe.php:2) in z:\home\test1.ru\www\qwe.php on line 35

Выводиться если вы пытаетесь стартовать сессию, поставить куки, послать хедер уже после того, как что-то вывели, в принципе это может быть какой-нибудь E_NOTICE из-за неопределённой переменной, т.ч. ищите.
а вообще очень рекомендую вам ребят сходить http://phpfaq.ru/ и всё прочесть во всём разобраться, т.к. там написано много очень главного для новичков.


И ещё.. самое гнлавное.. если пишет supplied argument for mysql_num_rows (а также mysql_fetch_* или mysql_num_*), то берите, и выводите запрос на экран, т.е. как в предыдущем случае вот так:
Код

print("SELECT `*` FROM `auth_members` WHERE `name` = '" . mysql_escape_string( $_POST['name'] ) . "' AND `password` = '" . md5( $_POST['pass'] ."'" );

Ищите возможную ошибку, если не нашли, то открываете phpMyAdmin (к примеру) и выполняете через него данный запрос.. смотрите, что он вам пишет. Или же как сказал Mal Hack есть функция http://php.net/mysql_error

Автор: reich 9.8.2007, 22:17
http://forum.vingrad.ru/index.php?showtopic=111971&view=findpost&p=1216476

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)