• Не запускается сервис 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
    Внимание! Изменился адрес почты!
    Работать от рута - зло.

    Сделайте так:
    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 комментарий
  • Комплектующие для игрового ПК, какие лучше?

    xez
    @xez Куратор тега Компьютеры
    TL Junior Roo
    У меня несколько вопросов:
    1. Точно ли нужен 5900x? Может хватит 5800x или даже 5600x ?
    2. Зачем водянка? Как по мне, лучше топовый воздух.
    3. Самое главное. Вот вы выбираете mb + ram... Ну есть же QVL для вашей матери.. Почему не выбрать память из того списка?
    Ответ написан
  • Как сайту на кириллическом домене отправлять почту?

    profesor08
    @profesor08
    1. Не использовать кириллические доменные имена
    2. В случае проблем смотреть первый пункт
    Ответ написан
    Комментировать
  • Как реализовать SMTP отправку почты PHP?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Поскольку вы не дожидаетесь ответа сервера, то ваши команды уходят на сервер до того, как он будет готов их принять.
    Ответ написан
    Комментировать