• Какие технологии использовать для разработки маркетплейса?

    dima9595
    @dima9595
    Junior PHP
    Тегов не маловато будет? (Сарказм) п. 3.1 почитайте!

    маркетплэйс для купли и продажи
    Что значит для купли и продажи? Вы сам маркетплейс будите продавать или товары в нём?

    Я не знаю за что браться?
    Если не знаете, то лучше и не суйтесь. Либо изуйчайте годика 2 программирование. А потом уже думайте о создании. Либо наймите специалистов. Сейчас их достаточно много в крупных городах.

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

    Интересуют бэк и фронт. Прям все что может касаться этого вопроса.
    Тут даже и не скажешь кратко. Слишком обобщённые требования.

    А если серьёзно: Разработка хорошо проработанного маркетплейса со всеми онлайн-кассами/чеками и т.п. стоит огромных денег и сил (человеко-часов). Так что с вашими знаниями "а на чём разрабатывать" вам явно подходит покупка какого-либо готового движка, либо заказ у крупной и компетентной веб-студии. Ну или на крайний случай - изучить всё с нуля и самому сделать (годиков через 3 примерно выйдет что нибудь).
    Ответ написан
    1 комментарий
  • Где научиться делать красивые сайты?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Дизайнер и фронтендер в общем то разные профессии . У эппла и Майкрософта есть примеры, как и у андроида. Изучайте их комбинируйте и все будет нормально.
    Ответ написан
    2 комментария
  • Не запускается сервис linux?

    @q2digger
    никого не трогаю, починяю примус
    Я в этих ваших дотнетах нифига не понимаю но откуда линуксу знать как именно запускать эту dll которую вы ему подсовываете в строке запуска. Где команда которая должна запускать эту dll ?
    Ответ написан
    3 комментария
  • Как правильно писать catch в php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для того чтобы правильно писать catch, надо писать осмысленный код.

    А здесь мы наблюдаем очаровательный пример карго-культа.
    Узнав, что "толстый контроллер - это плохо, а сервисы - это хорошо", автор небрежным движением руки замел весь мусор под ковёр перенёс весь код из контроллера в "сервис". Ну а что? Контроллер худой, весь код в сервисе!
    Тот факт, что сама кривая структура проекта осталась, по сути, той же самой, нас не смущает.
    Как и то, что сервис вдруг начал выполнять функции НТТР контроллера и кидать почему-то НТТР исключения. Что с этими исключениями делать в случае, если тот же сервис будет вызван из консольной команды - загадка.

    Но самое забавное, что при всём при этом контроллер всё равно пытается выполнять работу модели. Казалось бы, какое отношение интерфейс для обслуживания НТТР запросов имеет к транзакциям в базе данных? А вот поди ж ты!

    Чтобы сделать этот код осмысленным, контроллеру всё-таки придется потрудиться, и выполнить какую-то работу самому, а не перекладывать на "сервис". А так же отдать модели то что ей принадлежит.

    В общем транзакцию перекинуть в createDefault. причём не напрямую, а ещё ниже - в слой для работы с БД. Стартовать транзакцию до валидации данных - это как бы *не совсем логично*, мягко говоря. И в итоге, как по волшебству, весь этот говнокод исчезнет как страшный сон.
    При этом в параметрах передавать не НТТР реквест чохом, а осмысленный набор параметров, вынутый предварительно из реквеста!
    В частности, если модель сама проверяет права доступа, то и передавать ид пользователя из авторизации.

    При этом модель не должна кидать НТТР исключения. Она должна кидать исключения бизнес-логики. Которые контроллер уже может ловить и транслировать в хттп. Но тут видимо уже сложнее, поскольку это ж ларавель судя по всему.

    В любом случае, уж catch (Exception $e)-у тут точно не место

    Но это если рассматривать твой конкретный случай.
    В общем же случае правильный код написал Илья.

    То есть внутри трая операции с БД и коммит.
    в кетче роллбэк и перевыброс исключения. Только ловить надо Throwable

    try {
      DB::beginTransaction();
      // запись в БД
      // запись в БД
      // запись в БД
      DB::commit();
    } catch (\Throwable $e) {
      DB::rollBack();
      throw $e;
    }
    Ответ написан
    2 комментария
  • Какую операционную систему выбрать для веб-сервера?

    Jump
    @Jump
    Системный администратор со стажем.
    Какую операционную систему выбрать для веб-сервера?
    Любая из перечисленных подойдет. Выбирайте ту которую знаете, или чтобы по цвету к серверу подходила.

    которая будет жрать меньше ОЗУ.
    Крайне странный критерий для выбора ОС.
    Ответ написан
    Комментировать
  • Настройка Gulp. Не работает browserSync?

    @V0vash
    ReferenceError: wach is not defined


    exports.default = wach; <- ошибка
    
    
    exports.default = watch; <- не ошибка
    Ответ написан
    1 комментарий
  • Почему не запускается сайт html на nginx?

    dyuriev
    @dyuriev
    A posteriori
    погадал на гуще кофейной
    гуща говорит, что прав на каталог /sites у nginx нет - по этому и логи пустые, ибо писать туда тоже не может
    гуща из второй чашки говорит, что после правок nginx, вы забыли перезагрузить nginx
    гуща из третьей чашки говорит, что вы в браузере открываете сайт без указания порта 8080

    больше кофе я сегодня не выпью
    Ответ написан
    2 комментария
  • Почему нужно гуглить на английском?

    Объясните мне почему программист должен гуглить на английском?
    Вас кто-то заставляет? Не хотите — не гуглите. Возможные причины вы написали в вопросе.

    Ведь там все-таки хоть ты и знаешь английский, но русский то знаешь лучше, а значит на русском ты больше поймешь, чем на английском.
    Наоборот, удобнее оперировать терминами на одном языке и в программировании таким является английский. Мне проще искать на английском, чем пытаться сообразить, как перевести то, что мне нужно.
    Ответ написан
    Комментировать
  • В чем разница между undo commit, revert commit и reset branch to commit?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Там в меню вашей IDE есть ещё несколько методов откатить изменения.
    Это же JetBrains? Все способы подробно описаны в справке, например вот как в IntelliJ IDEA

    Reset удаляет все коммиты выше выбранного. Там предлагается четыре варианта этой команды. Отличия их в том, как поступить с изменениями в рабочем каталоге и в индексе.

    Revert не удаляет коммит, а создаёт новый, который описывает действия необходимые для отмены выбранного коммита.

    Undo позволяет отменить последний коммит. Но изменения коммита предлагает сохранить в новый changelist. Файлы в рабочем каталоге не изменятся и можно будет их подправить и заново закоммитить.

    Drop — удобная команда для удаления произвольного коммита из середины истории. Под капотом там на самом деле выполняется интерактивный rebase, но в автоматическом режиме.

    Revert Selected Changes напоминает Revert, но отменяет изменения отдельного файла, а не всего коммита. Эта команда доступна на Панели изменённых файлов.

    Get позволяет вернуть любой файл к состоянию на определённый коммит в истории. Выберем файл любым удобным способом и контекстное меню Git | Show History покажет все коммиты, в которых изменялся данный файл. Кликнув на нужном коммите правой кнопкой увидим команду Get
    Ответ написан
    Комментировать
  • Как сделать GIT репозиторий в другой директории?

    BorLaze
    @BorLaze
    Java developer
    репозиторий для нее нужно сделать в /home/project/git/

    а уже в ней public_htm?

    сделай, где тебе надо, а в /home/project сделай симлинк public_htm на нужный каталог
    Ответ написан
    1 комментарий
  • Как правильно определить, нужен ли префикс браузера в коде?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Как правильно определить, нужен ли префикс браузера в коде?

    Алгоритм:
    - Научиться пользоваться сборщиками проектов вроде gulp или webpack
    - Не нужно лезть руками на caniuse и искать каждое свойство, этим занимется плагин autoprefixer, который на автомате, в зависимости от настроек степени поддержки браузера будет ставить вам всё.
    60ae14f390712442537809.png

    https://webdesign-master.ru/blog/tools/gulp-4-less...
    Ответ написан
    Комментировать
  • Как добавить на один домен несколько сайтов?

    fleshherbal
    @fleshherbal
    субдомены, прочитайте про это
    Ответ написан
    Комментировать
  • Как сделать, чтобы при удалении записей остальные id записей начинались с 0?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак не делать .
    Этот вопрос очень часто задают новички, от непонимания базовых принципов

    Ид вообще никогда не надо трогать.
    Менять ид в базе это все равно что ученикам в классе каждый раз давать новые имена, чтобы они всегда сидели по алфавиту

    Либо тебе это поле вообще не нужно, и его надо убрать, либо просто оставь его в покое и никогда не трогай его руками
    Ответ написан
    1 комментарий
  • Покритикуйте код! Какие грубые и негрубые ошибки совершил?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну тут скорее ни одной почти строчки нормальной.
    • exit('Ошибка подключения к базе данных!'); дважды глупость. Пользователю сайта не интересно читать, что у тебя сломалось - база данных или деньги на пиво кончились. Как программисту, тебе эта бессмысленная фраза тем более бесполезна, она ничего не говорит о том, ЧТО КОНКРЕТНО сломалось, чтобы ты мог исправить
    • if ($numRows > 0) { бессмысленный кусок кода
    • while ($row = $result->fetch_assoc()) { заменяется на $result->fetch_all(MYSQLI_ASSOC)
    • $this->connect() коннектимся каждый раз, чтобы выполнить запрос, серьёзно?
    • А когда будет еще один класс, для другой таблицы, снова будешь писать код подключения к БД? И так в каждом?
    • Почему класс для работы с "позициями" называется DBh?
    • По сути это не класс, а набор функций. Если ты уберешь красивые слова class и this, то НИЧЕГО не изменится
    • SQL инъекции кругом
    • class Handler extends Dbh ВООБЩЕ непонятно зачем



    В общем, как-то так
    dbh.php
    class Dbh
    {
        public $conn;
    
        public function __construct($config)
        {
            mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
            $this->conn = new mysqli(...$config);
            $this->conn->set_charset('utf8mb4');
        }
    
        public function preparedQuery($sql, $params, $types = '')
        {
            $types = $types ?: str_repeat('s', count($params));
            $stmt = $this->conn->prepare($sql);
            $stmt->bind_param($types, ...$params);
            $stmt->execute();
            return $stmt;
        }
    
        public function selectResult($sql, $params, $types = '')
        {
            if (!$params) {
                return $this->conn->query($sql);
            }
            return $this->preparedQuery($sql, $params, $types)->get_result();
        }
        public function selectAll($sql, $params = [], $types = '')
        {
            return $this->selectResult($sql, $params, $types)->fetch_all(MYSQLI_ASSOC);
        }
        public function selectAssoc($sql, $params = [], $types = '')
        {
            return $this->selectResult($sql, $params, $types)->fetch_assoc();
        }
        public function selectRow($sql, $params = [], $types = '')
        {
            return $this->selectResult($sql, $params, $types)->fetch_row();
        }
        public function selectCell($sql, $params = [], $types = '')
        {
            $row = $this->selectRow($sql, $params, $types);
            return $row ? $row[0] : false;
        }
    }

    position.php
    class Position
    {
        protected $dbh;
    
        public function __construct(Dbh $dbh)
        {
            $this->dbh = $dbh;
        }
        // Получаем все позциии из БД и возвращаем их в массиве $output если записей больше нуля
        public function getAllPositions()
        {
            return $this->dbh->selectAll('SELECT * FROM positions');
        }
        protected function addPosition($content)
        {
            $count = $this->dbh->selectCell('SELECT count(*) FROM positions');
            if ($count < 10) {
                $this->dbh->preparedQuery("INSERT INTO positions (content) VALUES (?)", [$content]);
            }
        }
        protected function deletePosition($id)
        {
            $this->dbh->preparedQuery("DELETE FROM positions WHERE id = ?", [$id]);
        }
        //Поиск позиций в БД по столбцу content
        protected function searchPosition($content)
        {
            $content = "%$content%";
            return $this->dbh->selectAll('SELECT * FROM positions WHERE content LIKE ?',[$content]);
        }
    }

    config.php
    return [
          'db' => [
              'host' => '127.0.0.1',
              'username' => '',
              'password' => '',
              'dbname' => '',
              'port' => 3306,
          ],
      ];


    handler.php

    $config = require 'config.php';
    $dbh = new Dbh($config['db']);
    $position = new Position($dbh);
    
    switch ($_GET['action']) {
        case 'getpositions':
            $output = $position->getAllPositions();
            echo json_encode($output);
            break;
        case 'addposition':
            $content = $_GET['content'];
            $position->addPosition($content);
            break;
        case 'getsearchpositions':
            $content = $_GET['content'];
            $output = $position->searchPosition($content);
            echo json_encode($output);
            break;
        case 'deleteposition':
            $id = $_GET['id'];
            $position->deletePosition($id);
            break;
        default:
            header("HTTP/1.0 400 Bad Request");
    }
    Ответ написан
    2 комментария
  • PHPStorm при плохом VPN соединении?

    GavriKos
    @GavriKos
    Поменять полностью стратегию деплоя. Разрабатывайте ПОЛНОСТЬЮ локально, удаленно разворачивайте через CI и гит.
    Ответ написан
    2 комментария
  • Как открывать пользовательские приложения с правами sudo?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Работать от рута - зло.

    Сделайте так:
    sudo chown -R alexey:alexey /home/alexey
    это исправит права на все файлы, которые рут успел насоздавать
    Ответ написан
    Комментировать
  • Какой ИБП выбрать для слабого офисного ПК, чтобы работал без света?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Комментировать
  • Какой ИБП выбрать для слабого офисного ПК, чтобы работал без света?

    @kamenyuga
    У бесперебойников в общем-то две основные характеристики - максимальная мощность и емкость батареи. Мощность - ее прямо в названии в магазинах пишут. Ее должно хватать для типичного потребления компьютера. Для описанных в вопросе пк скорее всего и 300 Вт будет всегда хватать. Можно брать любой самый дешевый. А батарея - тут зависит от необходимого времени работы автономной. Почти любого ИБП хватит, чтобы нормально выключить компьютер. А если надо прямо проработать какое-то время, то гуглим "nix время автономной работы ИБП при нагрузке" и получаем список из протестированных ибп вместе с ценами.
    Ответ написан
    1 комментарий
  • Комплектующие для игрового ПК, какие лучше?

    @Adrianus
    Ex nihilo nihil fit
    Водянку не советую - сдохнет помпа и под замену, хорошо если не вырвет и не зальет всё. У самого стоит Dark Rock 4 Pro на процессоре - идеален.

    Настолько топовое железо в примере....а смысл? У меня, например, Intel i7-4820K (LGA2011), ASUS X79 Deluxe, 16 Gb оперативки и видеокарта Gigabyte GeForce1660 Super. "Киберпанк" и все топовые шутеры идут на полных и без багов. По ФПС не подскажу, правда.
    Ответ написан
    1 комментарий