Сразу оговорюсь скрипт носит демонстрационный характер я не несу никакой ответственности за то что он делает... (это на тот случай если кто захочет вдруг заюзать его на своём сайте) В принципе он может быть очень полезен новичкам для изучения механизмов авторизации, по этому я решил выложить его тут... PHP: <?php /* С уважением Vladson. [url=http://dkflbk.nm.ru/]http://dkflbk.nm.ru/[/url] E-Mail:dkflbk@nm.ru */ // URL скрипта $url = 'http://localhost/test/cookie.php'; // Время жизни кукиша $duration = 1200; // Список пользователей и паролей $members = array( 'Vladson'=>'123456' ); if ( isset($_POST['login']) && isset($_POST['username']) && isset($_POST['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_POST['username']) : $_POST['username']; $password = get_magic_quotes_gpc() ? stripslashes($_POST['password']) : $_POST['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { setcookie('username', $username, time()+$duration); setcookie('password', $password, time()+$duration); } header('Location: ' . $url); exit; } elseif ( isset($_POST['logout']) ) { setcookie('username'); setcookie('password'); header('Location: ' . $url); exit; } $registred_user = false; if ( isset($_COOKIE['username']) && isset($_COOKIE['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_COOKIE['username']) : $_COOKIE['username']; $password = get_magic_quotes_gpc() ? stripslashes($_COOKIE['password']) : $_COOKIE['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $registred_user = $username; } } ?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <!-- С уважением Vladson. [url=http://dkflbk.nm.ru/]http://dkflbk.nm.ru/[/url] E-Mail:dkflbk@nm.ru --> <html> <head> <title>test</title> <meta http-equiv="content-type" content="text/html; charset=windows-1251"> </head> <body> <form action="<?=$url?>" method="post"> <p> <?if(!$registred_user):?> Username: <br> <input type="text" name="username" value="Vladson"> <br> Password: <br> <input type="password" name="password" value="123456"> <br> <input type="hidden" name="login" value="true"> <input type="submit" value="Login"> <?endif?> <?if($registred_user):?> <input type="hidden" name="logout" value="true"> <input type="submit" value="Logout"> <?endif?> </p> </form> </body> </html> Специально для всех, выкладываю скрипт который работает так-же но с Сессиями. PHP: <?php /* С уважением Vladson. [url=http://dkflbk.nm.ru/]http://dkflbk.nm.ru/[/url] E-Mail:dkflbk@nm.ru */ // URL скрипта $url = 'http://localhost/test/session.php'; // Время жизни кукиша $duration = 1200; // Список пользователей и паролей $members = array( 'Vladson'=>'123456' ); session_start(); if ( isset($_POST['login']) && isset($_POST['username']) && isset($_POST['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_POST['username']) : $_POST['username']; $password = get_magic_quotes_gpc() ? stripslashes($_POST['password']) : $_POST['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $_SESSION['username'] = $username; $_SESSION['password'] = $password; } header('Location: ' . $url); exit; } elseif ( isset($_POST['logout']) ) { unset($_SESSION['username']); unset($_SESSION['password']); header('Location: ' . $url); exit; } $registred_user = false; if ( isset($_SESSION['username']) && isset($_SESSION['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_SESSION['username']) : $_SESSION['username']; $password = get_magic_quotes_gpc() ? stripslashes($_SESSION['password']) : $_SESSION['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $registred_user = $username; } } ?><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <!-- С уважением Vladson. [url=http://dkflbk.nm.ru/]http://dkflbk.nm.ru/[/url] E-Mail:dkflbk@nm.ru --> <html> <head> <title>test</title> <meta http-equiv="content-type" content="text/html; charset=windows-1251"> </head> <body> <form action="<?=$url?>" method="post"> <p> <?if(!$registred_user):?> Username: <br> <input type="text" name="username" value="Vladson"> <br> Password: <br> <input type="password" name="password" value="123456"> <br> <input type="hidden" name="login" value="true"> <input type="submit" value="Login"> <?endif?> <?if($registred_user):?> <input type="hidden" name="logout" value="true"> <input type="submit" value="Logout"> <?endif?> </p> </form> </body> </html>
Вопрос по поводу код на первой странице: вариант с сессиями. Как сделать, чтобы сессия закрывалась при закрытии браузера. После начала сессии заходим Vladson'ом, после чего не разлогиниваясь закрываем браузер. После чего открываем его снова и вводим адрес. При входе на страницу мы все равно под именем вышеупомянутого. Пробовал писать в коде: session_set_cookie_params('0'); ini_set(session.cookie_lifetime, 0); Не помогло.
Vladson попробовала просто сменить статического пользователя на пользователя из БД: PHP: <? ... $database = mysql_connect ("$host","$user","$pass"); mysql_select_db("$database",$db); $list = mysql_query ("SELECT user,pass FROM users_data",$database); $myrow = mysql_fetch_array($list); $user = $myrow['user']; $pass = $myrow['pass']; $members = array('$user'=>'$pass'); ... ?> по идее там все пользователи которые в базе, или нет?
По идее (смотрю не в код а в принцип его работы) это должно работать (и при малом количестве юзеров будет работать отлично) Но всё-же лучше изменить сам подход, не брать все результаты из базы и сравнивать их, а просто проверять есть ли в базе такая запись (как это делается почти во всех готовых движках)
Переменные в строках с одинарными кавычками просто текст. Код (Text): $members = array("$user" => "$pass"); или, что правильно и адекватно: Код (Text): $members = array($user => $pass);
Vladson ты хорошо подметил , но даже с одним пользователем не работает lexa а разве там не текст должен быть с именем и паролем?
Sofia В случае, если переменная внутри одинарных кавычек, то, так сказать, ее значение не подставится. То есть в итоге получится массив вроде: Код (Text): Array { '$user' => '$pass', '$user' => '$pass', '$user' => '$pass' } , а не, как ожидалось: Код (Text): Array { 'decoder' => '123', 'Sofia' => '456', 'lexa' => '789' }
decoder дело в том, что не работает никак? у меня как раз пароли без кодировки md5, (Пример MySQL): [sql]-- -- Структура таблицы `users_data` -- CREATE TABLE `users_data` ( `id` int(11) NOT NULL auto_increment, `user` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ; -- -- Дамп данных таблицы `users_data` -- INSERT INTO `users_data` VALUES (1, 'Sofia', '198603'); [/sql] использую двойные ковычки, и всеравно не работает.
ну хотя б так-то должно: PHP: <?php $name = isset($_GET['name']) ? $_GET['name'] : ''; // Просто для тестирования/примера... $sql ="SELECT user, password FROM users_data"; $result = mysql_query($sql) or die($sql . ': ' . mysql_error()); // Покажет ошибку, если есть такая while ($row = mysql_fetch_assoc($result)) { $members[$row['user']] = $row['password']; } if (array_key_exists($name, $members)) { echo 'TRUE'; } else { echo 'FALSE'; } ?> З.Ы. Для начала можешь взглянуть на содержимое своего массива $members с помощью print_r($members);
decoder работает. я вот так сделала для эксперимента: PHP: <?php session_start(); include ("db_.php"); $name = isset($_GET['name']) ? $_GET['name'] : ''; // Просто для тестирования/примера... $sql ="SELECT user,password FROM users_data"; $result = mysql_query($sql) or die($sql . ': ' . mysql_error()); // Покажет ошибку, если есть такая while ($row = mysql_fetch_assoc($result)) { $members[$row['user']] = $row['password']; } if (in_array($name, $members)) { echo 'TRUE'; } else { /* Использую метод Vladson ([url=http://php.ru/forum]http://php.ru/forum[/url]) */ if ( isset($_POST['login']) && isset($_POST['username']) && isset($_POST['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_POST['username']) : $_POST['username']; $password = get_magic_quotes_gpc() ? stripslashes($_POST['password']) : $_POST['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $_SESSION['username'] = $username; $_SESSION['password'] = $password; } header('Location: ' . $url); exit; } elseif ( isset($_POST['logout']) ) { unset($_SESSION['username']); unset($_SESSION['password']); header('Location: ' . $url); exit; } $registred_user = false; if ( isset($_SESSION['username']) && isset($_SESSION['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_SESSION['username']) : $_SESSION['username']; $password = get_magic_quotes_gpc() ? stripslashes($_SESSION['password']) : $_SESSION['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $registred_user = $username; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <!-- С уважением Vladson. [url=http://dkflbk.nm.ru/]http://dkflbk.nm.ru/[/url] E-Mail:dkflbk@nm.ru --> <html> <head> <title>test</title> <meta http-equiv="content-type" content="text/html; charset=windows-1251"> </head> <body> <form action="<?=$url?>" method="post"> <p> <?if(!$registred_user):?> Username: <br> <input type="text" name="username" value="ФИО"> <br> Password: <br> <input type="password" name="password" value=""> <br> <input type="hidden" name="login" value="true"> <input type="submit" value="Login"> <?endif?> <?if($registred_user):?> <input type="hidden" name="logout" value="true"> <input type="submit" value="Logout"> <?endif?> </p> </form> </body> </html> <?php echo 'авторизация'; }?>
Да, прошу прощения, там у меня должно быть тоже не in_array(), a array_key_exists... Сейчас поправлю...
decoder я вобщем вот так вот сделала: PHP: <? if($_SESSION['username']) { echo "Hello "; echo ($_SESSION['username']); ?> <form action="<?=$url?>" method="post"> <input type="hidden" name="logout" value="true"> <input type="submit" value="Logout"> </form> <? } else { echo "Необходима авторизация"; ?> <form action="<?=$url?>" method="post"> Username: <br> <input type="text" name="username" value="Vladson"> <br> Password: <br> <input type="password" name="password" value="123456"> <br> <input type="hidden" name="login" value="true"> <input type="submit" value="Login"> </form> <? } ?> для меня так привычнее. Я вот только не совсем правильно понимаю как работают сессии, но ... они же куда-то записываются?
а, это выше кусочек кода всего. PHP: session_start(); конечно в самом верху сразу после <? Кстати, эксперименты провожу на своем домашнем комптютере, если интересно, то вот его адрес http://78.36.101.203
незнаю уже как и быть, не могу разобраться. Вот мой полный код: PHP: <?php session_start(); $host="localhost"; $user="*"; $pass="*"; $database="*"; $url = 'http://*/test.php'; $db = mysql_connect ("$host","$user","$pass"); mysql_select_db("$database",$db); $name = isset($_GET['name']) ? $_GET['name'] : ''; // Просто для тестирования/примера... $sql ="SELECT login,pass FROM users"; $result = mysql_query($sql) or die($sql . ': ' . mysql_error()); // Покажет ошибку, если есть такая while ($row = mysql_fetch_assoc($result)) { $members[$row['login']] = $row['pass']; } if (in_array($name, $members)) { echo 'TRUE'; } else { /* Использую метод Vladson ([url=http://php.ru/forum]http://php.ru/forum[/url]) */ if ( isset($_POST['login']) && isset($_POST['username']) && isset($_POST['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_POST['username']) : $_POST['username']; $password = get_magic_quotes_gpc() ? stripslashes($_POST['password']) : $_POST['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $_SESSION['username'] = $username; $_SESSION['password'] = $password; } header('Location: ' . $url); exit; } elseif ( isset($_POST['logout']) ) { unset($_SESSION['username']); unset($_SESSION['password']); header('Location: ' . $url); exit; } $registred_user = false; if ( isset($_SESSION['username']) && isset($_SESSION['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_SESSION['username']) : $_SESSION['username']; $password = get_magic_quotes_gpc() ? stripslashes($_SESSION['password']) : $_SESSION['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $registred_user = $username; } } } if($_SESSION['username']) { echo "Hello "; echo ($_SESSION['username']); ?> <form action="<?=$url?>" method="post"> <input type="hidden" name="logout" value="true"> <input type="submit" value="Logout"> </form> <? mysql_query("SET NAMES cp1251"); $result2 = mysql_query("SELECT * FROM users",$db); $row2 = mysql_fetch_array($result2); $f=$row2["f"]; $i=$row2["i"]; $o=$row2["o"]; echo "ФИО : $f $i $o"; } else { echo "Необходима авторизация"; ?> <form action="<?=$url?>" method="post"> Username: <br> <input type="text" name="username" value="Vladson"> <br> Password: <br> <input type="password" name="password" value="123456"> <br> <input type="hidden" name="login" value="true"> <input type="submit" value="Login"> </form> <? } ?> задача следующуя: чтоб писал ФИО того, кому принадлежит аккаунт. а этого я добиться не могу.. подскажите пожалуйста, как тут работать по сессиям? как сделать чтоб писался ФИО того, кому принадлежит аккаунт?
440Hz я наоборот собрала в один файл то, что было раскидано на кучу мелких. Помойму вполне читабельно.. или Вы знаете другой php?
знаю. PHP: <?php session_start(); $host="localhost"; $user="*"; $pass="*"; $database="*"; $url = 'http://*/test.php'; $db = mysql_connect ("$host","$user","$pass") or die("Can't connect!"); mysql_select_db("$database",$db) or die("Can't select DB!"); $name = isset($_GET['name']) ? $_GET['name'] : ''; // Просто для тестирования/примера... $sql ="SELECT login,pass FROM users"; $result = mysql_query($sql) or die($sql . ': ' . mysql_error()); // Покажет ошибку, если есть такая while ($row = mysql_fetch_assoc($result)) { $members[$row['login']] = $row['pass']; } if (in_array($name, $members)) { echo 'TRUE'; } else { /* Использую метод Vladson ([url=http://php.ru/forum]http://php.ru/forum[/url]) */ if ( isset($_POST['login']) && isset($_POST['username']) && isset($_POST['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_POST['username']) : $_POST['username']; $password = get_magic_quotes_gpc() ? stripslashes($_POST['password']) : $_POST['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $_SESSION['username'] = $username; $_SESSION['password'] = $password; } header('Location: ' . $url); exit; } elseif ( isset($_POST['logout']) ) { unset($_SESSION['username']); unset($_SESSION['password']); header('Location: ' . $url); exit; } $registred_user = false; if ( isset($_SESSION['username']) && isset($_SESSION['password']) ) { $username = get_magic_quotes_gpc() ? stripslashes($_SESSION['username']) : $_SESSION['username']; $password = get_magic_quotes_gpc() ? stripslashes($_SESSION['password']) : $_SESSION['password']; if ( array_key_exists($username, $members) && $members[$username] === $password ) { $registred_user = $username; } } } if($_SESSION['username']) { mysql_query("SET NAMES cp1251"); $result2 = mysql_query("SELECT * FROM users",$db); $row2 = mysql_fetch_array($result2); $f=$row2["f"]; $i=$row2["i"]; $o=$row2["o"]; $HTML = <<< ENDHTML Hello: $_SESSION['username'] <form action="$url" method="post"> <input type="hidden" name="logout" value="true"> <input type="submit" value="Logout"> </form> ФИО : $f $i $o ENDHTML; } else { $HTML = <<< ENDHTML Необходима авторизация <form action="$url" method="post"> Username: <br> <input type="text" name="username" value="Vladson"> <br> Password: <br> <input type="password" name="password" value="123456"> <br> <input type="hidden" name="login" value="true"> <input type="submit" value="Login"> </form> ENDHTML; } print $HTML; ?>
чтобы я добавил: 1. обработка получаемых данных (GET/POST/COOKIE) через класс, где завернута обработка magic_quotes() 2. получение данных из БД тоже в класс с обработкой ошибок. 3. сессию - тоже сделал бы надстройку. тогда кода было бы раз в 5 меньше, а валить все в кучу - иметь геморой. изначально! надо учиться лдаже на маленьких задачах сразу правильно подходить к написанию.
так код Ваш не рабочий я думаю что может лучше выборку по сессии сделать? PHP: $result2 = mysql_query("SELECT * FROM users WHERE login = '$username'",$db); тогда все работает. Конечно Ваш код интересный, но... доводить до ума надо еще... спасибо...