За последние 24 часа нас посетили 9173 программиста и 423 робота. Сейчас ищет 131 программист ...

Задания для новичка

Тема в разделе "PHP для новичков", создана пользователем kentkent7, 13 сен 2017.

  1. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    44
    Симпатии:
    4
    Всем доброго дня!

    Люди добрые, можете написать заданий для новичка.
    А я хочу попробовать их выполнить, а если что-то получится, я скину и меня закидают помидорами :)
     
  2. MouseZver

    MouseZver Старожил

    С нами с:
    1 апр 2013
    Сообщения:
    2.935
    Симпатии:
    455
    Адрес:
    Лень
    попробуй написать безопасную загрузку изображений, с проверками и прочими. Процедурным кодом, функции и условия только.
     
  3. romach

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

    С нами с:
    26 окт 2013
    Сообщения:
    1.699
    Симпатии:
    267
    @Fell-x27 сделал однажды подобное задание. Найди его. Заодно выполнишь тест на главный скилл программиста - умение находить ответ по минимальному набору вводных данных )
     
  4. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    44
    Симпатии:
    4
    Я знаю где искать))
    MouseZver скидывал 1 месяц назад ссылку на свое решение, просто я мучаю свою голову уже 6 часов :)
    Хочу сам додуматься, развиваю скилл мышления ;)
     
  5. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    10.328
    Симпатии:
    1.225
    Адрес:
    :сердА
    А в чем проблема? Ну возьми и сделай сам. Сам спроектируй, сам напиши. Мы ведь об одном и том же говорим, верно?
     
  6. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    44
    Симпатии:
    4
    Да, я просто туплю :)
     
  7. MouseZver

    MouseZver Старожил

    С нами с:
    1 апр 2013
    Сообщения:
    2.935
    Симпатии:
    455
    Адрес:
    Лень
    свой самопис роутер
    --- Добавлено ---
    с единой точкой входа
     
  8. xaker01

    xaker01 Новичок

    С нами с:
    16 апр 2016
    Сообщения:
    167
    Симпатии:
    28
    Может себе бесплатного помощника взять в помощь, и научить чему то... ?)
    Хотя опять же в данном случае скилл думать не будет, просто будешь клепать код по входным данным.
     
  9. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    44
    Симпатии:
    4
    Всем привет)
    Творение мое жестоко и беспощадно, но лучше все же чем ничего :)

    Код (Text):
    1.  
    2. class UserFile {
    3.     public $name;
    4.     public $defaultDir;
    5.     public $baseDir;
    6.    
    7. public function GetFile () {
    8.  move_uploaded_file($this->defaultDir,"$baseDir $this->name ");
    9. }
    10. }
    11.  
    12. $type  = ['image/jpeg', 'image/png'];
    13. if (in_array($_FILES['photo']['type'], $type)) {
    14.  
    15. } else {
    16.      $_FILES['photo']['error'] = "Невернй формат";
    17. }
    18.  
    19. if ($_FILES['photo']['size'] > 524288) {
    20.     $_FILES['photo']['error'] = "Размер файла неболее 0.5 mb";
    21. }
    22.  
    23.  
    24. $photo = new UserFile;
    25. $photo->name = $_FILES['photo']['name'];
    26. $photo->defaultDir = $_FILES['photo']['tmp_name'];
    27. $photo->baseDir = __DIR__;
    28.  
    29. if (empty($_FILES['photo']['error']) && is_uploaded_file($_FILES['photo']['tmp_name'])) {
    30.     $photo->GetFile();
    31.    
    32. }
     
    TeslaFeo нравится это.
  10. mkramer

    mkramer Старожил

    С нами с:
    20 июн 2012
    Сообщения:
    4.476
    Симпатии:
    691
    @kentkent7, а этот класс нафига, если всё клиент делает? Ради одной функции в одну строчку длиной целый класс городить? Засунь уж тогда все проверки внутри класса. К примеру, чтоб я вызывал:
    PHP:
    1. $fileUpload = new FileUpload($_FILES["photo"], "/storage");
    2. try {
    3.     $uploadedPath = $fileUpload->doUpload();
    4. } catch (FileUploadException $e) {
    5.     die("Ошибка загрузки файла " . $e->getMessage());
    6. }
    Слабо?
     
  11. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    314
    Симпатии:
    63
    Это не безопасная загрузка файлов. Я думаю, что я тебе в твою загрузку файлов смогу залить shell.php и получу доступ к твоему сайту. На практике не юзал, но уверен, что это легко!
     
  12. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    44
    Симпатии:
    4
    Я думаю реализация далеко не самая лучшая, но вот V 2.0 nub edition :)
    Код (Text):
    1. class UserFile {
    2.     public $name;
    3.     public $defaultDir;
    4.     public $baseDir;
    5.     public $type;
    6.     protected $size = 524288;
    7.     const TYPE = ['image/jpeg', 'image/png'];
    8.    
    9. public function GetFile () {
    10. move_uploaded_file($this->defaultDir,"$baseDir $this->name ");
    11. }
    12. public function FileValidate ($sizeFile, $filesError) {
    13.     if ($sizeFile > $this->size) {
    14.         $filesError = "Недопустимый размер файла";
    15.     }
    16.     if (!in_array($this->type, self::TYPE)) {
    17.         $filesError = "Недопустимый тип файла";
    18.     }
    19.     if (!is_uploaded_file($this->defaultDir)) {
    20.         $filesError = "Ошибка загрузки";
    21.     }
    22.     if (empty($filesError)) {
    23.         $this->GetFile();
    24.     } else {
    25.         return $filesError;
    26.     }
    27. }
    28. }
    29.  
    30. $image = new UserFile;
    31. $image->name = $_FILES['photo']['name'];
    32. $image->defaultDir = $_FILES['photo']['tmp_name'];
    33. $image->baseDir = __DIR__;
    34. $image->type = $_FILES['photo']['type'];
    35. $image->FileValidate($_FILES['photo']['size'], $_FILES['photo']['error']);
    --- Добавлено ---
    Какие есть замечания?
    Я тестил, через форму кроме картинок ничего не грузит, но я буду благодарен за любой совет ;)
    --- Добавлено ---
    А так, ловлю помидоры и делаю пасту :)
     
  13. mkramer

    mkramer Старожил

    С нами с:
    20 июн 2012
    Сообщения:
    4.476
    Симпатии:
    691
    Ты думаешь, что окромя как браузером, никак нельзя к тебе файл отправить? mime-тип надо ещё раз определить на сервере. Для картинок проще всего getimagesize дёрнуть на сервере, если не сработал - то плеваться.
    Ну опять клиентский код класса всё делает. Я же тебе показал, какой клиентский код должен быть. Вот попробуй сделать точно так же. Или ты про конструкторы не в курсах? Про исключения? Твоим классом пользоваться неудобно, а в мой предполагаемый - кинул элемент $_FILES и радуешься.
     
    Fell-x27 нравится это.
  14. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    44
    Симпатии:
    4
    Немного в курсе, но слабенько.
    Пойду великий гугл полистаю)
     
  15. mkramer

    mkramer Старожил

    С нами с:
    20 июн 2012
    Сообщения:
    4.476
    Симпатии:
    691
  16. Познающий php

    Познающий php Новичок

    С нами с:
    23 мар 2017
    Сообщения:
    314
    Симпатии:
    63
    Его тоже обмануть можно без труда. shell.php можно из реальной картинки же сделать ) МОжно дернуть getimagesize и пересохранить картинку с вернувшимся расширением, вроде уже прилично закроем дыру для картинок :D
    А вот с другими файлами. придется повозиться )
     
  17. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    114
    Симпатии:
    4
    Адрес:
    соседний двор
    Начну издалека.
    Вот смотрите, класс это набор функций (аналогия - конвейер по изготовлению автомобилей),
    экземпляр класса (объект) это уже изготовленный продукт, в данном случае автомашина. Да, все об этом в курсе.

    В классе прописаны разные методы (функции) которые делают всю работу. В случае конвейера это разные агрегаты на всем пути сборки/изготовления автомашины: какой-то агрегат приваривает что-то, какой-то прикручивает колеса и т.д.

    В некоторых ситуациях мы можем использовать эти функции в своих целях не создавая объекта (автомашину), т.е. взяли манипулятор какого-нибудь агрегата и сделали что-то с чем-то, нам незачем создавать новую машину, нам просто понадобилось использовать один из агрегатов этого автозавода. Это как раз отсылка сюда.

    Есть такой простой код:

    PHP:
    1. function doSomething(arg1, arg2) {
    2.      $result = arg1+arg2;
    3.      return $result;
    4. }
    Так вот вам нужно сделать из класса что-то наподобие этого. Т.е. класс будет принимать какие-то данные из вне и суметь делать с ним что-то.
    Это реализуется с помощью конструктора, что-то типа:

    PHP:
    1. class A
    2. {
    3.     public arg1;
    4.     public arg2;
    5.     public function __constructor(arg1, arg2)
    6.     {
    7.        $this->arg1 = arg1;
    8.        $this->arg2 = arg2;
    9.     }
    10.     // ну и далее делать что-нибудь со всем этим
    11. }
    В этом случае если вы попробуете просто создать экземпляр класса $a = new A(); , то интерпретатор заругается, типа "Ты вот создал во мне конструктор и сделал так что туда должны передаваться обязательные аргументы, ну и где они?". А когда вы сделаете вот так: $a = new A(arg1, arg2); то он удачно проглотит.

    В вашей ситуации вы должны работать с классом как с обработчиком, манипулятором и т.п. (вы туда что-нибудь закидываете и получаете какой-то результат), а не как с классом который создает объект и присваивает что-то свойствам этого объекта. Т.е. такая своеобразная вешалка для переменных и еще чего-нибудь.

    Надеюсь не перемудрил :)

    ЗЫ: Вот здесь можно посмотреть как человек создает класс и использует его, что называется на полную. И по назначению.
     
    #17 Dilon, 15 сен 2017
    Последнее редактирование: 15 сен 2017
  18. mkramer

    mkramer Старожил

    С нами с:
    20 июн 2012
    Сообщения:
    4.476
    Симпатии:
    691
    Для загрузки файлов можно создать вполне человеческий класс. в который закинул даже просто название поля и куда грузить - и он всё сделал. Зачем там недоклассы рисовать?
     
  19. Dilon

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

    С нами с:
    4 май 2014
    Сообщения:
    114
    Симпатии:
    4
    Адрес:
    соседний двор
    Конечно, вы абсолютно правы.
     
  20. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    44
    Симпатии:
    4
    Я с конструктором вроде разобрался, ка
    Код (Text):
    1. class FileImg {
    2.     public function __construct ($name, $loadDir){
    3.         $this->name = $name;
    4.         $this->size = $name . ['size'];
    5.         $this->type = $name . ['type'];
    6.         $this->tmp = $name . ['tmp_name'];
    7.         $this->error = $name . ['error'];
    8.         $this->loadDir = $loadDir;
    9.     }
    10. }
    Я конструктор вчера написал, сейчас изучаю безопасную загрузку и исключения.
    Я 2,5 месяца ток учу, многое не знаю, а знания не могу применить, вот так и живу :)
     
  21. Okto

    Okto Новичок

    С нами с:
    19 авг 2017
    Сообщения:
    4
    Симпатии:
    1
    Для прокачивания скилла программирования — добро пожаловать на hackerrank и codewars.

    Для прокачивания навыков веб-разработки — имхо, лучше всего пройти пару-тройку соответствующих курсов или туториалы по современным фреймворкам, для получения общей картины и систематизированного получения актуальной информации. Опять же, никто сейчас руками обработку форм загрузки писать не будет (хотя как это делается, знать конечно нужно), а корочка в резюме не помешает.

    Хорошие туториалы есть здесь:
    https://knpuniversity.com/search?q=php
    https://knpuniversity.com/tracks/symfony

    На курсере (https://www.coursera.org) и Открытом образовании (https://openedu.ru/) есть курсы по веб-разработке, но не на PHP. На гикбрейнсе есть https://geekbrains.ru/professions/php_developer, может ещё что-то.
     
    artoodetoo нравится это.