Господа, как это обойти? Код (Text): <?php $_config = array ( // DB settings 'host' => 'localhost', // адрес БД 'user' => 'root', // логин к БД 'pass' => '', // пароль к БД 'port' => '3306', // порт к БД 'dbname' => 'auth', // база ); $tbc = 2; $database_encoding = 'UTF8'; $link = new mysqli($_config['host'], $_config['user'], $_config['pass'], $_config['dbname']); if ($link->connect_error) { die($str_error_2); } if(empty($_POST)){ echo " <center> <form method=post action='/reg.php'> <table> <tr> <td>Login: <Br> <input type=text name=account maxlength=20></td> </tr> <tr> <td> Password:<Br> <input type=password name=password maxlength=20></td> </tr> <tr> <td> Confirm Password: <Br> <input type=password name=password2 maxlength=20></td> </tr> <tr> <td> e-mail:<Br> <input type=text name=email maxlength=32></td> </tr> <tr> <td colspan=2 style=\"text-align: center;\"><br><input type=submit value=Зарегистрироваться></td> </tr> </table> </form></center>"; }else{ $login = htmlentities($_POST['account']); $pass = htmlentities($_POST['password']); $pass2 = htmlentities($_POST['password2']); $email = htmlentities($_POST['email']); $error = false; $errormsg = ""; $query = mysqli_query($link, "SELECT `id` FROM `account` WHERE `username`='{$login}' LIMIT 1"); $numrow = $query->num_rows; if ($numrow == 1){ $error = true; $errormsg = 'Такой аккаунт уже есть.<br><a href="reg.php">еще раз?</a>'; } if (preg_match("/^[a-zA-Z0-9_]+$/", $login) && strlen($login) >= 3) { $error = true; $errormsg = 'Логин слишком короткий.<br><a href="reg.php">еще раз?</a>'; if (preg_match("/^[a-zA-Z0-9]+$/", $pass) && strlen($pass) >= 3 ) { $error = true; $errormsg = 'Пароль слишком короткий.<br><a href="reg.php">еще раз?</a>'; if ( !preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', (string) $email) ) { $error = true; $errormsg = 'Емайл введён не верно.<br><a href="reg.php">еще раз?</a>'; if($pass !== $pass2){ $error = true; $errormsg = 'Пароли не совпадают.<br><a href="reg.php">еще раз?</a>'; } } } } if(!$error){ $login = strtoupper($login); $pass = sha1(strtoupper($login) .':'. strtoupper($pass)); $query = mysqli_query($link, "INSERT INTO `account` SET `username`='{$login}', `sha_pass_hash`='{$pass}', `email`='{$email}'; "); $result = $link->query($query); echo "Успешно"; }else{ echo "Ошибка: ".$errormsg; } } $link->close(); //отключение от базы данных ?>
Вот часть с условиями допустимости пароля if (preg_match("/^[a-zA-Z0-9]+$/", $pass) && strlen($pass) >= 3 ) Отметил большим шрифтом цифры. Это и есть длина пароля.
Я это прекрасно понимаю) но все дело в том что я ставил разные значения, и 6 и 10 и 40 и все равно вместо успешной регистрации выдает ошибку короткого пароля(
Работает то все верно. У Вас там везде логичские ошибки в коде. В результате получаете не то чего ожидаете. Присмотритесь внимательнее. Или уже сперва поспать надо, а завтра на свежую голову все пойдет как по маслу )
Ваша логика: если прошла регулярка логина и он больше трех символов, то ошибка. Если прошла регулярка пароля и он больше трех символов, то ошибка. Добавлено спустя 1 минуту 20 секунд: Копипастить плохо) Добавлено спустя 1 минуту 47 секунд: Вот уже теплее, почти горячо
Код (Text): <?php $_config = array ( // DB settings 'host' => 'localhost', // адрес БД 'user' => 'root', // логин к БД 'pass' => '', // пароль к БД 'port' => '3306', // порт к БД 'dbname' => 'auth', // база ); $tbc = 2; $database_encoding = 'UTF8'; $link = new mysqli($_config['host'], $_config['user'], $_config['pass'], $_config['dbname']); if ($link->connect_error) { die($str_error_2); } if(empty($_POST)){ echo " <center> <form method=post action='/reg.php'> <table> <tr> <td>Login: <Br> <input type=text name=account maxlength=20></td> </tr> <tr> <td> Password:<Br> <input type=password name=password maxlength=20></td> </tr> <tr> <td> Confirm Password: <Br> <input type=password name=password2 maxlength=20></td> </tr> <tr> <td> e-mail:<Br> <input type=text name=email maxlength=32></td> </tr> <tr> <td colspan=2 style=\"text-align: center;\"><br><input type=submit value=Зарегистрироваться></td> </tr> </table> </form></center>"; }else{ $login = htmlentities($_POST['account']); $pass = htmlentities($_POST['password']); $pass2 = htmlentities($_POST['password2']); $email = htmlentities($_POST['email']); $error = false; $errormsg = ""; $query = mysqli_query($link, "SELECT `id` FROM `account` WHERE `username`='{$login}' LIMIT 1"); $numrow = $query->num_rows; if ($numrow == 1){ $error = true; $errormsg .= 'Такой аккаунт уже есть.<br><a href="reg.php">еще раз?</a>'; } if (!preg_match("/^[a-zA-Z0-9_]+$/", $login) && strlen($login) >= 3) { $error = true; $errormsg .= 'Логин слишком короткий.<br><a href="reg.php">еще раз?</a>'; if (!preg_match("/^[a-zA-Z0-9]+$/", $pass) && strlen($pass) >= 3 ) { $error = true; $errormsg .= 'Пароль слишком короткий.<br><a href="reg.php">еще раз?</a>'; if ( !preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', (string) $email) ) { $error = true; $errormsg .= 'Емайл введён не верно.<br><a href="reg.php">еще раз?</a>'; if($pass !== $pass2){ $error = true; $errormsg .= 'Пароли не совпадают.<br><a href="reg.php">еще раз?</a>'; } } } } if(!$error){ $login = strtoupper($login); $pass = sha1(strtoupper($login) .':'. strtoupper($pass)); $query = mysqli_query($link, "INSERT INTO `account` SET `username`='{$login}', `sha_pass_hash`='{$pass}', `email`='{$email}'; "); $result = $link->query($query); echo "Успешно"; }else{ echo "Ошибка: ".$errormsg; } } $link->close(); //отключение от базы данных ?> Добавлено спустя 4 минуты 20 секунд: Дальше сами справитесь?)
Оно то конечно помогло) но теперь пароль даже одно\двух символьный проходит) что то странное творится
Код (Text): <?php $_config = array ( // DB settings 'host' => 'localhost', // адрес БД 'user' => 'root', // логин к БД 'pass' => '', // пароль к БД 'port' => '3306', // порт к БД 'dbname' => 'auth', // база ); $tbc = 2; $database_encoding = 'UTF8'; $link = new mysqli($_config['host'], $_config['user'], $_config['pass'], $_config['dbname']); if ($link->connect_error) { die($str_error_2); } if(empty($_POST)){ echo " <center> <form method=post action='/reg.php'> <table> <tr> <td>Login: <Br> <input type=text name=account maxlength=20></td> </tr> <tr> <td> Password:<Br> <input type=password name=password maxlength=20></td> </tr> <tr> <td> Confirm Password: <Br> <input type=password name=password2 maxlength=20></td> </tr> <tr> <td> e-mail:<Br> <input type=text name=email maxlength=32></td> </tr> <tr> <td colspan=2 style=\"text-align: center;\"><br><input type=submit value=Зарегистрироваться></td> </tr> </table> </form></center>"; }else{ $login = htmlentities($_POST['account']); $pass = htmlentities($_POST['password']); $pass2 = htmlentities($_POST['password2']); $email = htmlentities($_POST['email']); $error = false; $errormsg = ""; $query = mysqli_query($link, "SELECT `id` FROM `account` WHERE `username`='{$login}' LIMIT 1"); $numrow = $query->num_rows; if ($numrow == 1){ $error = true; $errormsg .= 'Такой аккаунт уже есть.<br><a href="reg.php">еще раз?</a>'; } if (!preg_match("/^[a-zA-Z0-9_]{3,20}$/", $login)) { $error = true; $errormsg .= 'Логин слишком короткий.<br><a href="reg.php">еще раз?</a>'; if (!preg_match("/^[a-zA-Z0-9]{3,20}$/", $pass)) { $error = true; $errormsg .= 'Пароль слишком короткий.<br><a href="reg.php">еще раз?</a>'; if ( !preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', (string) $email) ) { $error = true; $errormsg .= 'Емайл введён не верно.<br><a href="reg.php">еще раз?</a>'; if($pass !== $pass2){ $error = true; $errormsg .= 'Пароли не совпадают.<br><a href="reg.php">еще раз?</a>'; } } } } if(!$error){ $login = strtoupper($login); $pass = sha1(strtoupper($login) .':'. strtoupper($pass)); $query = mysqli_query($link, "INSERT INTO `account` SET `username`='{$login}', `sha_pass_hash`='{$pass}', `email`='{$email}'; "); $result = $link->query($query); echo "Успешно"; }else{ echo "Ошибка: ".$errormsg; } } $link->close(); //отключение от базы данных ?> А так?) Добавлено спустя 27 минут 49 секунд: Это странное зовется логическая ошибка). что надо было -> то мы обошли) Что получилось? Читаем алгоритм: Если логин не совпал с шаблоном регулярного выражения и длина логина больше или равна 3. мануал: Замечание: Функция strlen() возвратит количество байт, а не число символов в строке. Добавлено спустя 2 минуты 40 секунд: iconv_strlen (PHP 5) iconv_strlen — Возвращает количество символов в строке Описание ¶ int iconv_strlen ( string $str [, string $charset = ini_get("iconv.internal_encoding") ] ) В отличие от strlen(), iconv_strlen() учитывает кодировку строки. Длина строки не обязательно будет соответствовать количеству байт в ней, так как в различных кодировках различные символы кодируются различным количеством байт, например, юникод может быть и двух-, и четырёхбайтным. Добавлено спустя 3 минуты 11 секунд: также учтите что при попытке набрать запрещенные символы в логине или пароле сообщение будет аля логин/пароль слишком короткий
совет: не ограничивай длину пароля. пароль это личное дело пользователя. ты можешь дать рекомендацию что считаешь пароль как ТЫ считаешь очень короткий, а пользователь с мыслями "да пошел ты" оставит паролем "1". и ты должен принять такое решение пользователя с мыслям "а. ну ок.". ты отвечаешь за целостность данных и их сохранность. защита учетной записи - личное дело пользователя. может он пароли хранит на бумажке прилепленной на мониторе - не важно тогда какая длина у пароля. то есть точно более нуля символов можно требовать. ну и ограничить допустим в 256 символов - здоровые люди будут всегда удовлетворены.
моя цель направить тс в нужном направлении, а не решить за него задачу, т.к. считаю таковой подход наиболее эффективным методом обучения)
maxmuha благодарю, ваш вариант помог, спасибо! Только можно в кратце объяснить что получилось, я так понял что мы убрали проверку длинны пароля, получается нас должны пускать даже если пароль будет равен одному символу, но как не странно метод работает
Код (Text): preg_match("/^[a-zA-Z0-9]{3,20}$/", $pass) шаблон этого регулярного выражения звучит так: pass может содержать прописные и заглавные латинские буквы, а также цифры, при этом длина pass от трех до двадцати символов. мой последний вариант длину логина и пароля проверяет в регулярном выражении, а не считает их отдельным методом. Если Вы хотите делать многоуровневую проверку с отдельными ошибками, например логин содержит недопустимые символы, логин слишком короткий и т.д. и т.п. , то этот алгоритм нужно доработать, а лучше написать другой. В Вашем скрипте недопустимые символы, как и их количество меньше трех, выдаст ошибку о коротком логине или пароле. Попробуйте сперва без php кода представить алгоритм программы. Хоть на листке бумаги написать, а потом уже свои мысли превратить в код.