[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Прокомментируйте скрипт регистрации юзверей
Гость 777
Привет всем! Жду комментов...


<?php
//Открываем сессию
session_start ();
//Коннектимся к базе
include_once "bd.php";
?>
<html>
<
head>
<
title>Регистрация</title>
<
link type="text/css" rel="stylesheet" href="css.css">
<
meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</
head>
<
body>
<?php
if (isset ($_POST['ok']))
{
//Массив ошибок
$error = array ();
//Инициализируем переменные
$login = !empty ($_POST['login']) ? strip_tags (trim ($_POST['login'])) : NULL;
$pass = !empty ($_POST['pass']) ? strip_tags (trim ($_POST['pass'])) : NULL;
$pass2 = !empty ($_POST['pass2']) ? strip_tags (trim ($_POST['pass2'])) : NULL;
$mail = !empty ($_POST['mail']) ? strip_tags (trim ($_POST['mail'])) : NULL;
$keystring = !empty ($_POST['keystring']) ? strip_tags (trim ($_POST['keystring'])) : NULL;
//Вырезаем нужное нам кол-во символов из переменных
$login = substr ($login, 0, 20);
$pass = substr ($pass, 0, 20);
$pass2 = substr ($pass2, 0, 20);
$mail = substr ($mail, 0, 40);
$keystring = substr ($keystring, 0, 10);
//Проверяем логин на правильность заполнения
if (empty ($login))
$error[] = "Вы не ввели логин";
elseif (preg_match ("#[а-яА-Я]+#", $login))
$error[] = "Русские буквы не могут быть использованы в логине";
elseif (strlen ($login) < 2 or strlen ($login) > 20)
$error[] = "Длина логина не может быть меньше 2-х и больше 20-ти символов ";
$query = "SELECT * FROM `users`
WHERE `login` = '"
.mysql_real_escape_string ($login)."'";
$sql = mysql_query ($query);
if (mysql_num_rows ($sql) > 0)
$error[] = "Этот логин занят, выберите другой";
//Проверяем пароль на правильность заполнения
if (empty ($pass))
$error[] = "Вы не ввели пароль";
elseif (preg_match ("#[а-яА-Я]+#", $pass) or preg_match ("#[а-яА-Я]+#", $pass2))
$error[] = "Русские буквы не могут быть использованы в пароле";
elseif (strlen ($pass) < 2 or strlen ($pass) > 20)
$error[] = "Длина пароля не может быть меньше 2-х и больше 20-ти символов ";
elseif ($pass != $pass2)
$error[] = "Введенные пароли не совпадают";
if (empty ($pass2))
$error[] = "Вы не ввели подтверждение пароля";
//Проверяем e-mail на правильность заполнения
if (!preg_match ("#[-a-z0-9_\.]+@[-a-z0-9_\.]+\.[a-z]{2,6}#i", $mail))
$error[] = "Некорректный формат e-mail";
//Проверяем капчу на правильность заполнения
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $_POST ['keystring'])
$error[] = "Вы ввели неверный код с картинки";
if (count ($error) == 0)
{
$query2 = "INSERT INTO `users`
(`login`, `pass`, `mail`, `data`)
VALUES ('"
.mysql_real_escape_string ($login)."',
'"
.mysql_real_escape_string (md5($pass))."',
'"
.mysql_real_escape_string ($mail)."', NOW())";
$sql2 = mysql_query ($query2);
if ($sql2)
echo "Вы успешно зарегистрированы";
else
echo "Во время регистрации произошла ошибка, повторите еще раз";
}
else
{
$err = implode ("<br />", $error)."<br />";
echo "<b>Во время заполнения формы произошли следующие ошибки:</b><br />".$err;
}


}

?>




Спустя 9 минут, 50 секунд (20.11.2010 - 02:04) inpost написал(а):
include_once "bd.php";
Превращаем в:
include_once './db.php'; // Что такое bd и db? Правильно, DATA BASE, DB, db.

Кодировку неплохо было бы выставить ещё в самом скрипте!
strlen => mb_strlen($text,'utf-8'); // Для коректной работы с utf-8.

$query = "SELECT * FROM `users` WHERE `login` = '".mysql_real_escape_string ($login)."'"; не очень, зачем выбирать все поля, если ты проверяешь лишь наличие строки, можно указать и просто `id`, а вообще:
$result00 = mysql_query("SELECT COUNT(*) AS cnt FROM data WHERE cat='$cat'");$posts = myscl_result($result00, 0);


обращаешься к $_POST['keystring'], когда раннее инициализировал её.

strlen ($login) > 20 - фейловая проверка, так как ранее ты его уже обрезал до 20-и символов!

Я думаю хватит для первого раза! =)

Спустя 4 минуты, 52 секунды (20.11.2010 - 02:09) vinnie написал(а):
inpost
ну это мелочи не столь уж и важные

Спустя 5 минут, 29 секунд (20.11.2010 - 02:15) inpost написал(а):
vinnie
Что за глупости?! =) Если он разрешит русские буквы в ник-неймах, что я считаю нужным, то mb - необходим, иначе двухбайтные символы считываться будут некоректно!
Выборка очень тяжелая, ну ооочень, надо учиться кодить правильно сразу! Когда-нибудь на крупном проекте сделать такую, и сайт не сможет тянуть из-за каких-то 0000,1 мили секунд!
Обращение не к инициализированной - большая ошибка, так как защищается он именно от вредоносного кода, а тут даёт чистую дыру в коде.

Спустя 3 минуты, 43 секунды (20.11.2010 - 02:18) vinnie написал(а):
inpost
там не разрешены русские буквы

а почему выборка тяжелая? и где обращение не к инициализированной?

Спустя 2 минуты, 13 секунд (20.11.2010 - 02:21) inpost написал(а):
SELECT * - нет необходимости брать ВСЕ(!) данные для того, чтобы узнать, есть ли такой логин.
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $_POST ['keystring'])

Спустя 3 минуты, 14 секунд (20.11.2010 - 02:24) vinnie написал(а):
и делов-то

$query = "SELECT `id` FROM `users` WHERE `login` = '".mysql_real_escape_string ($login)."'";

if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $keystring])


Спустя 6 часов, 2 минуты, 45 секунд (20.11.2010 - 08:27) twin написал(а):
vinnie
Цитата
ну это мелочи не столь уж и важные
С таким отношением лучше учиться не на программиста, а на машиниста шагающего экскаватора.
В программировании важна каждая запятая.

Это кто так научил извращаться:
    $login = !empty ($_POST['login']) ? strip_tags (trim ($_POST['login'])) : NULL;
$pass = !empty ($_POST['pass']) ? strip_tags (trim ($_POST['pass'])) : NULL;
$pass2 = !empty ($_POST['pass2']) ? strip_tags (trim ($_POST['pass2'])) : NULL;
$mail = !empty ($_POST['mail']) ? strip_tags (trim ($_POST['mail'])) : NULL;
$keystring = !empty ($_POST['keystring']) ? strip_tags (trim ($_POST['keystring'])) : NULL;
?

Спустя 2 часа, 36 минут, 13 секунд (20.11.2010 - 11:03) vinnie написал(а):
Цитата
Это кто так научил извращаться:

почему это извращение?

Спустя 2 часа, 23 секунды (20.11.2010 - 13:03) twin написал(а):
А почему я не могу использовать такй пароль
<my_pass>?
И почему не могу использовать русские буквы, а китайские иероглифы могу?
И вообще, что за странная манера ограничивать юзера в выборе пароля?

Но самое страшное не в этом. Самое страшное в том, что я набрав такой пароль <my_pass>my_pass никогда не попаду в свой аккаунт, так как ты в базу запишешь это my_pass.

Вообще, почитай тут о принципах. Сам скрипт не важен, а принципы край как важны.

Спустя 21 минута, 3 секунды (20.11.2010 - 13:24) vinnie написал(а):
в данном случае вместо
strip_tags

нужно использовать
htmlspecialshars

?

Спустя 3 минуты, 16 секунд (20.11.2010 - 13:27) inpost написал(а):
vinnie
Можно, и сравнивать их уже так, но это вариант.

Спустя 1 час, 26 минут, 48 секунд (20.11.2010 - 14:54) vinnie написал(а):
inpost
посте того, как я исправил те ошибки, которые ты указал, исправил strip_tags на htmlspecialchars, там еще ошибки есть в скрипте?

Спустя 25 минут, 14 секунд (20.11.2010 - 15:20) inpost написал(а):
vinnie
Кидай обновлённую страницу сюда со всеми исправлениями =)

Спустя 2 минуты, 8 секунд (20.11.2010 - 15:22) vinnie написал(а):

<?php
//Открываем сессию
session_start ();
//Коннектимся к базе
include_once "db.php";

if (isset ($_POST['ok']))
{
//Массив ошибок
$error = array ();
//Инициализируем переменные
$login = !empty ($_POST['login']) ? strip_tags (trim ($_POST['login'])) : NULL;
$pass = !empty ($_POST['pass']) ? htmlspecialchars (trim ($_POST['pass'])) : NULL;
$pass2 = !empty ($_POST['pass2']) ? htmlspecialchars (trim ($_POST['pass2'])) : NULL;
$mail = !empty ($_POST['mail']) ? strip_tags (trim ($_POST['mail'])) : NULL;
$keystring = !empty ($_POST['keystring']) ? strip_tags (trim ($_POST['keystring'])) : NULL;
//Вырезаем нужное нам кол-во символов из переменных
$login = substr ($login, 0, 20);
$pass = substr ($pass, 0, 20);
$pass2 = substr ($pass2, 0, 20);
$mail = substr ($mail, 0, 40);
$keystring = substr ($keystring, 0, 10);
//Проверяем логин на правильность заполнения
if (empty ($login))
$error[] = "Вы не ввели логин";
elseif (preg_match ("#[а-яА-Я]+#", $login))
$error[] = "Русские буквы не могут быть использованы в логине";
elseif (strlen ($login) < 2 or strlen ($login) > 20)
$error[] = "Длина логина не может быть меньше 2-х и больше 20-ти символов ";
$query = "SELECT `id` FROM `users`
WHERE `login` = '"
.mysql_real_escape_string ($login)."'";
$sql = mysql_query ($query);
if (mysql_num_rows ($sql) > 0)
$error[] = "Этот логин занят, выберите другой";
//Проверяем пароль на правильность заполнения
if (empty ($pass))
$error[] = "Вы не ввели пароль";
elseif (preg_match ("#[а-яА-Я]+#", $pass) or preg_match ("#[а-яА-Я]+#", $pass2))
$error[] = "Русские буквы не могут быть использованы в пароле";
elseif (strlen ($pass) < 2 or strlen ($pass) > 20)
$error[] = "Длина пароля не может быть меньше 2-х и больше 20-ти символов ";
elseif ($pass != $pass2)
$error[] = "Введенные пароли не совпадают";
if (empty ($pass2))
$error[] = "Вы не ввели подтверждение пароля";
//Проверяем e-mail на правильность заполнения
if (!preg_match ("#[-a-z0-9_\.]+@[-a-z0-9_\.]+\.[a-z]{2,6}#i", $mail))
$error[] = "Некорректный формат e-mail";
//Проверяем капчу на правильность заполнения
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $keystring])
$error[] = "Вы ввели неверный код с картинки";
if (count ($error) == 0)
{
$query2 = "INSERT INTO `users`
(`login`, `pass`, `mail`, `data`)
VALUES ('"
.mysql_real_escape_string ($login)."',
'"
.md5($pass)."',
'"
.mysql_real_escape_string ($mail)."', NOW())";
$sql2 = mysql_query ($query2);
if ($sql2)
echo "Вы успешно зарегистрированы";
else
echo "Во время регистрации произошла ошибка, повторите еще раз";
}
else
{
$err = implode ("<br />", $error)."<br />";
echo "<b>Во время заполнения формы произошли следующие ошибки:</b><br />". $err;
}


}

?>

Спустя 10 минут, 57 секунд (20.11.2010 - 15:33) inpost написал(а):
vinnie
Я уже говорил про проверку на длину 20, несколько раз встречается! Так же после успешной регистрации надо редирект делать.
В регулярках лучше указывать спектр допустимых символов, а не наоборот! Как сказал твин, то даже китайские иероглифы пройдут! Напиши те символы, которые ты допускаешь для регистрации!

Спустя 10 минут, 26 секунд (20.11.2010 - 15:43) vinnie написал(а):
исправлю. а вот сам код, сама реализация верная?

Спустя 3 минуты, 38 секунд (20.11.2010 - 15:47) inpost написал(а):
Исправляй и обратно к нам с новым кодом =)
Вот смотри, если что-то неправильное, то уже и реализация общая будет не достаточно верной! Когда все ошибки уберёшь, выставляй, я проверю заново! =)

Спустя 23 минуты, 53 секунды (20.11.2010 - 16:11) vinnie написал(а):
вот насчет strlen я не до конца понял. я просто поставить в известность юзверя, о минимальности и максимальности логина

Спустя 3 минуты, 51 секунда (20.11.2010 - 16:14) vinnie написал(а):

<?php
//Открываем сессию
session_start ();
//Коннектимся к базе
include_once "bd.php";

if (isset ($_POST['ok']))
{
//Массив ошибок
$error = array ();
//Инициализируем переменные
$login = !empty ($_POST['login']) ? strip_tags (trim ($_POST['login'])) : NULL;
$pass = !empty ($_POST['pass']) ? htmlspecialchars (trim ($_POST['pass'])) : NULL;
$pass2 = !empty ($_POST['pass2']) ? htmlspecialchars (trim ($_POST['pass2'])) : NULL;
$mail = !empty ($_POST['mail']) ? strip_tags (trim ($_POST['mail'])) : NULL;
$keystring = !empty ($_POST['keystring']) ? strip_tags (trim ($_POST['keystring'])) : NULL;
//Вырезаем нужное нам кол-во символов из переменных
$login = substr ($login, 0, 20);
$pass = substr ($pass, 0, 20);
$pass2 = substr ($pass2, 0, 20);
$mail = substr ($mail, 0, 40);
$keystring = substr ($keystring, 0, 10);
//Проверяем логин на правильность заполнения
if (empty ($login))
$error[] = "Вы не ввели логин";
elseif (preg_match ("#[^-a-z0-9_]+#", $login))
$error[] = "Логин может состоять тока из англ. букв, символов - и _";
elseif (strlen ($login) < 2 or strlen ($login) > 20)
$error[] = "Длина логина не может быть меньше 2-х и больше 20-ти символов ";
$query = "SELECT `id` FROM `users`
WHERE `login` = '"
.mysql_real_escape_string ($login)."'";
$sql = mysql_query ($query);
if (mysql_num_rows ($sql) > 0)
$error[] = "Этот логин занят, выберите другой";
//Проверяем пароль на правильность заполнения
if (empty ($pass))
$error[] = "Вы не ввели пароль";
elseif (preg_match ("#[^-a-z0-9_]+#", $pass) or preg_match ("#[а-яА-Я]+#", $pass2))
$error[] = "Пароль может состоять тока из англ. букв, символов - и _";
elseif (strlen ($pass) < 2 or strlen ($pass) > 20)
$error[] = "Длина пароля не может быть меньше 2-х и больше 20-ти символов ";
elseif ($pass != $pass2)
$error[] = "Введенные пароли не совпадают";
if (empty ($pass2))
$error[] = "Вы не ввели подтверждение пароля";
//Проверяем e-mail на правильность заполнения
if (!preg_match ("#[-a-z0-9_\.]+@[-a-z0-9_\.]+\.[a-z]{2,6}#i", $mail))
$error[] = "Некорректный формат e-mail";
//Проверяем капчу на правильность заполнения
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $keystring])
$error[] = "Вы ввели неверный код с картинки";
if (count ($error) == 0)
{
$query2 = "INSERT INTO `users`
(`login`, `pass`, `mail`, `data`)
VALUES ('"
.mysql_real_escape_string ($login)."',
'"
.md5($pass)."',
'"
.mysql_real_escape_string ($mail)."', NOW())";
$sql2 = mysql_query ($query2);
if ($sql2)
header ("Location:index.php");
echo "Вы успешно зарегистрированы";
else
echo "Во время регистрации произошла ошибка, повторите еще раз";
}
else
{
$err = implode ("<br />", $error)."<br />";
echo "<b>Во время заполнения формы произошли следующие ошибки:</b><br />".$err;
}


}

?>

Спустя 1 час, 3 минуты, 56 секунд (20.11.2010 - 17:18) inpost написал(а):
$login = substr ($login, 0, 20); - больше 20-и никак не будет! Так как уже длина определена с 0 до 20!

Спустя 22 минуты, 32 секунды (20.11.2010 - 17:41) phz написал(а):
Зачем htmlspecialchars :

    $pass = !empty ($_POST['pass']) ? htmlspecialchars (trim ($_POST['pass'])) : NULL;


У вас пароль и так в мд5 шифр.

Зачем это:

    //Вырезаем нужное нам кол-во символов из переменных


Зачем чего то резать? У вас всё какие-то фобии...

Главное на входе в базу mysql_real_escape_string если текст или md5 если пароль

на выходе htmlspecialchars, и будет всё в поряде

Спустя 4 часа, 2 минуты, 55 секунд (20.11.2010 - 21:44) vinnie написал(а):
а если юзверь подменяет форму, поменяет maxlength на 200, например, ему ж надо сообщить, что максимальное кол-во символов 20)

Спустя 17 минут, 26 секунд (20.11.2010 - 22:01) kovaldm написал(а):
А в БД не установлено макс. кол-во симвлов для логина?

Спустя 8 минут, 9 секунд (20.11.2010 - 22:09) inpost написал(а):
kovaldm
А разница? Допустим установлено, но если передать слиииишком длинные данные, может возникнуть проблема, ответить точно не могу, где-то слышал краем уха, и давно это было...
Перестраховка лишней не будет.

Спустя 53 минуты, 25 секунд (20.11.2010 - 23:03) vinnie написал(а):
какая перестраховка???? substr?

Спустя 2 минуты, 20 секунд (20.11.2010 - 23:05) kovaldm написал(а):
Тогда уж лучше проверить длину и, если превышает, вывести предупреждение.

Спустя 16 минут, 22 секунды (20.11.2010 - 23:21) inpost написал(а):
kovaldm
В скрипте и обрезка, и проверка длины. А я всё время твержу ему, что надо оставить что-то одно =)

Спустя 15 минут, 26 секунд (20.11.2010 - 23:37) kovaldm написал(а):
Проверка, больше ничего не нужно. Вдруг юзер просто тупо ошибся?

Спустя 5 минут, 34 секунды (20.11.2010 - 23:42) inpost написал(а):
Что ты подразумеваешь под "тупо ошибся" ? =)

Спустя 6 минут, 38 секунд (20.11.2010 - 23:49) kovaldm написал(а):
Ввел слишком длинное имя.

Спустя 3 минуты, 35 секунд (20.11.2010 - 23:53) inpost написал(а):
Случайным образом не введёт, потому что длина инпута выставлена максимальная, поэтому только хакерскими путями отправить можно

Спустя 3 минуты, 38 секунд (20.11.2010 - 23:56) vinnie написал(а):
я понял одно... в phpmyadmin ставлю длину поля, например, 20 и все... остальное не нужно.. всякие проверки, обрезки. правильно, inpost?

Спустя 7 минут, 41 секунда (21.11.2010 - 00:04) vinnie написал(а):
А в таком виде код верный? Переписал все, лишнее убрал вроде


<?php
if (isset ($_POST['ok']))
{
//Массив ошибок
$error = array ();
//Инициализируем переменные
$login = !empty ($_POST['login']) ? trim($_POST['login']) : NULL;
$pass = !empty ($_POST['pass']) ? trim($_POST['pass']) : NULL;
$pass2 = !empty ($_POST['pass2']) ? trim($_POST['pass2']) : NULL;
$mail = !empty ($_POST['mail']) ? trim($_POST['mail']) : NULL;
$keystring = !empty ($_POST['keystring']) ? strip_tags (trim ($_POST['keystring'])) : NULL;
//Проверяем логин на правильность заполнения
if (empty ($login))
$error[] = "Вы не ввели логин";
elseif (preg_match ("#[^-a-z0-9_]+#", $login))
$error[] = "Логин может состоять тока из англ. букв, символов - и _";
$query = "SELECT `id` FROM `users`
WHERE `login` = '"
.mysql_real_escape_string ($login)."'";
$sql = mysql_query ($query);
if (mysql_num_rows ($sql) > 0)
$error[] = "Этот логин занят, выберите другой";
//Проверяем пароль на правильность заполнения
if (empty ($pass))
$error[] = "Вы не ввели пароль";
elseif (preg_match ("#[^-a-z0-9_]+#", $pass) or preg_match ("#[а-яА-Я]+#", $pass2))
$error[] = "Пароль может состоять тока из англ. букв, символов - и _";
elseif ($pass != $pass2)
$error[] = "Введенные пароли не совпадают";
if (empty ($pass2))
$error[] = "Вы не ввели подтверждение пароля";
//Проверяем e-mail на правильность заполнения
if (!preg_match ("#[-a-z0-9_\.]+@[-a-z0-9_\.]+\.[a-z]{2,6}#i", $mail))
$error[] = "Некорректный формат e-mail";
//Проверяем капчу на правильность заполнения
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $keystring)
$error[] = "Вы ввели неверный код с картинки";
if (count ($error) == 0)
{
$query2 = "INSERT INTO `users`
(`login`, `pass`, `mail`, `data`)
VALUES ('"
.mysql_real_escape_string ($login)."',
'"
.md5($pass)."',
'"
.mysql_real_escape_string ($mail)."', NOW())";
$sql2 = mysql_query ($query2);
if ($sql2)
// header ("Location:index.php");
echo "Вы успешно зарегистрированы";
else
echo "Во время регистрации произошла ошибка, повторите еще раз";
}
else
{
$err = implode ("<br />", $error)."<br />";
echo "<b>Во время заполнения формы произошли следующие ошибки:</b><br />".$err;
}


}

?>


<table width="600" align="center">

<form
action="" method="post">

<tr>
<td><label>
Введите логин</label></td>
<td><input
type="text" name="login" maxlength="20" value="<?php echo strip_tags ($login); ?>"/></td>
</tr>

<tr>
<td><label>
Введите пароль</label></td>
<td><input
type="password" name="pass" maxlength="20" value="<?php echo strip_tags ($pass); ?>"/></td>
</tr>

<tr>
<td><label>
Повторите пароль</label></td>
<td><input
type="password" name="pass2" maxlength="20" value="<?php echo strip_tags ($pass2); ?>"/></td>
</tr>

<tr>
<td><label>
Введите e-mail</label></td>
<td><input
type="text" name="mail" maxlength="40" value="<?php echo strip_tags ($mail); ?>"/></td>
</tr>

<tr>
<td><label>
Введите код с картинки</label><br />
<img
src="kcaptcha/index.php?<?php echo session_name()?>=<?php echo session_id()?>"></td>
<td>
<input
type="text" name="keystring" maxlength="40" /></td>
</tr>

<tr>
<td><input
type="submit" value="Зарегистрироваться" name="ok" /></td>
</tr>

</table>


Спустя 1 час, 40 минут, 38 секунд (21.11.2010 - 01:45) inpost написал(а):
Обращение к БД будет в том случае, если логин будет в один символ, или просто "_", зачем? Нагружаешь БД лишней нагрузкой! Лучше всего сделать обращение к БД в самом конце, тогда и проверяй, если ерроров 0, то проверяешь, есть ли такой логин.
Так же регистронезависимый, не уверен, но кажется если писать одно и то же слово в разном регистре - пройдет у тебя. Вот с е-майлом такая же фигня, лучше все данные зарание опусти в нижний реестр, и так работай.
Ну и теперь мой новый прикол: русские е-майлы не пройдут регистрацию! Их обещают добавить в течении двух лет, и вуа-ля, твой скрипт через полтора года станет бесполезным!
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $keystring) - мне кажется, проверка чуточку не верна. Лучше от обратного: if(!isset($_SESSION) || $_SESSION != - тогда.
Ну и вывод ошибок странноватый. Я бы сделал через foreach.
Как видишь, в большинстве случаев лишь техника. В основном нормальный скрипт! Можешь сравнить с irbis-team.com / Там очень хорошо изложена эта тема.

Спустя 5 минут, 51 секунда (21.11.2010 - 01:51) vinnie написал(а):

if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $keystring)

эту строку я взял из капчи... там есть файл с примером установки, оттуда скопипастил
а вот когда русские e-mail-ы сделают, тогда и поменяем код

Спустя 4 минуты, 53 секунды (21.11.2010 - 01:55) inpost написал(а):
Сразу на всех сайтах? =) Знаю я вас, ленивых!

Спустя 17 минут, 51 секунда (21.11.2010 - 02:13) vinnie написал(а):
не думаю, что найдётся хоть один сайт в сети интернет, который рассчитан на русские e-mail

Спустя 6 минут, 29 секунд (21.11.2010 - 02:20) inpost написал(а):
Тогда вопрос на засыпку, когда открыли регистрацию РФ доменов с русскими именами? Все сайты, про которые ты думаешь, были сделаны до открытия этого домена!

Спустя 17 минут, 12 секунд (21.11.2010 - 02:37) vinnie написал(а):
ну вот... яндекс... маил... гугл... одноклассники)))

Спустя 4 минуты, 16 секунд (21.11.2010 - 02:41) inpost написал(а):
vinnie
Поверь, как только - они сразу обновят, это их деньги, они не забудут и лениться тоже не будут. Ну так это как дополнение, в целом скрипт стал лучше.

Спустя 2 минуты, 52 секунды (21.11.2010 - 02:44) vinnie написал(а):
ты про мо

Спустя 43 секунды (21.11.2010 - 02:45) vinnie написал(а):
ты про мой скрипт? радует!!!)))

Спустя 1 час, 14 минут, 53 секунды (21.11.2010 - 04:00) job-nik написал(а):
Я где -то слышал что SELECT * работает быстрее чем SELECT id

Спустя 14 минут, 17 секунд (21.11.2010 - 04:14) inpost написал(а):
job-nik
Лучше другие способы: count() к примеру, или как ранее я писал (Твин предлагал). В любом случае такой поиск не засоряет память лишними данными, что плюс, а выборка я слышал, что быстрее, но надо проверять.

Спустя 1 час, 26 минут (21.11.2010 - 05:40) job-nik написал(а):
Цитата (inpost @ 20.11.2010 - 14:18)
$login = substr ($login, 0, 20); - больше 20-и никак не будет! Так как уже длина определена с 0 до 20!

Человек использует регэксп не проще будет добавить квантификатор {0, 20} ?
Цитата (inpost @ 20.11.2010 - 14:18)
job-nik
Лучше другие способы: count() к примеру, или как ранее я писал (Твин предлагал).
не понял зачем делать каунт, если мы просто ищем имя? Это какие-то ловкости или в очередной раз хороший понт дороже денег?

Спустя 2 часа, 9 минут, 49 секунд (21.11.2010 - 07:50) twin написал(а):
count() тут для того, чтобы не тащить лишнего из sql на сторону php. Понт не понт, но аккуратность никому не вредила.

Спустя 1 час, 16 минут, 3 секунды (21.11.2010 - 09:06) job-nik написал(а):
а никто про вред и не говорит. хочу уточнить что оптимальней, если считать нечего, а цель - исключительно проверить наличие записи. интересно же

Спустя 2 часа, 42 минуты, 47 секунд (21.11.2010 - 11:49) vinnie написал(а):

select count(*)

или

select `id`

?????

Спустя 14 минут, 51 секунда (21.11.2010 - 12:03) job-nik написал(а):
select *
тебе считать нечего. там ровно 0-1 запись - ненайденый/найденый юзер smile.gif

квантификатор добавил в регулярке?

Спустя 2 минуты, 11 секунд (21.11.2010 - 12:06) vinnie написал(а):
не добавил(((( а где именно? че-т я не понял тя

Спустя 5 минут, 22 секунды (21.11.2010 - 12:11) vinnie написал(а):
в таком виде нормально???? капчу убрал, шоб не мешала))) (шутка)

<?php
include_once "db.php";
if (isset ($_POST['ok']))
{
$error = array ();
$login = !empty ($_POST['login']) ? trim ($_POST['login']) : NULL;
$pass = !empty ($_POST['pass']) ? trim ($_POST['pass']) : NULL;
$pass2 = !empty ($_POST['pass']) ? trim ($_POST['pass2']) : NULL;
//Проверяем логин
if (empty ($login))
$error[] = "Вы не ввели логин";
elseif (preg_match ("#[^a-z0-9\_\-]#", $login))
$error[] = "Логин может состоять тока из анг-х букв, цифр, _ и -";
//Проверяем пароль
if (empty ($pass) or empty ($pass2))
$error[] = "Вы не ввели пароль или подтверждение пароля";
elseif (preg_match ("#[^a-z0-9\_\-]#", $pass) or preg_match ("#[^a-z0-9\_\-]#", $pass2))
$error[] = "Пароль может состоять тока из анг-х букв, цифр, _ и -";
elseif ($pass !== $pass2)
$error[] = "Пароли не совпадают";
if (count ($error) == 0)
{
$sql = mysql_query ("SELECT COUNT(*) FROM `users`
WHERE `login` = '"
.mysql_real_escape_string ($login)."'");
if (mysql_result ($sql, 0) > 0)
echo "Этот логин уже занят, давай другой соображай";
else
{
$sql2 = mysql_query ("INSERT INTO `users` (`login`, `pass`)
VALUES ('"
.mysql_real_escape_string ($login)."',
'"
.md5($pass)."')");
}
}

else
{
foreach ($error as $err)
echo $err."<br />";
}
}

?>

Спустя 23 минуты, 17 секунд (21.11.2010 - 12:34) job-nik написал(а):
1. ошибка
не
$pass = !empty ($_POST['pass']) ? trim ($_POST['pass']) : NULL;
$pass2 = !empty ($_POST['pass']) ? trim ($_POST['pass2']) : NULL;
а
$pass = !empty ($_POST['pass']) ? trim ($_POST['pass']) : NULL;
$pass2 = !empty ($_POST['pass2']) ? trim ($_POST['pass2']) : NULL;
2. эти проверки никогда не сработают:
if (empty ($login))
if (empty ($pass) or empty ($pass2))
elseif ($pass !== $pass2)
3. ошибкане
 elseif (preg_match ("#[^a-z0-9\_\-]#", $pass) or preg_match ("#[^a-z0-9\_\-]#", $pass2))
а
 elseif (preg_match ("#[^a-z0-9\_\-]#", $pass) and preg_match ("#[^a-z0-9\_\-]#", $pass2))
4. квантификаторы в регулярном выражении для ограничения тыж хотел...
#[^a-z0-9\_\-]#
#[^a-z0-9\_\-]{0, 20}#
5. кого ты там считать собрался ? :rolleyes:
$sql = mysql_query ("SELECT COUNT(*) FROM `users`
WHERE `login` = '"
.mysql_real_escape_string ($login)."'");
$sql = mysql_query ("SELECT * FROM `users`
WHERE `login` = '"
.mysql_real_escape_string ($login)."'");
вроде всё. устал! но плюс чесно отработал ;)

Спустя 4 минуты, 49 секунд (21.11.2010 - 12:39) vinnie написал(а):
Цитата

1. ошибка
не
$pass = !empty ($_POST['pass']) ? trim ($_POST['pass']) : NULL;
$pass2 = !empty ($_POST['pass']) ? trim ($_POST['pass2']) : NULL;
а
$pass = !empty ($_POST['pass']) ? trim ($_POST['pass']) : NULL;
$pass2 = !empty ($_POST['pass2']) ? trim ($_POST['pass2']) : NULL;


не вижу никакой разницы

Спустя 1 минута, 5 секунд (21.11.2010 - 12:40) vinnie написал(а):

$sql = mysql_query ("SELECT * FROM `users`
WHERE `login` = '"
.mysql_real_escape_string ($login)."'");

в начале я так и написал, но забраковали все...

Спустя 32 секунды (21.11.2010 - 12:41) vinnie написал(а):
Цитата

2. эти проверки никогда не сработают:
if (empty ($login))
if (empty ($pass) or empty ($pass2))
elseif ($pass !== $pass2)


почему не сработают?

Спустя 14 минут, 58 секунд (21.11.2010 - 12:56) job-nik написал(а):
Цитата
не вижу никакой разницы
глазки протри dry.gif
Цитата
в начале я так и написал, но забраковали все...
а в чём причина брака?
Цитата
почему не сработают?
они пустыми быть не могут тыж сам их прописал вверху не пустыми....

Спустя 2 часа, 17 минут, 48 секунд (21.11.2010 - 15:13) Guest написал(а):
Цитата

они пустыми быть не могут тыж сам их прописал вверху не пустыми....

где прописала???? да и глазки я протёр, объясни

Спустя 51 секунда (21.11.2010 - 15:14) Guest написал(а):
а вот причину брака я не знаю, в начала inpost там че-то говорил, что памяти много займёт запрос такой)

Спустя 21 минута, 36 секунд (21.11.2010 - 15:36) Guest написал(а):
а как тогда проверять пустое ли поле или нет?

if (!$login)


так что ли?

Спустя 1 час, 10 минут, 47 секунд (21.11.2010 - 16:47) Guest написал(а):
и вот в итоге то, что получилось))
http://stepan.byethost33.com/re/

Спустя 36 минут, 36 секунд (21.11.2010 - 17:23) inpost написал(а):
Запускайте, проверяйте! Главное выставить правильные имена и соединение с БД. Результат на моем серваке:
SELECT * - 0.630332946777
SELECT `id` - 0.496221065521
SELECT COUNT(*) AS `cnt`- 0.517763137817
SELECT `id`,и т.д. все ячейки, равноценно знаку * - 0.609570980072 (часто результат совпадал со *, при этом иногда становился меньше.

Самый неэфективный является SELECT *.

$t = microtime(true);
for($i=0;$i<1000;$i++)
{
$row = mysql_query("SELECT * FROM `dat_correspondence` WHERE `id`=1");
if(mysql_num_rows($row)>0)
echo " ";
}
echo "<br />".(microtime(true)-$t);

$t = microtime(true);
for($i=0;$i<1000;$i++)
{
$row = mysql_query("SELECT `id` FROM `dat_correspondence` WHERE `id`=1");
if(mysql_num_rows($row)>0)
echo " ";
}
echo "<br />".(microtime(true)-$t);

$t = microtime(true);
for($i=0;$i<1000;$i++)
{
$row = mysql_query("SELECT COUNT(*) AS `cnt` FROM `dat_correspondence` WHERE `id`=1");
if(mysql_result($row, 0) == 0)
echo " ";
}
echo "<br />".(microtime(true)-$t);

$t = microtime(true);
for($i=0;$i<1000;$i++)
{
$row = mysql_query("SELECT `id`,`id_partner`,`partner`,`date`,`partnertext`,`admintext`,`archiveadmin`,`archivepartner`,`zumm` FROM `dat_correspondence` WHERE `id`=1");
if(mysql_num_rows($row)>0)
echo " ";
}
echo "<br />".(microtime(true)-$t);

Спустя 5 минут, 33 секунды (21.11.2010 - 17:29) Guest написал(а):
значит select `id`

Спустя 5 минут, 40 секунд (21.11.2010 - 17:35) inpost написал(а):
vinnie
Ты программист, тебе дали советы, взял и сам проверил скорость выполнения различных скриптов!

Спустя 25 минут, 32 секунды (21.11.2010 - 18:00) Guest написал(а):
Остановился на select `id`

Спустя 2 дня, 5 часов, 30 секунд (23.11.2010 - 23:01) PiratXXX написал(а):
Есть вопросы по обработки! Я бы советывал делать так:

$login = ( isset($_POST['login']) )? $_POST['login'] : NULL;

if(get_magic_quotes_gpc()) {
$login = stripslashes($login);
}

$login = trim(strip_tags(mysql_real_escape_string($login)));
Быстрый ответ:

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