За последние 24 часа нас посетили 17945 программистов и 1700 роботов. Сейчас ищут 1507 программистов ...

Как быстро освоить PHP

Тема в разделе "PHP для новичков", создана пользователем fenix_63, 16 мар 2015.

  1. franticstas

    franticstas Новичок

    С нами с:
    9 апр 2015
    Сообщения:
    8
    Симпатии:
    0
    Что то я буксую.
    Для начала выложу код
    Код (Text):
    1. <!DOCTYPE html>
    2. <html>
    3.     <head>
    4.         <meta charset="utf-8">
    5.         <style type="text/css">
    6.             form,div{margin-left:20%;}
    7.         </style>
    8.     </head>
    9.     <body>
    10.     <?
    11.     include 'i.php';
    12.     ?>
    13.     </body>
    14. </html>
    i.php
    Код (Text):
    1. <?
    2. define('DB_HOST', 'localhost');
    3. define('DB_LOGIN', 'root');
    4. define('DB_PASSWORD', '');
    5. define('DB_NAME', 'my_db');
    6. $link = mysqli_connect(DB_HOST,DB_LOGIN,DB_PASSWORD,DB_NAME);
    7.  
    8. function clearStr($data){//удаление тегов, пробелов и экранирование sql запросов
    9.     global $link;
    10.     return mysqli_real_escape_string($link, trim(strip_tags($data)));
    11. }
    12.  
    13. $i = 0;//счетчик
    14.  
    15. /*Проверка нажатия кнопки регистрация, если не нажата то выводится первая форма*/
    16. if(!isset($_POST[reg])){
    17.     echo '<form method="post">
    18.             <p>Логин: <input type="text" name="login"></p>
    19.             <p>Пароль: <input type="text" name="password"></p>
    20.             <p>
    21.                 <button type="submit" name="reg">Регистрация</button>
    22.                 <button type="submit" >Вход</button>
    23.             </p>
    24.         </form>';
    25. }
    26. else{
    27.     /*иначе выводим форму регистрации*/
    28.     if($_SERVER['REQUEST_METHOD']=='POST'){
    29.         $login = clearStr($_POST['login']);
    30.         $password = clearStr($_POST['password']);
    31.         $d = abs((int)$_POST['day']);
    32.         $m = abs((int)$_POST['mouth']);
    33.         $y = abs((int)$_POST['year']);
    34.         if($d&&$m&&$y){/*Если дата заполнена*/
    35.             $y =(int)date('Y') - $y;
    36.             if($y<5) {echo '<div>Вы слишком молод</div>';}
    37.             elseif($y>150) {echo '<div>Вы слишком стары</div>';}
    38.             //else echo '<div>Вам '.$y.' лет</div>';
    39.         }
    40.         if($y>5&&$y<150){
    41.             //////проверка нажатия кнопки "Выход"
    42.             if(!isset($_POST['ex'])){
    43.                 echo '
    44.                     <form method="post">
    45.                     <p>'.$i.'<p>
    46.                     <p>
    47.                         <button type="submit" name="counter">+1</button>
    48.                         <button type="submit" name="ex">Выход</button>
    49.                     </p>
    50.                     </form>';
    51.                     if(isset($_POST['counter'])){$i++;}
    52.             }
    53.         }else{
    54.         echo '<form method="post">
    55.             <p>Логин: <input type="text" name="login"></p>
    56.             <p>Пароль: <input type="text" name="password"></p>
    57.             <p>Дата рождения: <input type="text" name="day" value="">
    58.             <input type="text" name="mouth" value="">
    59.             <input type="text" name="year"value=""></p>
    60.             <p>
    61.                 <button type="submit" name="reg">Регистрация</button>
    62.                 <button type="submit" >Вход</button>
    63.             </p>
    64.         </form>';
    65.         }
    66.     }
    67. }
    Изучаю щас MySQL, понял как создавать базу, таблицу, через PHP отправляю запросы. Но не могу сообразить как отслеживать нажатие кнопок. Понятно когда всего одна кнопка и при ее нажатии что то происходит, как в примере https://php.net/manual/ru/tutorial.forms.php . Но если кнопки две одна регистрация другая вход, то как лучше определять что было нажато? Просто if 'ом как у меня if(!isset($_POST[reg])) ?И из-за этого не могу понять как обработать кнопку "+1". Закинуть ее в цикл? А какое тогда условие выхода? Вообщем вопросов куча, если будет время ответьте пожалуйста. И понять защиту от двойной отправки тоже мозгов пока не хватает)) Но это я оставлю на потом, сначала просто отправить бы.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    html-теги для базы безопасны. Пробелы из пароля удалять тоже не надо - вот как пользователь его ввёл, так он и должен быть. Фактически, перед передачей в базу нужен только mysqli_real_escape_string. Чтоб потом при выводе логин ничего не поломал в вёрстке содержащимися в нём скриптами, надо будет пропустить через htmlspecialchars
     
  3. franticstas

    franticstas Новичок

    С нами с:
    9 апр 2015
    Сообщения:
    8
    Симпатии:
    0
    исправил.
    А что с кнопками? можете подсказать?
     
  4. oleksandrk

    oleksandrk Новичок

    С нами с:
    23 апр 2015
    Сообщения:
    1
    Симпатии:
    0
    Спасибо Fell-x27 за задание. Вот попробовал выполнить. Результат здесь http://funprog.pp.ua/tz/.
    Сам код в трех файлах здесь: https://github.com/oleksandr7/test_task
    На написание ушло три вечера. Может немного сумбурно. Оцените, пожалуйста.
    С ув., Александр
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    oleksandrk, попытался зарегистрироваться - получил
    Код (Text):
    1. 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 и плейсхолдеры радуют. Защиту от повторной отправки вижу.
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ну поехалей, зеленое то, что принял по ТЗ заказчик, красное то, что не принял:

    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-инъекций простор нереальный. Ничего не защищено.
    В общем, не спеши лучше. Посиди, поотлаживай, никто не подгоняет.
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    в случае неудачи запроса
    https://github.com/oleksandr7/test_task/blob/master/index.php#L47

    эта строчка кода выведет фатальную ошибку
    https://github.com/oleksandr7/test_task/blob/master/index.php#L53
    впрочем пока и у меня не вышло зарегаться
     
  8. Scogzhe

    Scogzhe Зэк
    [ БАН ]

    С нами с:
    4 фев 2015
    Сообщения:
    109
    Симпатии:
    0
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    вот сделал процедурный вариант задания
    https://github.com/murad0587/test
    посмотреть можно тут
    http://mahmuzar.ru/

    Добавлено спустя 6 минут 20 секунд:
    тестировался в браузерах: "Опера", "FireFox", "google", "yandex".
    В Internet Explorer не проверял, на win 10 стоит, но она какую то ерунду показывает подумал что из-за тестовой винды так, и забил.
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    хром, лиса, хром, хром. плохо тестировал. ие например почему пропущен?
     
    Shkiper777 нравится это.
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ganzal, а мне вот приходилось для яндекса корректировать вёрстку, когда в хроме она нормально отображалась. Но я сейчас уже сразу заказчикам говорю, что под каждую из существующий переделок хромиума я тестировать не собираюсь. А то и у ucoz своя имеется, и у mail.ru, может ещё несколько тыщ.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    mkramer, никогда б не подумал что яндекс вносят изменения в базовый движок рендера. как бы хромиум и хромиум =) буду знать на всякий случай
     
  13. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    ИЕ например, у меня стоит тестовая win 10 и ИЕ ерунду какую то выдает, сайт вообще падает то работает. Так вот поэтому опустил тесты на нем.
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    1)Что значит "процедурный"?
    2)Я только что зарегал пользователя, который родился 99 числа 99 месяца 1990 года.
    3)Жмакаю на +1 и ничего не происходит :(

    Добавлено спустя 1 минуту 6 секунд:
    4) Слово "латИнские" пишется через "И" :)
     
  15. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    не оопешный.
    Так не должно было прокатить, и у тебя там дата по нулям стояла)
    Оказалось функция формирования даты с ошибкой была, неправильно прописал имя перменной, поэтому не сработала защита).
    Исправил.
    Это потому, что я рано прервал подключение к бд сразу после добавления пользователя, а там еще и счетчик надо было создать.
    Исправил.
    Исправил)
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ну теперь нарекание лишь в том, что оно прожевало 999 день и месяц и не заругалось. Опять.

    З.Ы. Раз уж хочется практики, теперь бонусом попробуй прикрутить AJAX :)
    Можно JQuery-вый, пофигу вообще :)
    Чтобы циферка обновлялась без перезагрузки страницы. Ща еще код гляну.

    Добавлено спустя 10 минут 43 секунды:
    По коду есть 2 замечания:
    1) Проверку на существование POST-а логичнее вынести из самих функций в код, где они вызваются. Чтобы, при чтении, сразу было понятно, что они вызываются только при таком-то условии. Во-первых это логичнее смотрится, во-вторых, у тебя сейчас впустую происходит вызов функции, по сути, если нет POST-а, потому что проверка идет внутри самой функции. Это оверхеды. Спичечные, в данном случае, но оверхеды. Если вынести проверку из тела функции в вызывающий код, решишь разом обе проблемы.

    2) При соединении с БД, сразу указывай базе, в какой кодировке собираешься с ней вести беседу. Я понимаю, что у тебя и там и там одно и то же, и проблем быть не должно, НО, без явного указания кодировки, твои вызовы real_escape_string не защитят тебя от инъекции второго порядка. Кодировка указывается через mysqli.set-charset, вот.
     
  17. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    спасибо, все исправлю.
    Ша попробуем))
     
  18. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Тема хорошая. Предлагаю сделать её закреплённой.
    ЗЫ Сам хочу проверить свои силы, но всё руки не доходят.
     
  19. Scogzhe

    Scogzhe Зэк
    [ БАН ]

    С нами с:
    4 фев 2015
    Сообщения:
    109
    Симпатии:
    0
    гугл и нотпад
     
  20. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    может чуть подробнее расскажешь как они относятся к освоению языка программирования? особенно иде.
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Никак, он спамер. Я теперь буду ему по одному ворнингу давать за каждое вот такое вот сообщение, которое не несет никакой полезной нагрузки, кроме форса ссылочек в подписи и инфо. Хз, правда, сколько тут нужно ворнингов до бана, заодно и узнаем-с.
     
  22. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Изменил на нотпад :D
     
  23. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а модификация сообщения на такое же бессмысленное считается новым сообщением?))))
     
  24. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    А ты жесток)

    Добавлено спустя 1 минуту 19 секунд:
    А вообще, я даже попытался сравнить фотки его и не-знаю-можно-ли-имя-его-называть-рашука. Так, на всякий случай. :)
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Он и без того уже собрал пять ворнингов. За один день. Еще не вечер.