Что то я буксую. Для начала выложу код Код (Text): <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <style type="text/css"> form,div{margin-left:20%;} </style> </head> <body> <? include 'i.php'; ?> </body> </html> i.php Код (Text): <? define('DB_HOST', 'localhost'); define('DB_LOGIN', 'root'); define('DB_PASSWORD', ''); define('DB_NAME', 'my_db'); $link = mysqli_connect(DB_HOST,DB_LOGIN,DB_PASSWORD,DB_NAME); function clearStr($data){//удаление тегов, пробелов и экранирование sql запросов global $link; return mysqli_real_escape_string($link, trim(strip_tags($data))); } $i = 0;//счетчик /*Проверка нажатия кнопки регистрация, если не нажата то выводится первая форма*/ if(!isset($_POST[reg])){ echo '<form method="post"> <p>Логин: <input type="text" name="login"></p> <p>Пароль: <input type="text" name="password"></p> <p> <button type="submit" name="reg">Регистрация</button> <button type="submit" >Вход</button> </p> </form>'; } else{ /*иначе выводим форму регистрации*/ if($_SERVER['REQUEST_METHOD']=='POST'){ $login = clearStr($_POST['login']); $password = clearStr($_POST['password']); $d = abs((int)$_POST['day']); $m = abs((int)$_POST['mouth']); $y = abs((int)$_POST['year']); if($d&&$m&&$y){/*Если дата заполнена*/ $y =(int)date('Y') - $y; if($y<5) {echo '<div>Вы слишком молод</div>';} elseif($y>150) {echo '<div>Вы слишком стары</div>';} //else echo '<div>Вам '.$y.' лет</div>'; } if($y>5&&$y<150){ //////проверка нажатия кнопки "Выход" if(!isset($_POST['ex'])){ echo ' <form method="post"> <p>'.$i.'<p> <p> <button type="submit" name="counter">+1</button> <button type="submit" name="ex">Выход</button> </p> </form>'; if(isset($_POST['counter'])){$i++;} } }else{ echo '<form method="post"> <p>Логин: <input type="text" name="login"></p> <p>Пароль: <input type="text" name="password"></p> <p>Дата рождения: <input type="text" name="day" value=""> <input type="text" name="mouth" value=""> <input type="text" name="year"value=""></p> <p> <button type="submit" name="reg">Регистрация</button> <button type="submit" >Вход</button> </p> </form>'; } } } Изучаю щас MySQL, понял как создавать базу, таблицу, через PHP отправляю запросы. Но не могу сообразить как отслеживать нажатие кнопок. Понятно когда всего одна кнопка и при ее нажатии что то происходит, как в примере https://php.net/manual/ru/tutorial.forms.php . Но если кнопки две одна регистрация другая вход, то как лучше определять что было нажато? Просто if 'ом как у меня if(!isset($_POST[reg])) ?И из-за этого не могу понять как обработать кнопку "+1". Закинуть ее в цикл? А какое тогда условие выхода? Вообщем вопросов куча, если будет время ответьте пожалуйста. И понять защиту от двойной отправки тоже мозгов пока не хватает)) Но это я оставлю на потом, сначала просто отправить бы.
html-теги для базы безопасны. Пробелы из пароля удалять тоже не надо - вот как пользователь его ввёл, так он и должен быть. Фактически, перед передачей в базу нужен только mysqli_real_escape_string. Чтоб потом при выводе логин ничего не поломал в вёрстке содержащимися в нём скриптами, надо будет пропустить через htmlspecialchars
Спасибо Fell-x27 за задание. Вот попробовал выполнить. Результат здесь http://funprog.pp.ua/tz/. Сам код в трех файлах здесь: https://github.com/oleksandr7/test_task На написание ушло три вечера. Может немного сумбурно. Оцените, пожалуйста. С ув., Александр
oleksandrk, попытался зарегистрироваться - получил Код (Text): Fatal error: Call to a member function fetch_all() on a non-object in /home/blaknews/funprog.pp.ua/www/tz/register.php on line 82 помимо сообщения о том, что возраст слишком маленький. Такого быть не должно. Потом, у Fell-x27 написано, что надо вводить дату, а не год рождения. Т.е. день, месяц, год. Смысл в том, что при проверке возраста, видимо, не плохо бы учесть именно возраст человека на данный момент. Отладочную печать уберите. Добавлено спустя 3 минуты 6 секунд: СОздавать таблицы через php-код, имхо, в данном случае не стоит. Mysqli и плейсхолдеры радуют. Защиту от повторной отправки вижу.
Ну поехалей, зеленое то, что принял по ТЗ заказчик, красное то, что не принял: 1) Запили страничку, посередине которой форма входа с полями под логин и пароль. 2) Под ней кнопки "зарегаться" и "войти". 3) Для регистрации пользователь должен указать ник, парольку, дату рождения, это уже другая форма, как можно догадаться. 4) Если возраст пользователя окажется меньше, ну пусть, 5 лет, при попытке реги пользователю надо вывести сообщение "Too young!", над формой входа. Если окажется больше 150, то "Too old!" там же. 5) Если все ок, то, форма меняется на огромное число "0", а кнопки меняются на "+1" и "Выход". 6) По клику на кнопке "+1" огромное число "0" должно увеличиться на единичку. 7) По клику на "Выход" пользователя должно разлогинить. 8) После разлогинивания пользователь может войти на страничку со счетчиком, введя свои учетные данные. 9) Счетчик при этом должен быть равен последнему значению, которое тот накликал. У каждого пользователя свой персональный счетчик. 10) Запрещено использовать JS, все должно обрабатываться только через сервер. 11) Хранить данные в БД или на файлах - твое дело. Но, рекомендуется, в БД. 12) Требований по стилям нет - главное, чтобы работало как описано ну и чтобы все, что помечено "посередине страницы" таки висело посередине страницы. Разбор: Пункт 3 не принят, потому что вводить нужно дату, а не год рождения. Именно дату. Пункты 4 - 9 не приняты, потому что при нажатии на любую кнопку мы просто получаем ошибку - проект нерабочий. Пункты 11 и 12 не оговорены точно в ТЗ, по ним оценка, по понятным причинам, не ставится. Пока что не зачет. Добавлено спустя 4 минуты 42 секунды: Умолчим про то, что у тебя там для SQL-инъекций простор нереальный. Ничего не защищено. В общем, не спеши лучше. Посиди, поотлаживай, никто не подгоняет.
в случае неудачи запроса https://github.com/oleksandr7/test_task/blob/master/index.php#L47 эта строчка кода выведет фатальную ошибку https://github.com/oleksandr7/test_task/blob/master/index.php#L53 впрочем пока и у меня не вышло зарегаться
вот сделал процедурный вариант задания https://github.com/murad0587/test посмотреть можно тут http://mahmuzar.ru/ Добавлено спустя 6 минут 20 секунд: тестировался в браузерах: "Опера", "FireFox", "google", "yandex". В Internet Explorer не проверял, на win 10 стоит, но она какую то ерунду показывает подумал что из-за тестовой винды так, и забил.
Ganzal, а мне вот приходилось для яндекса корректировать вёрстку, когда в хроме она нормально отображалась. Но я сейчас уже сразу заказчикам говорю, что под каждую из существующий переделок хромиума я тестировать не собираюсь. А то и у ucoz своя имеется, и у mail.ru, может ещё несколько тыщ.
mkramer, никогда б не подумал что яндекс вносят изменения в базовый движок рендера. как бы хромиум и хромиум =) буду знать на всякий случай
ИЕ например, у меня стоит тестовая win 10 и ИЕ ерунду какую то выдает, сайт вообще падает то работает. Так вот поэтому опустил тесты на нем.
1)Что значит "процедурный"? 2)Я только что зарегал пользователя, который родился 99 числа 99 месяца 1990 года. 3)Жмакаю на +1 и ничего не происходит Добавлено спустя 1 минуту 6 секунд: 4) Слово "латИнские" пишется через "И"
не оопешный. Так не должно было прокатить, и у тебя там дата по нулям стояла) Оказалось функция формирования даты с ошибкой была, неправильно прописал имя перменной, поэтому не сработала защита). Исправил. Это потому, что я рано прервал подключение к бд сразу после добавления пользователя, а там еще и счетчик надо было создать. Исправил. Исправил)
Ну теперь нарекание лишь в том, что оно прожевало 999 день и месяц и не заругалось. Опять. З.Ы. Раз уж хочется практики, теперь бонусом попробуй прикрутить AJAX Можно JQuery-вый, пофигу вообще Чтобы циферка обновлялась без перезагрузки страницы. Ща еще код гляну. Добавлено спустя 10 минут 43 секунды: По коду есть 2 замечания: 1) Проверку на существование POST-а логичнее вынести из самих функций в код, где они вызваются. Чтобы, при чтении, сразу было понятно, что они вызываются только при таком-то условии. Во-первых это логичнее смотрится, во-вторых, у тебя сейчас впустую происходит вызов функции, по сути, если нет POST-а, потому что проверка идет внутри самой функции. Это оверхеды. Спичечные, в данном случае, но оверхеды. Если вынести проверку из тела функции в вызывающий код, решишь разом обе проблемы. 2) При соединении с БД, сразу указывай базе, в какой кодировке собираешься с ней вести беседу. Я понимаю, что у тебя и там и там одно и то же, и проблем быть не должно, НО, без явного указания кодировки, твои вызовы real_escape_string не защитят тебя от инъекции второго порядка. Кодировка указывается через mysqli.set-charset, вот.
Тема хорошая. Предлагаю сделать её закреплённой. ЗЫ Сам хочу проверить свои силы, но всё руки не доходят.
Никак, он спамер. Я теперь буду ему по одному ворнингу давать за каждое вот такое вот сообщение, которое не несет никакой полезной нагрузки, кроме форса ссылочек в подписи и инфо. Хз, правда, сколько тут нужно ворнингов до бана, заодно и узнаем-с.
А ты жесток) Добавлено спустя 1 минуту 19 секунд: А вообще, я даже попытался сравнить фотки его и не-знаю-можно-ли-имя-его-называть-рашука. Так, на всякий случай.