Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Простой логин с помощью ajax и mysql


Автор: gta4kv 26.11.2007, 17:18
Данная статья(если это можно так назвать) посвещается созданию просто системы логинации при помощи
PHP, MySQL, Ajax.

Думаю подробнее тут не скажешь, начнем сразу с кода. smile

Нам понадобится jsHttpRequest(js и пхп файл ( приложил их в аттаче ) ) библиотека от Котерева и прямые руки.
Создадим папку "login" на сервере.

Итак для начала создаем нашу форму с логином,

Код

<!-- index.html -->
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<title>template{page_title}</title>
<script type="text/javascript" src="js/JsHttpRequest.js"></script> <!-- ПУТЬ к jshttprequest библиотеке -->
<script type="text/javascript" src="js/siteFunctional.js"></script> <!-- ПУТЬ к нашим функциям -->
</head>
<body>


<div id="header">
    <div id="logo">
        <h1><a href="#">Создания логинации ajax mysql</a></h1>
        </div>
    <div id="menu">
        <ul>
        </ul>
    </div>
    </a>
</div>

<div id="page">

    <div id="sidebar">
        <ul>
            <li id="login">
                <fieldset>
                        <label>Логин:</label>
                            <input type="text" name="login" id="log" />
                        <br />
                        <label>Пароль:</label>
                            <input type="password" name="pass" id="ps"  />
                        <br /> <br />
                        <input type="submit" value="Войти" onclick="doLogin('log', 'ps');" /> <br />
                    </fieldset>
            </li>
        </ul>
    </div>
    
    <div id="content">
        Пусто тут :)
    </div>

<div id="footer"> 
    <p class="legal" id="copyright" onmouseover="this.innerHTML = 'All Rights fucked.';" onmouseout="this.innerHTML = 'All Rights Reserved &copy; 2007';" >
        All Rights Reserved &copy; 2007
    </p>
</div>

</body>
</html>

<!-- end of index.html -->

Это обычная форма, в которой по нажатию кнопки "Войти" происходит функция doLogin, в которою передаются имена;

Дальше сама функция doLogin ( из расчета того что jsHttpRequest.js находится в папка login/js/ )

Теперь файл который мы инклюдили в самом начале, siteFunctional.js
Код

 function doLogin(loginField,passField)
  {
     var login = document.getElementById(loginField);
     var password = document.getElementById(passField);
     document.getElementById("login").innerHTML = "[здесь вы можете вставить картинку загрузки] думаю...";
     JsHttpRequest.query(
      'ajaxpage.php', 
      {
       'user_l': login.value,
       'user_p': password.value
      },
      
     function(result, errors) {
       document.getElementById("login").innerHTML = errors;
        document.getElementById("login").innerHTML = result;
    }
    
    );
    
}

 function showloginfield()
 { 
    document.getElementById("login").innerHTML = "<fieldset> <label>Логин:</label> <input type='text' name='login' id='log' /> <br /> <label>Пароль:</label><input type='password' name='pass' id='ps'  /> <br /> <br /><input type='submit' value='Войти' onclick='doLogin(\"log\", \"ps\");' /> <br /></fieldset> ";
 }



doLogin() - обращается к ajaxpage.php и передает два значения, логин и пароль.
showloginfield()  - увидите позже.

Дальше сам ajaxpage.php:

Код

<?php
ob_start();
include("JsHttpRequest.php"); // указываем путь к файлу, сам файл в аттаче.
$JsHttpRequest =& new JsHttpRequest("windows-1251");
$login = $_POST['user_l'];
$password = $_POST['user_p'];
sleep(1);
mysql_connect('localhost','root', 'spoon');  // ПРАВЬТЕ НА СВОЁ!
mysql_select_db('simple_login');

if( $login == "" ) // Если логин пустой - значит возвращаем ошибку!
{
    $GLOBALS['_RESULT'] = ' <span style="color:red;"> Поле логин не может быть пустое. </span> ';
    $error = 1;  // ошибка = да
}

if( !preg_match('/[a-zA-Z0-9]/' , $login ) ) // Вы можете править регулярное выражение под себя, в данном случае в логине разрешаются только  англиские  буквы и цифры
{
    $GLOBALS['_RESULT']     = ' <span style="color:red;">В логине могут использоваться только латинские буквы, цифры, и некоторые символы. </span>';
    $error = 1; // ошибка = да
}

$login_tmp = mysql_real_escape_string( $login );  // escape'м строчку

if( $login != $login_tmp ) // В общем то эту проверку можно убрать, так, на всякий случай.
{
    $GLOBALS['_RESULT']     = ' <span style="color:red;">В логине использованы запрещенные символы. </span>';
    $error = 1; // ошибка = да
}

if( $error == 1 ){ // Если есть ошибка(и) добавляем ссылку "назад"
    $GLOBALS['_RESULT']     .= '<br /> <a href="#" onclick="showloginfield();">Назад</a>';
}

if( $error == 0 ) //  если есть ошибки - 
{

    $query = mysql_query(' select f.upassword from users f where f.ulogin = "'.$login.'"');
    
    if( mysql_num_rows( $query ) == 0) // Если результатов нет, значит и логина нет :)
    {
        $GLOBALS['_RESULT']     = ' <span style="color:red;"> Юзер с такими данными не найден. </span>';
        $GLOBALS['_RESULT']     .= '<br /> <a href="#" onclick="showloginfield();">Назад</a>';        
        return; // выход
    }
    
    $result = mysql_fetch_array( $query ); // получаем результат
    $password = md5( $password );  // переводим пароль в md5
    
    if( $password != $result['upasswa'] ) // если введенный пароль не равен паролю в базе, значит ошибка
    {
        $GLOBALS['_RESULT']     = ' <span style="color:red;"> Юзер с такими данными не найден. </span>';
        $GLOBALS['_RESULT']     .= '<br /> <a href="#" onclick="showloginfield();">Назад</a>';            
        return; // выход
    }
    
        // если же все хорошо ставим куки
    setcookie( 'loggined', '1', time()+50000 );
}
ob_end_flush();
?>


Во бщем то все постарался закомментировать, здесь как я и обещал используется js функция showloginfiled(), предназначена она для того что бы вернуть пользователю форму логинации без всяких перезагрузок и переходов на другую страницу. 

Теперь структура таблицы users:
Код

CREATE TABLE `zl_users` (
  `uid` int(11) NOT NULL auto_increment,
  `ulogin` text NOT NULL,
  `uname` varchar(32) NOT NULL,
  `uemail` varchar(60) NOT NULL,
  `upasswa` text NOT NULL,
  `uregdate` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `uactivate_code` text NOT NULL,
  `uacc_active` int(11) NOT NULL default '0',
  `ugroup` int(11) NOT NULL default '1',
  `upassresets` int(11) NOT NULL default '0',
  `avatar` text NOT NULL,
  `ureg_ip` varchar(16) NOT NULL,
  `uent_ip` varchar(16) NOT NULL,
  `utempl_selected` varchar(50) default 'default',
  `ulang_selected` varchar(20) default 'ru',
  `ugallerys_count` int(11) NOT NULL default '0',
  `uimages_count` int(11) NOT NULL default '0',
  PRIMARY KEY  (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;


Это мой вариант, как сделаете вы зависит только от количества вашей фантазии. Собственно все готово.

Профи если что не так - поправьте, а остальные задавайте вопросы. smile


© gta4kv

Автор: mikla 9.12.2007, 14:28
вопрос. как можно все это легко отлаживать ? мне приходилось писать все в лог

Автор: Feldmarschall 11.12.2007, 12:14
А какой смысл делать авторизацию средствами АЯКС, если всё равно зарегистрированный пользователь видит совсем не то, что незарегистрированный? То есть, страницу целиком менять надо будет, что равнозначно перезагрузке при обычной авторизации, без АЯКС.

Автор: Astraller 11.12.2007, 14:06
Feldmarschall, а немного развить мысль? smile 
Ведь есть же проекты основанные на Ajax. А так же бывают проекты у которых при логинизации меняется не многое smile

Автор: skyboy 11.12.2007, 14:12
Цитата(Feldmarschall @  11.12.2007,  11:14 Найти цитируемый пост)
всё равно зарегистрированный пользователь видит совсем не то, что незарегистрированный?

почему же? на этом вот форуме гость видит почти то же, что и зарегистрированный.
только некоторые функции недоступны.

Автор: Topclub 21.12.2007, 17:48
А почему после удачного входа отсутвует какое-то привествие, вывод имени пользователя? как это реализовать?

Автор: gta4kv 21.12.2007, 17:51
После setcookie :

Код

 $GLOBALS['_RESULT'] = "Здесь выводите юзеру что хотите.";

Автор: NNaarreekk 10.2.2008, 16:32
Спасибо, давно ищу что-то подобное!

А ты не мог бы мне в личку написать тот же код но без всяких проверок, a то с Ajax-ом еще не знаком трудно разобратся smile 

Автор: boogi 11.6.2008, 13:32
"Ваш" код ужасен! Да и вообще все "произведения" Котерова должны быть в /dev/null. А их модификации вообще не существовать.

Автор: Nikitozz 23.6.2008, 23:58
Цитата

"Ваш" код ужасен! Да и вообще все "произведения" Котерова должны быть в /dev/null. А их модификации вообще не существовать. 


Так эту статью "Умник" написал ?  smile  smile  smile 

Пора переписывать книги...

Автор: gta4kv 24.6.2008, 10:17
Nikitozz, нет статья моя.

Цитата

"Ваш" код ужасен

это он мне мстил

От Котерова здесь тока библиотека jsHTTPRequest

Автор: IIaBeJI 10.7.2008, 08:20
Ребят ещё подскажите пожалуйста как сделать вывод: "Добро пожаловать на сайт имя(по логину)"

Автор: vitnet 12.11.2012, 01:10
У меня почему то не работает, дальше "Юзер с такими данными не найден. Назад" не проходит  smile 

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