[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Потестируйте пожалуйста форму авторизации
CaypoH
Исходный код:
index.php
Свернутый текст
<? session_start(); ?>
<html>

<head>
<meta
http-equiv="Content-Language" content="ru">
<meta
http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta
http-equiv="pragma" content="no-cache">
<meta
http-equiv="Cache-Control" СONTENT="must-revalidate">
<meta
name="Robots" content="noindex">
<title>
Регистрация</title>
<link
href="style.css" rel="stylesheet" type="text/css">
</head>

<body>

<table
border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td
width="30%"> </td>
<td>
 </td>
<td
width="30%"> </td>
</tr>
<tr>
<td
width="30%"> </td>
<td
align="center">
<form
method="POST" action="/">
Псевдоним:<br>
<input
name="login" type="text" size="20">
<br>

Имя:<br>
<input
name="first_name" type="text" size="20"><br>
Фамилия:<br>
<input
name="last_name" type="text" size="20">
<br>

Пароль:<br>
<input
type="password" name="passw" size="20"><br>
Подтверждение:<br>
<input
type="password" name="passw0" size="20"><br><br>
<img
src="captcha.php?<? print session_name()?>=<? print session_id()?>" border="1"><br>
Проверочный код:<br>
<input
name="check_code" type="text" size="6"><br>
<input
type="submit" value="Отправить" name="go"><br>
<?
include "auth.php"; ?>
</form>
</td>
<td
width="30%"> </td>
</tr>
</table>
</body>

</html>

auth.php (updated)
Свернутый текст
<?
$dbhost = "localhost";
$dbname = "forum";
$dbuser = "root";
$dbpassword = "pfhfpf";
$connect = @mysql_connect($dbhost,$dbuser,$dbpassword) or die ("Невозможно подключиться к базе данных.");
mysql_select_db($dbname) or die("Невозможно подключиться к таблице базы данных.");
$login = !empty($_POST['login'])?$_POST['login']:NULL;
$passw = !empty($_POST['passw'])?$_POST['passw']:NULL;
$passw0 = !empty($_POST['passw0'])?$_POST['passw0']:NULL;
$first_name = !empty($_POST['first_name'])?$_POST['first_name']:NULL;
$last_name = !empty($_POST['last_name'])?$_POST['last_name']:NULL;
$check_code = !empty($_POST['check_code'])?$_POST['check_code']:NULL;
$go = isset($_POST['go'])?true:false;
$error = array();
if($go)
{
if($passw==$passw0) $password = md5($passw.$login);
else $error[] = "Неверно введен повторый пароль.";
if(!$login) $error[] = "Поле псевдонима пустое.";
if(!$passw) $error[] = "Пароль не может быть пустым.";
if(preg_match("/[^a-z0-9а-я_]/i", $login)) $error[] = "Псевдоним может состоять только из букв, цифр и символа _";
if(preg_match("/[^а-я]/i", $first_name) || preg_match("/[^а-я]/i", $last_name)) $error[] = "Имя и фамилия должны быть набраны кирилицей (русскими буквами).";
if(!preg_match("/[а, е, и, о, у, ы, э, ю, я]/i", $first_name) || !preg_match("/[а, е, и, о, у, ы, э, ю, я]/i", $last_name)) $error[] = "Имя и Фамилия должны содержать хотябы одну согласную букву. Введенные вами данные не несут смысловой нагрузки.";
if(strlen($first_name) < 2 || strlen($last_name) < 2) $error[] = "Не существует таких коротких имен.";
if(strlen($login) < 4 || strlen($login) > 16) $error[] = "Псевдоним должен быть длинной от 4 до 16 знаков.";
if(strlen($passw) < 6) $error[] = "Длина пароля не должна быть меньше 6 символов.";
$sql = mysql_query("SELECT COUNT(*) AS `cnt` FROM `test` WHERE `login` = '".mysql_real_escape_string($login)."'");
if(mysql_result($sql,0) > 0) $error[] = "Пользователь с таким псевдонимом уже зарегестрирован. Выберите другой.";
if($_SESSION['uid'] !== $check_code) $error[] = "Неверно введен проверочный код.";
session_destroy();
if(count($error)) for($i=0; $i<sizeof($error); $i++) print "$error[$i]<br><br>";
else
{
mysql_query("INSERT INTO `test` VALUES ('', '".mysql_real_escape_string($login)."', '".mysql_real_escape_string($password)."', '".mysql_real_escape_string($first_name)."', '".mysql_real_escape_string($last_name)."')");
print "Поздравляем с регистрацией";
}
}

?>

и captcha.php (updated)
Свернутый текст
<?
session_start();
$symbols_array = array(
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' ,'i', 'j',
'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u',
'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5',
'6', '7', '8', '9'
);
$fonts = array(
'fonts/AlfredDrake.ttf',
'fonts/Dannette.ttf',
'fonts/Mlsjn.ttf',
'fonts/comic.ttf',
'fonts/Arhaic_rom.ttf'
);

for($i=0; $i<rand(4,5); $i++)
{
shuffle($symbols_array); // добавил перемешку символов в массиве
$get_symbol = $symbols_array[rand(0,sizeof($symbols_array)-1)];
$check_code .= $get_symbol;
}
$_SESSION['uid'] = $check_code;
$image = imagecreatetruecolor(140, 60);
$background_color = imagecolorallocate($image, rand(235,245), rand(230,240), rand(225,235)); // чуть изменил бэкграунд капчи
imagefill($image, 0, 0, $background_color);
for($i=0; $i<rand(20,25); $i++)
{
imagefilledellipse($image, rand(0,150), rand(0,50), rand(5,10), rand(5,10), imagecolorallocate($image, rand(0,255), rand(0,255), rand(0,255)));
}
imagettftext($image, rand(20,30), rand(-15,15), rand(5,15), rand(40,45), imagecolorallocate($image, rand(0,150), rand(0,150), rand(0,150)), $fonts[rand(0, sizeof($fonts)-1)], $_SESSION['uid']);
header("Content-Type: image/png");
imagepng($image);
imagedestroy($image);
?>


Расположено по адресу: http://www.meill.tu2.ru/
Протестируйте пожалуйста. Пхп я изучаю от силы неделю. Хочется на живом примере посмотреть что можно сделать лучше, чем сделано у меня, где ошибки допущены ну и прочее.
Всем протестировавшим заранее спасибо.



Спустя 10 минут, 55 секунд (12.11.2009 - 14:40) Gabriel написал(а):
этож зачем столько данных для афторизации?

Спустя 26 минут, 51 секунда (12.11.2009 - 15:07) stepan написал(а):
Цитата
Псевдоним может состоять только из букв, цифр и символа

Это не правильно т.к. ущемляет права. Ведь я например хотел себе псевдоним который состоит из разных символов, а это надо как то организовывать, а то получится как говорил twin - убираем описные символы (которых по сути нет) и у нас получается неграмотный Русский язык без знаков препинания, кавычек, скобок, т.е. голые буквы и цифры. dry.gif

Спустя 31 минута, 39 секунд (12.11.2009 - 15:39) twin написал(а):
Для недели изучения php весьма недурно...
Ошибок очень много. Почитай это, потом что не ясно будет - спросишь.

Спустя 3 часа, 20 минут, 30 секунд (12.11.2009 - 18:59) CaypoH написал(а):
Цитата
Это не правильно т.к. ущемляет права. Ведь я например хотел себе псевдоним который состоит из разных символов

ну тут могу провести аналогию smile.gif я хочу курить в общественном месте. запрет на это ущемляет мои права, потому что мне приятно курить.
однако во всём цивилизованном мире то правило перестаёт действовать, если такое действие ущемляет права других людей. в данном случае - среди окружающих могут быть некурящие, которым табачный дым неприятен.
так же и тут - мне, например, неприятно и неудобно читать ники типа B0B@-TP@|{T0P|/|CT. и думаю я такой не один. вот для того чтобы удобно было большинству, приходится "страдать" единицам. однако это не те страдания которые могут ущемить или прищемить что-либо. я за удобочитаемые ники wink.gif

twin
почитал. интересная статья. вопросы есть. пойду по порядку:
[*] в статье рекомендуется инициализировать переменные вот таким способом:
$user_login = !empty($_POST['user_login'])?$_POST['user_login']:NULL; 

а почему именно так? чем так лучше, и что означают "?" и ":NULL" (не просто ноль, а двоеточие ноль).
[*] не понял с хешем для автологина. мы его вписываем только при авторизации? т.е. если человек очистил кеш в браузере, то у него должно всё сброситься. но строчка в базе данных то не сбросится, это ж не браузер. при следующем входе она переназначится?

пока 2 вопроса. внимательно прочитал, на самом деле, только первые несколько страниц. потом, в процессе набора текста на форуме в районе выключили свет. на целых 2 часа. я кстати за это время осознал как беспомощно современное общество без электричества. ну а сейчас у меня уже 11 вечера, пора на боковую)
кстати, регистрацию то так никто и не прошёл)

Спустя 51 минута, 13 секунд (12.11.2009 - 19:51) twin написал(а):
Цитата
кстати, регистрацию то так никто и не прошёл)

а смысл? по коду же видно, что криво. Почитай, разберись, поправь что сможешь сам и тогда посмотрим.
А по вопросам. По первому - это тернарный оператор. Короткая и удобная запись для инициализации (присвоения начального значения или объявления) переменной. То же самое что и
if(!empty($_POST['login']))
$login = $_POST['login'];
else
$login = NULL;

Дело в том что пустая переменная и несуществующая переменная - разные вещи. И коли мы позже к ней обращаемся, она должна существовать. Пусть даже с пустотой внутри. NULL это предопределенная (встроенная) константа, обозначающая пустоту.

Про кэш и хэш не понял я вопроса если чесно.

Спустя 15 часов, 11 минут, 49 секунд (13.11.2009 - 11:02) CaypoH написал(а):
Цитата
Про кэш и хэш не понял я вопроса если чесно.

я там запрос update не заметил просто )

переделал исходя из прочитанного. Новый код в первом сообщении.

вопрос: какой вид вычисления имеющегося в базе логина работает быстрее.
этот
while ($login_compare = mysql_fetch_array($sql))
{
if($login_compare['login']==$login)
{
error[] = "Пользователь с таким псевдонимом уже зарегистрирован. Выберите другой.";
break;
}
}

или этот:
$sql = mysql_query("SELECT COUNT(*) AS `cnt` FROM `test` WHERE `login` = '".mysql_real_escape_string($login)."'");
if(mysql_result($sql,0) > 0) $error[] = "Пользователь с таким псевдонимом уже зарегестрирован. Выберите другой.";

читаю паралелльно одну книжку, так вот там говорится что желательно как можно больше такой работы отдавать базе данных, и как можно меньше вычислять скриптами в пхп. Однако не поясняют почему. А мне вот очень хочется узнать, какая разница в быстродействии между этими двумя вариантами. Что если в первом варианте логин находится на самом верху и цикл прекращается всего через пару итераций? Как сильно влияет увеличение кол-ва логинов в базе на скорость работы обоих вариантов?
Да, кстати, зачем в вашем запросе SELECT COUNT(*) AS `cnt`FROM ведь можно просто SELECT * FROM

Спустя 13 минут, 22 секунды (13.11.2009 - 11:16) twin написал(а):
Цитата
Да, кстати, зачем в вашем запросе SELECT COUNT(*) AS `cnt`FROM ведь можно просто SELECT * FROM

Нельзя. Надо уяснить просто раз и на всегда, что php и mysql - это два разных сервера. Это так же как браузер и сервер. PHP делает запрос, получает данные и обрабатывает их. По твоей схеме будет передаваться полностью вся таблица, это трафик и скорость. Это сожрет память скрипта. В моем случае передается всего одно число - а именно количество строк.
Конечно лучше максимально нагружать мускул, это программа на Си, по этому быстрее и экономичнее.

Спустя 5 часов, 26 минут, 55 секунд (13.11.2009 - 16:43) CaypoH написал(а):
а как сам код? лучше?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.