Задать вопрос
  • Какой посоветуете IDE в 2017 году для Html 5, Css 3, PHP 7?

    @D3lphi
    PHPStorm (Да и вообще, все IDE от JetBrains) - Одно из лучших, что есть в этом мире, поверьте. Используйте его и получите еще больше удовольствие от разработки. Правда, она не бесплатная, но можно получить бесплатно, если вы студент, например.
    Ответ написан
    Комментировать
  • Как быть с базой данных в GIt?

    @D3lphi
    Хочу понять, как работать и использовать GIT, чтобы база данных, которая обновляется на продакшене, на локальной машине была тоже в актуальном состояние, с одной команды в консоли, как в случае с файлами.

    Это шутка такая или что? Вы на продакшене сервере обновляете базу данных без тестирования оной на локальных машинах? Вот прям берете и вносите изменения на пофиг?

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

    Пример файла миграции фреймворка Laravel.
    Ответ написан
    1 комментарий
  • Как работать с куки?

    @D3lphi
    Потому что куки устанавливаются по средствам отправки заголовков ответа. Заголовки отправляются перед тем, как вы выводить что-то (через echo, например). $_COOKIE же в свою очередь заполняется при получении заголовков запроса. То есть, до начала выполнения кода. Таким образом, получается, что этот массив во время выполнения скрипта первый раз пуст.

    Получается такая схема:

    Первое выполнение скрипта:
    1) Приходят заголовки запроса (Куки отсутствуют)
    2) куки отсутствуют -> массив $_COOKIE пуст
    3) Устанавливаем куки (массив $_COOKIE все еще пуст)
    4) Отправляем заголовки ответа (массив $_COOKIE пуст), устанавливаем куки на клиенте

    Второе выполнение скрипта:
    1) Приходят заголовки запроса -> в них уже есть куки.
    2) $_COOKIE теперь содержат то, что мы установили во время выполнения предыдущего скрипта.
    ...
    Ответ написан
    6 комментариев
  • Если пользователь ввёл не правильные данные как попросить его ввести ещё раз?

    @D3lphi
    Консольное приложение? Цикл запускаете и выходите из него только если данные верны. Цикл do-while/while вам нужен.

    Как-то так:

    do {
        System.out.println("Введите данные: ");
    } while(!input());


    Или так:

    System.out.println("Введите данные: ");
    while(!input()) {
         System.out.println("Ошибочный ввод. Попробуйте еще раз: ");
    }


    private boolean input()
    {
        // Считываем данные, проверяем их на валидность и возвращаем true - если ввод валиден и false - если невалиден.
    }
    Ответ написан
    1 комментарий
  • Как создается SPA приложение с нуля по этапам, на примере Vue?

    @D3lphi
    Само SPA приложение делится на 2 основные части:
    1. Frontend - верстка, логика на vuejs, роутинг (vue-router).
    2. Backend - по сути, API к которому Frontend делает асинхронные запросы, получает данные и меняет представление соответствующим образом.


    Эти 2 составляющие пишутся отдельно (От слова "вообще").
    Ответ написан
    Комментировать
  • Как вызвать методы не создавая объект?

    @D3lphi
    Например, так:

    class Test
    {
        private $tableName;
    
        public function __construct($tableName)
        {
            $this->tableName = $tableName;
        }
    
        public static function table($tableName)
        {
            return new self($tableName);
        }
    
        public function delete()
        {
            // do something
        }
    }
    Ответ написан
  • Как включить документацию php в phpstorm?

    @D3lphi
    Она идёт с phpstorm по-умолчанию. Зажмите ctrl и щёлкните ЛКМ по названию(вызову) встроенной функции/метода/класса и тд. В phpstorm откроется документация об этом элементе.

    echo strlen('example'); // Щелкаем ЛКМ с зажатым ctrl по strlen и попадаем на страницу с информацией о данной функции.
    Ответ написан
  • Как в PHPStorm убрать лишний таб в массивах?

    @D3lphi
    59d5c1b11f72e830792204.png
    Поэкспериментируйте с этими значениями, чтобы вам было удобно.
    Ответ написан
    1 комментарий
  • Почему при подключение к бд выдает такую ошибку?

    @D3lphi
    Очевидно, что вы используете новую версию PHP, в которой удалено устаревшее расширение mysql_*.

    59d524cbef2e9198814401.png
    Ответ написан
  • Best Practice при работе с репозиториями в Laravel?

    @D3lphi
    Да, по реализации все верно вы себе представляете.

    Как все это смотрится с AR?

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

    В каждом из таких репозиторий будут повторяющиеся методы: all, find и прочие. Как быть в таком случае? Как вынести подобные методы в общий класс?

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

    Правильно ли я размышляю вообще?

    Да, по реализации все верно вы себе представляете.
    Ответ написан
    6 комментариев
  • Кто может дать комментарии по поводу кода PHP ООП (Code review)?

    @D3lphi
    Что-то многовато таких вопросов за последние пару дней. Часть замечаний к вашему коду есть в этом ответе. Повторюсь.

    Вы же сами написали:
    класс для работы с многомерными пользовательскими массивами

    но, тем не менее, этот класса делает все, что не лень:
    • Работает с этими самыми массивами
    • Соединяется с базой данных
    • Отправляет запросы к базе данных
    • Занимается обработкой данных

    Не многовато ли для одного класса?
    В итоге, мы получаем богообъект, который "умеет во всё".

    Что у вас за бред написан в методе getInstance()? Зачем бросать исключение, в случае, если инстанс уже был создан.

    if (self::$_instance === null) {
        self::$_instance = new self($id);
    } else {
        throw new Exception("Попытка повторного создания экземпляра Singleton класса");
    }
    return self::$_instance;


    То есть, у вас теряется весь смысл (анти)паттерна синглотон. Получается, я не смогу сделать так:

    $instance1 = treeData::getInstance();
    $instance2 = treeData::getInstance(); // Исключение!

    Есть логика? Я думаю, что нет.

    Почему вы храните данные для соединения с БД внутри метода? Не логично ли было бы передавать их в качестве аргументов к методам?

    Вы каждый раз повторяете строки с подготовкой запроса, биндингом параметров, отправкой запроса и тд. Не думали, что неплохо бы было написать какую-нибудь обертку и выполнять запросы как-нибудь так:
    $result = $wrapper->select("SELECT * FROM `tablename` WHERE `id` = :id", ['id' => 5]);

    ?


    Абстрактные исключения не бросаем! Создаем свои исключения и наследуемся от них. В своем коде используем только их, дабы можно было легко обработать нужные exception'ы. Текст исключения неплохо бы было писать на английском.

    Имена классов пишем с большой буквы! Скобки после методов и классов пишем на новой строке:
    function example() {
        // Не так
    }
    
    function example()
    {
        // А вот так
    }


    Предлагаю придерживаться общепринятым стандартам оформления кода.

    Старайтесь использовать синглтон в таком виде по минимуму (Или вообще не использовать). Тем более, в данном случае, он вообще не нужен.
    Ответ написан
    6 комментариев
  • Social NetWork | Как реализовать роутинг PHP?

    @D3lphi
    Чем маршрутизация для социальной сети принципиально отличается от маршрутизации интернет-магазина, например?

    Не нужно ничего реализовывать. Все уже сделали за вас. В интернете полно готовых роутеров. Вот, как вариант, "симфонический роутер".
    Ответ написан
    Комментировать
  • Насколько у меня правильный код ООП php?

    @D3lphi
    Здесь плохо всё, к сожалению.

    Начнем с того, что вы неверно наследуете классы. Почему у вас класс, отвечающий за подключение к базе данных является родителем класса, работающим с заказами? Наследование применяется, если можно сказать, что что-то является чем-то. Например, разработчик является работником; компьютер является устройством и тд. Здесь же у вас вообще близко такой логике не получится следовать. Вы должны передавать хотя бы объект для работы с бд через инъекцию, например, в конструктор. В идеале, нужно использовать паттерн репозиторий для работы с базой данных.

    Класс SearchOrder у вас не только выполняет запросы, но еще и работает с данными, хранит состояние этих самых данных, фильтрует данные (strip_tags()). Непорядок. Это все нужно разделять. У вас вообще получаются какие-то богообъекты, которые умеют во все.

    Вы каждый раз повторяете строки с подготовкой запроса, биндингом параметров, отправкой запроса и тд. Не думали, что неплохо бы было написать какую-нибудь обертку и выполнять запросы как-нибудь так:
    $result = $wrapper->select("SELECT * FROM `tablename` WHERE `id` = :id", ['id' => 5]);

    ?

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

    Зачем вы используете свойства, если можно обойтись обычными локальными переменными:
    $this->orderID = (int) strip_tags($orderID);
    $this->column = (string) strip_tags($column);
    $this->value = (string) strip_tags($value);

    ?

    Почему вы стриппите тэги у идентификатора? вы настолько не уверены в том, что влетает в функцию:
    strip_tags($orderID);
    ?

    Если вы не используете php 7 и, как следствие, скалярный тайпхинтинг, то должны делать проверки на тип входящего аргумента. Если что-то не так с типом, бросаем исключение (А не приводим его к нужному)! Например:
    if (!is_string($arg)) {
        throw new InvalidArgumentTypeException('string', $arg);
    }

    Это в идеале. Вы не обязаны это делать, конечно же. Но вот такие проверки делают приложение безопаснее. Хотя, опять же, повторюсь, в 2017 нужно начинать новые проекты на php 7.1+.

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

    Кроме всего прочего, почитайте про стандарты оформления кода. Вы им не следуете.

    Вам пока рано писать такие велосипеды. Судя по всему, у вас нет опыта вообще. Посмотрите готовые решения: фреймворки, ORM, изучите их, хотя бы поверхностно разберитесь, как оно работает и уже потом пробуйте что-то сделать, исходя из полученных знаний.

    Желаю успехов!
    Ответ написан
    1 комментарий
  • Потоковый JSON парсер, какой использовать?

    @D3lphi
    Стесняюсь спросить, json_decode() вас чем не устраивает?
    У меня на ПК обработка json-файла размером в 130 мб занимает чуть больше секунды.
    Ответ написан
    Комментировать
  • Как получить id вставленной в БД записи с помощью Eloquent в laravel?

    @D3lphi
    $auto = Auto::create([
        // ...
        'key1' => 'val1',
        'key2' => 'val2',
        // ...
    ]);
    
    User::create([
        // ...
        'auto_id' => $auto->id, // Ох уж это магия... Создайте лучше геттер.
        // ...
    ]);


    Или

    $id= Auto::insertGetId([
        // ...
        'key1' => 'val1',
        'key2' => 'val2',
        // ...
    ]);
    
    User::insert([
        // ...
        'auto_id' => $id,
        // ...
    ]);


    Можно связать "модели" отношениями и делать так:
    $user->auto()->attach($auto);
    Ответ написан
    4 комментария
  • Как вытащить число из строки на php?

    @D3lphi
    $json = json_decode("{\"response\":{\"post_id\":102}}", true);
    $result = $json['response']['post_id'];
    Ответ написан
    Комментировать
  • Как изменить длину от 8-и до бесконечности?

    @D3lphi
    (!preg_match('/^(?=.*\d)(?=.*[A-Z])(?=.*[a-z])[0-9A-Za-z_]{8,}$/', $_POST['password']))
    //                                                         /\ Не пишите конечное значение. Это будет означать "От 8 и до скольки угодно".
    Ответ написан
    Комментировать
  • На чем делать бету сайта?

    @D3lphi
    Пока рассматриваю Yii2 и Symfony2, т.к. больше особо ничего и не знаю :) Склоняюсь к yii, даже не знаю почему.
    Не знаю, стоит ли рассматривать Angular и т.п.?

    А почему вы ставите в один ряд Yii, Symfony и Angular (Который, вообще-то javascript фреймворк)? Судя по тэгам вопроса, вы будете использовать только php-фреймворк.

    Собственно вопрос в том, на чем можно реализовать и что будет лучше поддаваться масштабированию в дальнейшем? Что легче поддерживать и для чего будет проще найти специалиста? Возможно есть другие варианты?


    Ну смотрите:

    • Реализовать можно и на том и на том.
    • Проект будет быстрее реализован на Yii.
    • Поддаваться масштабированию будет лучше Symfony.
    • Поддерживать проект на Symfony будет легче.
    • Найти специалиста на Yii на порядок проще и дешевле.


    Если у вас намечается действительно что-то серьезное, то я бы порекомендовал писать это "что-то" исключительно на Symfony. Можете попробовать реализовать "черновик" (бету) на yii, laravel'е, это будет быстро и более дешево. Но опять же, повторюсь, сам проект лучше писать с использованием Symfony.
    А вообще, выбор технологий зависит от задачи. Вполне возможно, что вам гораздо больше подойдет что-то на javascript'е.
    Ответ написан
    1 комментарий
  • Где находятся файлы шаблона в Laravel?

    @D3lphi
    Шаблоны хранятся здесь: /resources/views.
    Какой именно шаблон вам нужен - никто не скажет. Мы здесь не экстрасенсы.
    Ответ написан
    Комментировать