За последние 24 часа нас посетили 17416 программистов и 1252 робота. Сейчас ищут 1546 программистов ...

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

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

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Фсьо. Мадыратары плахие. Закриваити тему. Низя тут обсуждать табуляцию. Фу, каки фсе хто апсуждал табуляцию. Ф бан фсих и миня и мадирав!!!
     
    san4ez нравится это.
  2. Mal4uk

    Mal4uk Новичок

    С нами с:
    15 фев 2017
    Сообщения:
    5
    Симпатии:
    1
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @SamyRed, ну серьезно. Не флуди. :). Тема полезная, а если обсуждать не по теме смысл теряется.
     
  5. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    @mahmuzar Да ладно, не буду) Я ж флудю только по теме)
     
  6. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Нет, такого требования, в общем-то нет. Делать надо так, чтобы работало. Несколько файлов? Значит несколько файлов. Одна точка входа с роутингом? Значит одна точка входа с роутингом.

    По сайтику:
    1) "Вы зарегесрированны" ну...это конечно дело не связанное с программированием, но "регистрация" пишется через "И" и "Т", а в суффиксе в данном случае нужна одна "Н".
    2) И да, положение не по центру страницы, а это оговорено в ТЗ отдельно.
    3) После регистрации пользователь ожидает, что его перенаправит на сайт и уже будет выполнен вход.
    Это тоже отдельно прописано в ТЗ:
    4) Огромного числа "0" нет, а должно быть. См выше.
    5)
    Ты же просто ограничил выбор года. А про 150 лет не просто так было сказано. Это задачка, а не реальный проект. Она не про здравый смысл, она про решение проблем. Конкретно в данном случае - на работу с датами.
    А еще на обработку входящих данных. Ты удивишься, но на сервере есть учетка с логином oldman. у которой год рождения -1000.
    Ограничение ввода в форме не является защитой. Это лишь удобство для пользователя, не более того. Никогда не доверяй входящим данным. Что интересно, при попытке регистрации с завышенной датой, ты обрабатываешь этот момент.
    6) Не сочти за придирку, но в ТЗ "Too old" и "Too young". Суть в том, что то, что написано в ТЗ, является догмой. Даже если похоже на балаган. Заказчик так просит, что поделать.. Попросит на иврите, значит надо на иврите.

    Пока так. Это желательно поправить, код пока не прошу.
     
  7. Сергей.Ш

    Сергей.Ш Новичок

    С нами с:
    17 фев 2017
    Сообщения:
    5
    Симпатии:
    0
    Код (Text):
    1.      <?php
    2.         if (isset($_POST['возраст'])<'5'){
    3.            echo"ты еще ребенок";
    4.        }
    5.           if (isset($_POST['возраст'])>'155'){
    6.            echo"вам поздно";    
    7.         }else{
    8.              <a href="z4.php">+1</a></a>}
    9.      ?>  
    Подскажите почему не работает этот кусок? .Спасибо.
     
  8. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    Потому что логики в нём ноль. Логики в нём 0, поскольку
    1. Он ожидает что из формы придёт возраст, а по ТЗ должна прийти дата рождения.
    2. Результат операции isset(), которая возвращает true или false, на кой-то чёрт сравнивается со строковой константой '5', а потом её же результат - с строковой константой '155'
    3. Даже если убрать isset, сравнение строки со строкой (а в $_POST тоже строки) даст неожиданный результат, поскольку при сравнении строк '2' > '155', в отличие от сравнения чисел, где 2 < 155 (разница видна, надеюсь)
    Вывод - задание от Суриката вам делать рановато. Разберитесь с основами.
     
  10. Сергей.Ш

    Сергей.Ш Новичок

    С нами с:
    17 фев 2017
    Сообщения:
    5
    Симпатии:
    0
    @denis01
    @mkramer
    Спасибо за опервтивный ответ ,буду разбираться в основах.
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @Сергей.Ш а еще из-за вставки html-кода прямо в php он вообще не запускается.
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    Я даже и не заметил :)
     
  13. Сергей.Ш

    Сергей.Ш Новичок

    С нами с:
    17 фев 2017
    Сообщения:
    5
    Симпатии:
    0
    @mkramer, я пишу не для того чтобы выпендрится или чтобы быстро сдать задание за счет кого то. Это нужно лично мне. Учу самостоятельно, преодолевая трудности. Может и взял на себя непомерное, но мне жизненно необходимо форсировать обучение, поэтому просьба , если есть желание подсказывать по существу( без ироний и т.д). Я частично разобрался с ошибками. Вот код переделанный. Но все равно он не так работает как надо. Не могу понять .
    Код (Text):
    1.            <?php
    2.         if (isset($_POST['age']) && $_POST['age']<5){
    3.            echo"ты еще ребенок";
    4.        }
    5.           if (isset($_POST['age']) && $_POST['age']>150){
    6.            echo"вам поздно";    
    7.         }else{
    8.              echo'<a href="z4.php">+1</a>';
    9.              }
    10.      ?>      
    одновременно с "ты еще ребенок"выпадает +1, ну и перебрасывает на эту страницу, чего не должно быть.
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну у тебя два ифа. Один отрабатывает. Конец первого ифа. А вот потом - отдельно второй отрабатывает, но попадает не в then, а в else часть. Но он же сам по себе существует. Вот и...
     
  15. Сергей.Ш

    Сергей.Ш Новичок

    С нами с:
    17 фев 2017
    Сообщения:
    5
    Симпатии:
    0
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    @Сергей.Ш ну не по вам задачка, что можно сказать по коду ещё? Почитайте книжку. К тому же, придумываете что-то, а не делаете то ТЗ, которое @Fell-x27 просил (вводится дата рождения, а программа самостоятельно высчитывает возраст). Потом, не надо писать сразу на PHP, нарисуйте блоксхему, на ней было бы видно, куда какие else надо ставить.

    Вообще, с этой задачки надо не начинать, ей надо завершать обучение. Фактически, если человек её более-менее правильно выполнил, он уже знает всё, что необходимо, по меньшей мере по PHP (как делается аутентификация и авторизация, как работать с базой, как обрабатывать формы и т.п.). Если до этой задачки не решён ряд элементарных, то начиная с неё вы не форсируете, вы замедляете обучение. Вот задачи уровня "только начал разбираться с php" (особенно, если до этого не было опыта на других языках, которого, честно говоря, по вашим ошибкам не видно): http://www.itmathrepetitor.ru/zadachi-po-php/
    --- Добавлено ---
    Да, по коду. Здесь уже много раз говорили: успешная отработка POST-запроса должна заканчиваться редиректом, а не выводом чегой-то в браузер пользователю. Это не обсуждается, это надо делать просто потому, что "так надо" (предотвращает повторную отправку данных, если пользователь нажмёт кнопку "обновить" в браузере)
    --- Добавлено ---
    Потом, ваша цепочка ифов никак не решает поставленной задачи, поскольку если скрипт только запущен, и на него не отправлены никакие данные, он радостно выдаст кнопку +1, даже если его исправить, как советует Игорь (поскольку isset($_POST["age"]) вернёт false, оба if-а не сработают. В общем ещё раз, начинайте с блоксхемы, а не кода.
     
    Fell-x27 нравится это.
  17. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Это вот, порой, рождает когнитивный диссонанс, мол, а что же делать, если результатом POST-запроса должен быть какой-то осмысленный ответ сервера, изменение на страничке здесь и сейчас, который не получить без этого запроса?

    Ответом является следующее: в таком случае вам нужен не POST, а GET-запрос. Названия POST и GET переводятся с английского. POST надо использовать, если для передаваемых данных применимо понятие "состояние". GET - если не применимо. Грубо, POST - это все, что должно быть сохранено, запощщено на сервер. Что будет обработано и к чему будет доступ и после редиректа. У чего есть состояние. GET-ами же мы посылаем stateless-инфу. Какие-то триггеры, идентификаторы, что-то такое, что страница должна обработать здесь и сейчас. В таком случае хранилищем состояния является, по-хорошему, адресная строка браузера. При обновлении страницы результат не будет меняться, страница будет той же, что и была, хотя при этом изменений на сервере нет - только реакция на GET-запрос. GET - получить. Ты как бы говоришь серверу, "дай мне то, что ты обычно даешь при таких вот входящих параметрах".
     
    mahmuzar и mkramer нравится это.
  18. Сергей.Ш

    Сергей.Ш Новичок

    С нами с:
    17 фев 2017
    Сообщения:
    5
    Симпатии:
    0
    mkramer, Fell-x27
    Спасибо, законспектировал ваши дельные советы ,спасибо за ссылку с задачками. Буду разбираться, надеюсь не раз вернусь к вашему форуму.
     
  19. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    Главное, если будете решать, не поленитесь и начните именно с пункта 1. Начиная с пункта 10 там есть задачи уже достаточно высокого профессионального уровня. Задачи пункта 1 можно прорешать за 1-2 дня, в принципе (это по поводу "форсировать обучение")
     
  20. HeuPoH

    HeuPoH Новичок

    С нами с:
    2 фев 2017
    Сообщения:
    16
    Симпатии:
    0
    Добрый вечер. Нашел вашу задачу через гугл, решил попробовать свои силы.
    http://teachphp.h1n.ru - вот пример.
    Ссылки на исходники:
    1) index.php - https://gist.github.com/HeuPoH/04e1bf24f118163331a43a56c0b19bb6
    2) reg.php - https://gist.github.com/HeuPoH/ad5e1f149c44125f3177ff1a31ccd9e6
    Код в head.php
    PHP:
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    2. <html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "ru">
    3. <head>
    4. <meta http-equiv = "Content-Type" content = "text/html; charset = utf-8">
    5. </head>
    6. <body>
    7. <div align = "center">
    8. <?php
    9. ?>
    Код в core.php
    Код (Text):
    1. <?php
    2. $conf = parse_ini_file('config.ini', true);
    3. $mysqli = mysqli_connect($conf['mysqli_host'],$conf['mysqli_user'],$conf['mysqli_password'],$conf['mysqli_database']) or mysqli_error($mysqli);
    4. ?>
    У кого есть время и знания, прошу оцените проделанную работу. А да, с css не дружу, поэтому стилей вообще нет(
     
  21. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.584
    Симпатии:
    1.762
    Ну у тебя не по центру, это уже немного нарушение ТЗ. Но не сильное. Теперь более тонкая критика.
    Что хорошо:
    • всё правильно экранировано, насколько я увидел (может кто-то заметит), традиционного бреда по htmlspecialchars в качестве защиты от инъекции нету. htmlspecialchars использован, как полагается при выводе
    • Везде после отработки POST стоят редиректы
    Что мне не понравилось:
    • Очень неаккуратное форматирование кода, нету отступов после каждой {
    • Возраст логично проверять после того, как проверил, что введена конкретная дата
    • Не понял, зачем был использован токен при регистрации. Так, ненужное поле, ничего не даёт.
    Теперь о самой проверке:
    PHP:
    1.     if($date[2] - $_POST['year'] < 5 && $date[1] >= $_POST['month'] && $date[0] >= $_POST['day']) $err[] = 'Вы слишком молоды';
    2.     elseif($date[2] - $_POST['year'] > 150 && $date[1] >= $_POST['month'] && $date[0] >= $_POST['day']) $err[] = 'Вы слишком стары';
    3.     if(checkdate($_POST['month'], $_POST['day'], $_POST['year']) == FALSE) $err[] = 'Неверная дата';
    Вроде работает, но лучше всё-таки использовать стандартные функции php по работе с датами - там уже выверены все алгоритмы
     
    denis01 нравится это.
  22. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Вот она - слава. Все, теперь ко мне на кривой кобыле не подъехать, а обращаться можно исключительно "Мсье Сурикат" :D

    По делу:
    0) То, что написано выше.
    1) Таки не по центру, и форма как будто скопирована у предыдущего исполнителя "до винтика".
    2)
    upload_2017-2-24_20-47-3.png
    Для таких вещей, при редиректе используй метку в куки или GET_запросе, которая, при отрисовке страницы, скажет браузеру, что нужно маякнуть о проблемах. Это распространенная практика.

    3)
    PHP:
    1. unset($_SESSION['u_id']);
    2.         unset($_SESSION['u_token']);
    3.         session_destroy();
    Раз уж ты уничтожаешь сессию, убивать переменные в ней перед этим, не стоит. Ты все равно потом делаешь перенаправление, при следующем вызове переменные и так умрут.

    4) Хеширование пароля лучше сделать с использованием password_hash и password_verify.
    5) Ну и надписи не по ТЗ, заказчик придирается.

    В остальном все, в принципе, ок :)
    --- Добавлено ---
    P.S. Прикрутить чтоль каким-то боком ООП к заданию, а то пробел в этом плане имеется. Хотя, с другой стороны, оно, как таковое, тут и не особо нужно.. Да и слишком обширная тема для проверок знаний.
     
    denis01 нравится это.
  23. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Думаю лучше начать с рекурсии. Замыкания, генераторы.
     
  24. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Ну...на самом деле, для простейшей веб-разработки того, что есть в задаче - с избытком. Тут же только набор кейсов. А их решение - на совести авторов. Рекурсии, замыкания, генераторы это уже другая лига. И тут уже нужны чисто упражнения на данный инструментарий. Обход деревьев там, или реализация фабрик хитровыбоенных. Специфичные все же вещи.

    Где-то на сайте были обсуждения сериализованных представлений множеств, там вот просто раздолье для подобного рода инструментария. Упаковка деревьев в тот же Materialized Path с последующим восстановлением и пересчетом, например. Но это все тонкости знания языка. А текущая задачка - чисто на "сайтостроение".
     
  25. HeuPoH

    HeuPoH Новичок

    С нами с:
    2 фев 2017
    Сообщения:
    16
    Симпатии:
    0
    Спасибо за ответ, если не трудно можете привести какой нибудь правильно оформленный код или ссылку типа ГОСТа?
    на счет токена, в начальной версии у меня выход был в отдельном файл, и токен я передавал через гет, и в файле выхода я проверял токен, который передался через гет и токен юзера в базе. Остальные замечания буду исправлять) Спасибо еще раз