За последние 24 часа нас посетили 17347 программистов и 1672 робота. Сейчас ищут 1718 программистов ...

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

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

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Не, ну я ж не критикую) Это так, шутка юмора)
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Денисы повсюду :eek:
     
    TeslaFeo нравится это.
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Предложение растёт - спрос падает :D
     
  4. Frai

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

    С нами с:
    21 июл 2015
    Сообщения:
    102
    Симпатии:
    0
    В общем вот этот вот код нижеприведенный вставляется в пустой php файл и запускается на сервере в корневом каталоге.

    PHP:
    1. <?php
    2.  
    3. /**
    4.  * @author fomiash
    5.  * @copyright 2017
    6.  */
    7.  header("Content-Type: text/html; charset=windows-1251");
    8.  $bd_pass="<--xXx-->";
    9.  
    10.  $postValue=$_POST["input"];
    11.  $postExit=$_POST["exit"];
    12.  $loginValue=$_POST["login"];
    13.  $passValue=$_POST["pass"];
    14.  $dateValue=$_POST["date"];
    15.  
    16.  $thisPage = $_SERVER['PHP_SELF'];
    17.   $formReg=<<<_REG
    18.    
    19.   <form  id='form' method='post' action="$thisPage">
    20.   <div align=center>
    21.   <input id='login' name='login' type='text' placeholder='ник' value=''>
    22.   <input id='pass' name='pass' type='password' placeholder='паролька' value=''>
    23.   <input id='date' name='date' type='text' placeholder='дата рождения (xx.xx.xxxx)' value=''>
    24.   <button type='submit' name='input' value='set' >зарегистрироваться</button>
    25.   </div>  
    26.   </form>
    27.    
    28. _REG;
    29.  
    30.  
    31.   $formInput=<<<_INPUT
    32.   <div align=center>
    33.   <form  method='post' action="$thisPage">
    34.   <button type='submit' name='input' value='reg'>зарегаться</button>
    35.   </form>
    36.   <form  method='post' action="$thisPage">
    37.   <button type='submit' name='input' value='input'>войти</button>  
    38.   </form>
    39.   </div>  
    40. _INPUT;
    41.  
    42.  
    43.  
    44.   $formIn=<<<_REG
    45.   <div align=center>
    46.   <form  id='form' method='post' action="$thisPage">
    47.   <input id='login' name='login' type='text' placeholder='ник' value=''>
    48.   <input id='pass' name='pass' type='password' placeholder='паролька' value=''>
    49.   <button type='submit' name='input' value='enter'>войти</button>  
    50.   </form>
    51.   </div>  
    52. _REG;
    53.  
    54.  
    55.  
    56.  
    57.  if (isset($postExit)) { // выход из аккаунта
    58.    
    59.   $file = '.'.$_SERVER['PHP_SELF'];
    60.  
    61.   $current = file_get_contents($file);
    62.  
    63.   $current = str_replace($postExit, "EXIT_".str_shuffle($postExit), $current);
    64.  
    65.   file_put_contents($file, $current);
    66.    
    67.    
    68.    
    69.  } else if(!isset($postValue)){ // выбор между входом и регистрацией
    70.    
    71.    
    72.   addContent($formInput);
    73.    
    74.    
    75.  } else if ($postValue=='enter'){ // процесс авторизации
    76.   $array = file('.'.$_SERVER['PHP_SELF']);
    77.    
    78.   $len=count($array);
    79.    
    80.   for ($t=0; $t<$len; $t++){  
    81.    
    82.    
    83.   $stroke = explode($bd_pass, $array[$t]);
    84.    
    85.   if ($stroke[0]==$loginValue && $stroke[1]==$passValue ) {
    86.  
    87.    
    88.   $formClick = addPlusForm($stroke[3], $stroke[2], $thisPage );  
    89.    
    90.    
    91.   addContent($formClick);
    92.    
    93.   }  
    94.    
    95.   }
    96.    
    97.   addContent('<red>несовпадение ника и паролька</red>'.$formIn);
    98.    
    99.  
    100.  
    101.    
    102.    
    103.    
    104.  } else if ($postValue=='input'){ // форма входа
    105.    
    106.   addContent($formIn);
    107.    
    108.    
    109.  } else if ($postValue=='reg'){// форма регистрации
    110.  
    111.    
    112.   addContent($formReg);
    113.    
    114.    
    115.  } else if($postValue=='set'){ // проверка регистрационных данных
    116.    
    117.    
    118.   if(($loginValue)==''){  addContent('<red>не указан ник</red>'.$formReg);  }
    119.   if(($passValue)=='') {  addContent('<red>не указан паролька</red>'.$formReg); }
    120.   if(($dateValue)=='') {  addContent('<red>не указана дата рождения</red>'.$formReg); }
    121.    
    122.   if (!test5_150_str($loginValue) || !test5_150_str($passValue)) {  addContent('<red>от 5 до 150 символов</red>'.$formReg); }
    123.    
    124.   if (strpos($loginValue, '>') !== false || strpos($loginValue, '<') !== false ||  strpos($passValue, '>') !== false || strpos($passValue, '<') !== false){
    125.    
    126.   addContent('<red>недопустимые символы > < </red>'.$formReg);
    127.   }
    128.    
    129.   $year=explode(".", $dateValue);
    130.    
    131.    
    132.   if (!checkdate($year[1],$year[0],$year[2])){
    133.    
    134.   addContent('<red>неправильный формат даты</red>'.$formReg);
    135.    
    136.   }
    137.    
    138.   $array = file('.'.$_SERVER['PHP_SELF']);
    139.    
    140.   $len=count($array);
    141.    
    142.    
    143.   for ($i=0; $i<$len; $i++){  
    144.    
    145.    
    146.   $stroke = explode($bd_pass, $array[$i]);
    147.    
    148.   if ($stroke[0]==$loginValue) {
    149.    
    150.   addContent('<red>пользователь уже зарегистрирован</red>'.$formReg);
    151.    
    152.   }  
    153.    
    154.   }
    155.    
    156.    
    157.   $newsess="ZZZ_".rand(99, 99999999999999);
    158.    
    159.   $newuser=$loginValue.$bd_pass.$passValue.$bd_pass.$newsess.$bd_pass.'0'.$bd_pass;
    160.    
    161.   $fp=fopen('.'.$_SERVER['PHP_SELF'],"a");  
    162.   fwrite($fp, $newuser."\r\n");  
    163.   fclose($fp);
    164.    
    165.    
    166.    
    167.    
    168.   $now = new DateTime('now');  
    169.    
    170.   $interval = $now->diff( new DateTime($dateValue) );
    171.    
    172.   $itog = $interval->format('%y');
    173.    
    174.   if ($itog>150) {addContent('<b>Too old!</b'.$formReg);}
    175.    
    176.   if ($itog<5) {addContent('<b>Too young!</b>'.$formReg);}
    177.    
    178.   $formClick = addPlusForm('0', $newsess, $thisPage );  
    179.    
    180.   addContent($formClick);
    181.    
    182.    
    183.  } else if (isset($postValue) && $postValue!=''){ // вход в приватную часть со счетчиком
    184.    
    185.    
    186.   $array = file('.'.$_SERVER['PHP_SELF']);
    187.    
    188.   $len=count($array);
    189.    
    190.    
    191.   for ($i=0; $i<$len; $i++){  
    192.    
    193.    
    194.   $stroke = explode($bd_pass, $array[$i]);
    195.    
    196.   if ($stroke[2]==$postValue) {
    197.    
    198.   $newsess = "ZZZ_".rand(99, 99999999999999);
    199.    
    200.   $newnum = intval($stroke[3])+1;
    201.    
    202.   if($stroke[4]==""){
    203.    
    204.   $stroke[4]="\r\n";
    205.   }
    206.    
    207.   $array[$i] = $stroke[0].$bd_pass.$stroke[1].$bd_pass.$newsess.$bd_pass.$newnum.$bd_pass.$stroke[4];  
    208.    
    209.   }  
    210.   $newtxt.=$array[$i];
    211.   }  
    212.    
    213.    
    214.    
    215.   if($newnum==""){
    216.    
    217.   addContent($formInput);
    218.   }
    219.    
    220.   $formClick = addPlusForm($newnum, $newsess, $thisPage );
    221.    
    222.   $fp=fopen('.'.$_SERVER['PHP_SELF'],"w+");  
    223.   fwrite($fp, $newtxt);  
    224.   fclose($fp);
    225.    
    226.    
    227.    
    228.   addContent($formClick);
    229.    
    230.    
    231.  }
    232.  addContent($formInput); // все остальные действия
    233.  function addPlusForm($newnum, $newsess, $thisPage ){
    234.    
    235.    
    236.   $formClick=<<<_CLICK
    237.   <div align=center>
    238.   <H1>$newnum</H1>
    239.   <form method='post' action="$thisPage">
    240.   <button type='submit' name='input' value='$newsess'>+1</button>
    241.   </form>
    242.   <form method='post' action="$thisPage">
    243.   <button type='submit' name='exit' value='$newsess'>Выход</button>  
    244.   </form>
    245.   </div>
    246. _CLICK;
    247.    
    248.  return  $formClick;
    249.    
    250.  }
    251.  function test5_150_str ($str){
    252.    
    253.   $str = str_replace(array("\r","\n"),"",$str);
    254.    
    255.   if(strlen($str)>4 && strlen($str)<150 ){
    256.    
    257.   return true;
    258.   }
    259.   return false;
    260.    
    261.    
    262.  }//test5_150_str
    263.  
    264.  function  addContent($cont){  
    265.    
    266.   print <<<_CONT
    267.  <html>
    268.  <head>
    269.  <style>
    270.   html, body, form, h1, div, input, red { margin: 0; padding: 0; display: block}
    271.   red {color: red;}
    272.   input {width: 200px;}
    273.  </style>
    274.  </head>
    275.   <body style='width: 100%; height: 100%; position: relative; '>
    276.   <div style='border: 1px solid #cccccc; position: absolute; top: 50%; left: 50%;
    277.  transform: translate(-50%, -50%);
    278.  -webkit-transform: translate(-50%, -50%);
    279.  -moz-transform: translate(-50%, -50%);
    280.  -ms-transform: translate(-50%, -50%);
    281.  -o-transform: translate(-50%, -50%);
    282.  '>
    283.   $cont
    284.   </div>
    285.   </body>
    286.  </html>
    287. _CONT;
    288.  
    289. exit();
    290.    
    291.  }//addContent
    292. ?>
     
  5. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Код это здорово, но хотелось бы все же лафв-версию. Хоть на каком-нибудь бесплатном говнохостинге, но чтоб у себя не разворачивать. Тыжвебразработчик.
    --- Добавлено ---
    А чего не UTF-8 то?

    Код по качеству, на вскидку, ниже среднего. Но сначала запили лайв-версию, а там видно будет и проблемы рассмотрим, до каких дотянемся, как и способы их избежать.
     
  6. san4ez

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

    С нами с:
    13 авг 2016
    Сообщения:
    331
    Симпатии:
    47
    Тоже что ли попробовать.. Хотя рановато ещё мне наверное)
     
  7. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Однако, чую, надо свои курсы открывать :D
     
    SamyRed и san4ez нравится это.
  8. HeavyLady

    HeavyLady Новичок

    С нами с:
    7 дек 2016
    Сообщения:
    11
    Симпатии:
    4
    Пожалуй, тоже поробую на выходных. Пару месяцев уже занимаюсь пехэпэом время от времени! У-у-у!
     
  9. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Надеюсь ты не против, я развернул твой код на своём тестовом хостинге, получилось это http://frai.surikat-project.kl.com.ua/
    --- Добавлено ---
    С заданием, честно говоря, совпадений мало)
     
  10. Frai

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

    С нами с:
    21 июл 2015
    Сообщения:
    102
    Симпатии:
    0
    Спасибо, будет время можно добавить рейтинг, кто сколько накликал.
     
  11. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Щас сурикат обкакает как сможет этот проект))))
     
  12. 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) Требований по стилям нет - главное, чтобы работало как описано ну и чтобы все, что помечено "посередине страницы" таки висело посередине страницы.


    Итого...11 из 12, все не так плохо, я бы даже сказал - хорошо.
    Пункт 1 не принят, потому что не выполнен как таковой. Поля под логин и пароль должны быть видны сразу, а не находиться на другой странице, до которой еще один клик.

    Далее, проблемы реализации:
    1) Ввод даты. Та же ошибка что и у всех предыдущих исполнителей. В задании не просто так указан ввод даты рождения. Дата - это крайне геморройная тема. Под нее надо правильно организовать поле ввода, ее надо правильно обработать и вообще никто не любит дату. По этому она в задании специально используется. Ввод, который ты предложил - неудобный. Во-первых, ты указал формат хх.хх.хххх, так не делают. Первые два икса - это день или месяц? Обычно форматы даты пишут как dd.mm.yyyy или дд.мм.гггг, но все равно это не здорово. Пользователь должен вводить синтаксически корректную строку, в которой можно допустить ошибку. Я уже не раз говорил, делай как делают гугл, стим и прочие гиганты - под дату отводи три выпадающих списка. В одном 31 день, в другом 12 месяцев, в третьем - года, плюс минус сотня от текущего. Проверено, работает. На стороне сервера, разумеется, надо проверить, не ввел ли пользователь там 31 февраля или типа того. Но это не сложно. Переделай, пожалуйста, чтобы знать, как это работает.

    2) После получения ошибки Too Old/Too young сайт форма просто перестала реагировать. И при этом попытка регистрации прошла. Я понимаю, что явно не было написано, что регистрация должна заворачиваться, но, думал, что это понятно, иначе не было бы смысла выводить ошибку... Я, внесу это уточнение в текст задачи. Но тоже, было бы желательно, чтобы регистрация не проходила. У тебя там сейчас зареганы пользователи 1789 года рождения и 2017 соответственно. Ограничение по возрасту на то и ограничение, чтобы не допускать подобного.

    Код ревью - тут, увы, только завтра. Сегодня вечером нет времени.
     
  13. Frai

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

    С нами с:
    21 июл 2015
    Сообщения:
    102
    Симпатии:
    0
    Благодарю за разбор, по первому пункту каюсь - разделил по собственному алгоритму, как в ТЗ проще, собственно меня и заинтересовала идея сделать это максимально просто, по дате наверное так же пытался упростить, посмотрю, что можно сделать, просто не читал все обсуждение топика, где это уточняется, чтобы не наткнутся на уже реализованные варианты. Что касается возраста, то да, у меня это не ошибка, а сообщение, ошибки красным выводятся. Буду иметь ввиду.
     
  14. Frai

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

    С нами с:
    21 июл 2015
    Сообщения:
    102
    Симпатии:
    0
    Один момент непонятен - по какому условию задавать, что по возрасту не подошел, если в выпадающем списке я задам интервал от -5 до -150 лет. Специально увеличить интервал? Но это как то не интуитивно)
     
  15. Frai

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

    С нами с:
    21 июл 2015
    Сообщения:
    102
    Симпатии:
    0
  16. san4ez

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

    С нами с:
    13 авг 2016
    Сообщения:
    331
    Симпатии:
    47
    @Fell-x27 а разве в учете даты не должны сравниваться месяц и день? допустим я введу 10.10.2012 и проверка покажет что мне можно регаться, а по условию же нельзя, так как 4 года
     
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Всё равно реализуй проверку, мало ли что ты там в списке задал? Данные-то из вне приходят. Сурикат откроет инспектор объектов в браузере и твой списочек подредактирует :) Всегда на стороне сервера надо проверять, что приходит от клиента, даже если на клиенте стоит супер-пупер javascript-валидация

    Если ты не понял, смысл задания Суриката в том, что он взял самые типичные задачи, которые веб-программисту приходится решать каждый день и упростил их, чтоб не было лишних подробностей, а осталась только самая соль.
    --- Добавлено ---
    Должны. Класс DateTime php с этим прекрасно справляется.
     
    Fell-x27 нравится это.
  18. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Да, все так, как сказал @mkramer. И про проверку на сервере и про даты и про суть задачки.

    Я ведь в тз ничего не сказал про то, что проверять надо только год, верно? Проверять надо возраст. А как ты это сделаешь, вскроется в коде. По-правильному, подразумевается использование встроенных функций для работы с датой. К слову, пока что ни разу не видел, чтобы кто-то считал только года в чистом виде, а не по дате целиком. С датой обычно у всех проблемы только на уровне пользовательского ввода. В тз этот пункт явно не прописан. Но так и задумано. Зато потом будет понятнее, как с этим бороться. На грабли иногда надо наступить, чтобы потом о них помнить.
     
  19. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А можно выложить код без номеров строк? Чтобы можно было в IDE воткнуть.
     
  20. Frai

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

    С нами с:
    21 июл 2015
    Сообщения:
    102
    Симпатии:
    0
    Поправил
     
  21. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Так, ну..тут все совсем не так радужно, как снаружи. Для начала, попробуйте поставить в самое начало кода вот это
    PHP:
    Будете неприятно удивлены.

    У вас код, ориентированный на работу с register_globals. Но эта опция уже много лет как не используется, а в новых версиях попросту отсутствует, потому как создает дыру в безопасности.

    Далее, я уже спрашивал, а кодировка почему не UTF-8 то? :) UTF-8 наше все.

    На этом пока остановимся. Постарайтесь исправить все, чтобы никаких ошибок не всплывало. Для этого необходимо делать проверки на существование присваиваемых значений.
     
  22. Frai

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

    С нами с:
    21 июл 2015
    Сообщения:
    102
    Симпатии:
    0
    Обновил. Не совсем понял про register_globals, не указано в настройках сервера?
     
  23. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Что именно не понятно. Ты не знаешь что это, или не знаешь, почему не работает у меня?
    --- Добавлено ---
    А тестировать локально пробовал?
    Вот что у меня xDebug выдает. И такого добра там на семь экранов.
    upload_2017-2-5_20-12-40.png

    В какой версии PHP ты работаешь?
     
    igordata нравится это.
  24. Frai

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

    С нами с:
    21 июл 2015
    Сообщения:
    102
    Симпатии:
    0
    Выставляю в настройках обычно register_globals=off , насколько знаю - защищает от инициализации переменных извне без их явного обозначения в коде и защищает - проверял.
    Локально запускаю на Денвере, PHP 5 , вывод ошибок смотрю там-же. На сайте если выложено, то вывод отключен ошибок
    Но в целом интересно, о чем там эти семь экранов. Подозреваю, что не объявлен тип переменных и начальное значение, но насколько это нужно делать, если register_globals=off ? Кода меньше же
     
  25. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Денвер древний уже. И PHP там, по дефолту 5.1.12. Если с бубном потанцевать, будет 5.3 но 5.3 тоже очень старая версия. Нужна минимум 5.6. А лучше 7. На винде это решается через OpenServer, но я советую попробовать развернуть окружение на линуксе в виртуалочке.
    Однако, у тебя каша.
    1) Нет типов в PHP. По крайней мере в PHP 5.1.12 точно. В седьмой версии они почти есть.
    2) Тут подозревать нечего, в ошибке ясным текстом написано, что у тебя беда из-за обращения к данным по несуществующему индексу. Ты открываешь страницу и сразу пытаешься что-то тянуть из $_POST, хотя никакого $_POST нет. Никто не посылал запрос. И у тебя, как следствие, идет попытка чтения несуществующей ячейки массива. PHP на это ругается. Это надо исправлять.
    3) Это нужно делать. Отключенный регистр глобалс это хорошо, но в коде не должно быть ошибок, предупреждений и нотисов. Некоторые пренебрегают теми же нотисами, некоторые втыкают @ везде и всюду и типа все ок. Но это хреновый стиль. Проблемы нужно решать, а не закрывать на них глаза. Так что решай.
    4) Количество кода никак не связано с его качеством или с грамотностью программиста. Кода должно быть столько, сколько нужно, а не "чем меньше, тем лучше". Не гонись за этим. Более того, если тебе нужна избыточность для улучшения понимания того, что ты делаешь, пили избыточность. Не можешь сходу читать тернарные операторы? Пили if...else, даже ради одной переменной. В коде образовалась сложная конструкция из нагромождения вызовов всякой хрени? Дели ее на логические части, каждую часть присваивай переменной, потом оперируй этими переменными. Этого не надо стесняться. Код должен быть поддерживаемый и читабельный. И, в первую очередь, для тебя самого.