помогите с скриптом регистрации

ioncore

Новичок
PHP:
<?php
$stopwatch = microtime(true);
session_start();
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
    $error = array();
    include_once ("secure.inc.php");

    if (($randStr = ekran_var($_POST["str"], 6)) == "")
    {
        $error[] = 'Не заполнено поле ввода строки символов !';
    } elseif ($randStr != $_SESSION["randStr"])
    {
        $error[] = "Неправильная строка с картинки";
    } else
    {

        if (!($base = mysqli_connect('localhost', 'root', '', 'base')))
        {
            $error[] = "Невозможно подключиться к базе данных";
        } elseif (mysqli_character_set_name($base) == 'cp1251')
        {
            mysqli_set_charset($base, "utf8");
        }


        if (($rlogin = ekran_var($_POST["login"], 45)) == "")
        {
            $error[] = 'Не заполнено поле : LOGIN !';
        } elseif (strlen($rlogin) <= 3)
        {
            $error[] = 'В поле : LOGIN  - длжно быть не меньше 4 символов!';
        } elseif (!($result = mysqli_query($base,
        "SELECT login FROM activation WHERE login='" . ekran_SQL($base, $rlogin) . "'")))
        {
            $error[] = "Сбой запроса базы данных";
        } else
        {
           
            $arr = mysqli_fetch_array($result, MYSQLI_NUM);
            mysqli_free_result($result);
            if ($arr)
            {
                $error[] = "$rlogin : этот login ожидает активации";
                $arr = "";
            } elseif (!($result = mysqli_query($base11,
            "SELECT login FROM gamer WHERE login='" . ekran_SQL($base, $rlogin) . "'")))
            {
                $error[] = "Сбой запроса базы данных";
            } else
            {
                $arr = mysqli_fetch_array($result, MYSQLI_NUM);
                mysqli_free_result($result);
                if ($arr)
                {
                    $error[] = "$rlogin : этот login уже используется другим пользователем";
                    $arr = "";
                }
            }
           
        }


        if (($rpass = ekran_var($_POST["pass"], 45)) == "")
        {
            $error[] = 'Не заполнено поле : PASSWORD !';
        } elseif (strlen($rpass) < 6)
        {
            $error[] = 'В поле : PASSWORD - должно быть не меньше 6 символов!';
        }

        if (($rpassagain = ekran_var($_POST["passagain"], 45)) == "")
        {
            $error[] = 'Не заполнено поле повтора пароля!';
        } elseif ($rpass != $rpassagain)
        {
            $error[] = "Пароли не равны";
        }

        if (($rmail = ekran_var($_POST["mail"], 45)) == "")
        {
            $error[] = 'Не заполнено поле : EMAIL !';
        } elseif (!valid_mail($rmail))
        {
            $error[] = 'Некорректно заполнено поле : EMAIL ! Введите email формата RFC 2822 например: [email protected]';
        } elseif (!($result = mysqli_query($base,
        "SELECT mail FROM activation WHERE mail='" . ekran_SQL($base, $rmail) . "'")))
        {
            $error[] = "Сбой запроса базы данных";
        } else
        {
            //------------------------------------------
            $arr = mysqli_fetch_array($result, MYSQLI_NUM);
            mysqli_free_result($result);
            if ($arr)
            {
                $error[] = "$rmail : этот email ожидает активации";
                $arr = "";
            } elseif (!($result = mysqli_query($base, "SELECT mail FROM gamer WHERE mail='" .
            ekran_SQL($base, $rmail) . "'")))
            {
                $error[] = "Сбой запроса базы данных";
            } else
            {
                $arr = mysqli_fetch_array($result, MYSQLI_NUM);
                mysqli_free_result($result);
                if ($arr)
                {
                    $error[] = "$rmail : на этот email уже зарегистрирован аккаунт ";
                    $arr = "";
                }
            }
            //------------------------------------------
        }
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style>
body{
font-family: Verdana;
font-size: 14px;    
}
</style>
<script type="text/javascript">
function resetnoise(){
setTimeout(function(){document.getElementById("noise").src="noise-picture.php";},500);
}
</script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Страница регистрации</title>

</head>
<body>
<?php



    if (!empty($error))
    {
        echo "
<form action='registration.php' method='post'>
<table>
<tr><td>Введите login :</td><td><input name='login' type='text' size='33' maxlength='45' value='$rlogin' /></td></tr>
<tr><td>Введите password :</td><td><input name='pass' type='text' size='33' maxlength='45' value='$rpass' /></td></tr>
<tr><td>Введите password еще раз :</td><td><input name='passagain' type='text' size='33' maxlength='45' value='$rpassagain' /></td></tr>
<tr><td>Введите email :</td><td><input name='mail' type='text' size='33' maxlength='45' value='$rmail' /></td></tr>
<tr><td><div>
		<img id='noise' title='обновить символы' style='cursor: pointer;' onclick='resetnoise();' src='noise-picture.php'>
	</div>Введите строку с картинки :</td><td><input name='str' type='text' size='6' maxlength='6' /></td></tr>
<tr><td colspan='4' align='right'><input name='sub' type='submit' value='исправить' /></td></tr>
</table>
</form>";
        //print_r($error);
        for ($i = 0; $i < count($error); $i++)
        {
            echo "<br />" . $error[$i];
        }
    } elseif (ekran_var($_POST["sub"], 2) === 'ok')
    {
        //$_SESSION = array();
        session_unset();
        session_destroy();
        unset($_SERVER["REQUEST_METHOD"]);
        $endtime = time() + 86400; //86400 - сутки ; 3600 - час
        $query = "INSERT INTO activation (login,pass,mail,endtime) VALUES ('" .
            ekran_SQL($base, $rlogin) . "','" . ekran_SQL($base, $rpass) . "','" .
            ekran_SQL($base, $rmail) . "',$endtime)";
        $result = mysqli_query($base, $query);
        if ($result)
        {

            //mail("$rmail","To activate","http://localhost/igraland/registration.php?nss=".md5($rlogin)."&&nss2=".md5($endtime)."");
            include_once ("class/libmail.class.php");
            $m = new Mail('utf-8');
            $m->From("[email protected]"); // от кого
            $m->To("$rmail"); // кому
            $m->Subject("Accaunt Verification");
            $m->Body("http://example.php?nss=" . md5($rlogin) .
                "&&nss2=" . md5($endtime) . "");
            $m->Send(); // отправка
            echo "Ссылка активации выслана на email: $rmail.( Отправка письма может занять некоторое время ) Проверьте почту! Срок действия ссылки - сутки.<br />Письмо может попасть в папку 'спам' почтового сервера ( зависит от настроек самого сервера где расположен Ваш EMAIL ).Если Вы не получили письмо активации - напишите администратору";
        } else
        {
            echo "Ошибка записи в базу данных";
        }
    } else
    {
        echo "
<p>Если данные вас удовлетворяют нажмите : \"ok\"</p>
<p>Ваши регистрационные данные:</p>
<form action='registration.php' method='post'>
<table>
<tr><td> login :</td><td>$rlogin<input name='login' type='hidden' value='$rlogin' /></td></tr>
<tr><td> password :</td><td>$rpass<input name='pass' type='hidden' value='$rpass' /></td></tr>
<tr><td> email :</td><td>$rmail<input name='mail' type='hidden' value='$rmail' /></td></tr>
<tr><td colspan='4' align='right'>
<input name='str' type='hidden' value='$randStr' />
<input name='passagain' type='hidden' value='$rpassagain' />
<label>Зарегистрироваться :<input name='sub' type='submit' value='ok' /></label></td></tr>
</table>
</form>";

    }
    mysqli_close($base);
} else
{
    echo "
<form action='registration.php' method='post'>
<table>
<tr><td>Введите login :</td><td><input name='login' type='text' size='33' maxlength='45' /></td></tr>
<tr><td>Введите password :</td><td><input name='pass' type='text' size='33' maxlength='45'  /></td></tr>
<tr><td>Введите password еще раз :</td><td><input name='passagain' type='text' size='33' maxlength='45'  /></td></tr>
<tr><td>Введите email :</td><td><input name='mail' type='text' size='33' maxlength='45' /></td></tr>
<tr><td><div>
		<img id='noise' title='обновить символы' style='cursor: pointer;' onclick='resetnoise();' src='noise-picture.php'>
	</div>Введите строку с картинки :</td><td><input name='str' type='text' size='6' maxlength='6' /></td></tr>
<tr><td colspan='4' align='right'><input name='sub' type='submit' value='отправить' /></td></tr>
</table>
</form>";


}
echo "<br />" . (microtime(true) - $stopwatch);

?>
</body>
</html>
Интересует мнение сообщества - гляньте скрипт кривой или нет (тока тапками не кидайте) .Или я перемудрил.
 

С.

Продвинутый новичок
В чем кривизна интересует? В стиле програмирования? Так да, "кривой" -- это еще легко сказано. Уровень школьника средних классов. В работоспособности? Так кто ж его знает, наверное работает. Пространства для совершенствования очень много.
 

ioncore

Новичок
Это набросок .Работать - работает. Больше стиль интересует. Наверное погорячился завязать всё на одном скрипте, и форму и обработчик.
 

ioncore

Новичок
С. - Харош прикалываться .Лучше бы показал что не так. Мне интересно мнение со стороны. Логические есть ошибки или нет? То что стиль галимый и сам вижу. Хотел одним скриптом все сделать, да не срослось... Переделывать всё равно буду .Можно упростить - не фильтровать каждое поле, но так захотелось,чтобы пользователь видел каждую свою ошибку. Но хоть скрипт и кривой - но сокетами хрен обойдеш и роботам не прорваться :) Доробатывать нужно однозначно.Вот и интересуюсь - со стороны виднее.
 

antson

Новичок
Партнер клуба
пустой пост и сразу получим , что переменные несуществуют

ekran_var,ekran_SQL - ужасное имя

if (!($base = mysqli_connect('localhost', 'root', '', 'base'))) - и что параметры подключения так и будут в каждом файле писаться ?

elseif (mysqli_character_set_name($base) == 'cp1251')
{
mysqli_set_charset($base, "utf8");
}
кодировок только 2 существует ? . Если нужна ютф принудительно ставьте без предварительных проверок.

$arr = mysqli_fetch_array($result, MYSQLI_NUM);
mysqli_free_result($result);
if ($arr)

дело стиля конечно, я бы написал так

if ($arr = mysqli_fetch_array($result, MYSQLI_ASSOC);)
}
mysqli_free_result($result);
закладываться на порядок полей в таблице, значит поиметь гимор при модификации. (в данном случае это не принципиально, так как проверяется только факт наличия записи)


activation, gamer - зачем 2 таблицы ? в гамер поле статуса ввести с значениями : WAIT_ACTIVATION,OK,BANED и т.д.

а у офицального сайта игры нет openID ?

как я понял сайт клана игры пишешь ? не проще там группу в VK создать ?
 

ioncore

Новичок
пустой пост и сразу получим , что переменные несуществуют
- Вас сбивает с толку , что у меня и форма и обработчик в одном скрипте. Перемудрил,буду разделять.Сразу конечно пост пустой будет.И при пустом посте перекинет на пустую форму. Если пост не пустой - проверяем данные. Чтобы базу не дергать лишний раз - сначала прверяется каптча.И т. д. Если есть ошибки в данных - возвращается форма с заполненными полями для редактирования.Если ошибок нет - выводится обратно форма(данные прячутся в скрытые поля) и пользователь проверяет свои данные после проверки сервером (сделал для того чтобы если по незнанке юзер введет запрещенные символы - они вырежутся .В итоге будет висеть акаунт ненужный).
ekran_var,ekran_SQL - ужасное имя
- согласен ужаснейшое.Че то сдуру так назвал.В спешке все приходится делать.Переименую.
if (!($base = mysqli_connect('localhost', 'root', '', 'base'))) - и что параметры подключения так и будут в каждом файле писаться ?
-Ни в коем случае.Подключения будут в отдельном файле.
кодировок только 2 существует ? . Если нужна ютф принудительно ставьте без предварительных проверок.
- что две кодировки существует это я знаю.Да вот не знаю хватит одного mysqli_set_charset($base, "utf8"); или потом он он обратно на cp 1251 перепрыгнет.Sorry - не было времени прверить.На всякий случай пиханул проверку.
activation, gamer - зачем 2 таблицы ? в гамер поле статуса ввести с значениями : WAIT_ACTIVATION,OK,BANED и т.д.
- до этого было в одной таблице.Решение разделить : так показалось удобнее,в таблице gamer поле автоинкрементное (если юзер передумал - через сутки ссылка анулируется и получается или запись в таблице будет висеть постоянно или удалять надо - мусор накапливаться будет или ID автоинкрементное съедать будет), а в таблице - activation нету автоинкрементного поля,если срок действия ссылки закончился - сносим все просроченые записи.В итоге таблицы у нас чистенькие ,никакого мусора.
if ($arr = mysqli_fetch_array($result, MYSQLI_ASSOC)
}
mysqli_free_result($result);
- Спасибо действительно так получше будет.Но Вы правы - мне нужен факт наличия записей.Не нашел в mysqliI аналога функции mysql_result.Или плохо искал :)
как я понял сайт клана игры пишешь ?
Даже страшно признаться ,что я пишу :) Пишу сайт игры - так как официального нету,потому что и игру пишу сам :)))) на flash.
Вот в принципе в общем такая логика....Перемудрил наверное.Но как то сразу хочется все просчитать.
antson - Спасибо Вам большое, побольше бы таких ответов.
А то как то ответы типа -
Так да, "кривой" -- это еще легко сказано. Уровень школьника средних классов.
вообще не греют.Так сказать обосрали (извиняюсь за выражение) - а по существу ноль.
Еще раз BIG THANKS!!!
 

antson

Новичок
Партнер клуба
>> - что две кодировки существует это я знаю.
а я намекал, что их значительно больше 2х ;) а не только вынь и ютф .
mysql> SHOW CHARACTER SET;
и любая по усморению админа может оказаться дефолтовой. н-р latin1

>>ID автоинкрементное съедать будет
int(11) вдруг закончиться ? Население Земли ( прогноз на 2050 год) — 10^10 человек. 10 кратный запас маловат ? ;)

>> - Спасибо действительно так получше будет

еще лучше будет, если воспользуешься http://www.php.net/manual/en/class.mysqli.php
 

ioncore

Новичок
mysqli_set_charset - на сколько я знаю устанавливает кодировку обмена данных между клиентом и базой ..
> Вопрос не в том что ID закончится . К примеру 100 человек лоханулось или им что то не понравилось : 100 полей в мусорку . Через час очнулись - блин у меня ж второй email есть попробую ка я на него и обратно че то не получилось еще сто полей в мусорку .В итоге за фигню времени 200 полей в мусорке. Мелочь а неприятно . Пример не очень. Это я к тому что я не очень понимаю причем здесь население земли . Один человек может нафигачить мусора, неговоря о роботах, если защиты от роботов нету. Тем более есть опыт немного - был один товарищ, который аккаунты клепал со скоростью звука,потому что там давалось 50 копеек бонусов. :) Он их просаживал и по новой.Так загадил базу - и почтовики соответсвенно .Я ему потом IP рубанул - так он по прокси начал ломится, короче была хохма . В общем это не критично - но повторюсь неприятно. Мне не сложно одну временную таблицу для активации сделать а вторую основную.Меня это морально успокаивает :)
P.S Мануалом пользуюсь - тока с инглишем туго немного...
 

antson

Новичок
Партнер клуба
ioncore
болею я, наверное, поэтому не понятно доношу мысль.
ссылка в мануал была на класс, и имел я ввиду, что вместо процедурных вызовов, лучше (современнее) использовать ООП (классы и объекты).
А на счет таблицы активатион ты обосновал ее необходимость, что из-за "мёда" много левых активаций.
 

ioncore

Новичок
Sorry! Может я перегнул палку с ответом...Не взыщите. Просто в основном вместо помощи дают ссылки на мануал или "гугл тебе в помощь". Уже от ссылок на мануал передергивает :)) Я Unity скриптование по мануалу выучил потому, что русский форум поддержки мягко скажем : отвратителен. Насчет мёда Вы правы !!! А планируется ещё больше мёда :)) Позже планирую переписать OOП стилем. OOП класс mysqli - очень удобная вещь, гораздо удобнее процедурного, хотя если верить комментам с офф сайта процедурка быстрее. Но сам не тестировал - но думаю выгоду можно почувствовать на 10000 записей не меньше и то наверное не существенную. Просто пока всё решил оформить процедурным стилем,чтобы каши не было.Так сказать собрать скелет и логику, а потом переведу в классы и обьекты. Наверное глупо, но пока мне так легче. В PHP специфическая реализация ООП. Ещё у меня не сильно мозг заточен под ООП в PHP...:) В JavaScript вообще полный привет с ООП, можно мозги сломать. Классов нету, а объекты - то ли объект то ли функция, в итоге объект это функция...С наследованием тоже тихий ужас. Тяжело подстраиваться под особенности каждого языка.
 
Сверху