• Как получить данные с БД за Н количество дней?

    Fockker
    @Fockker Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    PHP здесь вообще не нужен, мysql прекрасно умеет работать с датами сама.

    r.date_added > curdate() - interval 30 day

    И на будущее, никогда не использовать date() в условии.
    Ответ написан
    1 комментарий
  • Зачем задавать приватный модификатор доступа для свойств класса?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    У вас очень логичный вопрос на счет сеттера: сеттер полностью уничтожает задумку с инкапсуляцией. Правильно это называется "семантическое нарушение инкапсуляции" — то есть как-бы мы инкапсулировали, но по факту назад открыли прямую запись в свойство напрямую. Все доводы "ну мы можем в сеттере валидировать" не корректны

    Правильным способом будет не использовать сеттеры. Вот моя статья на эту тему:
    https://habr.com/ru/post/469323/

    Более подробно: каждый класс нужно проектирвовать так, чтобы данные внутри были максимально связаны. Например каждый метод работать должен в хорошем случае с максимальным числом полей класса, тогда у него высокий cohesion... В тоже время снаружи наужно работать с максимальн омалым числом метода, тогда будет низкая связанность (coupling). Это пара принципов из GRASP.
    Когда вы делаете сеттеры и геттеры, то у вас данные внутри между собой почти никак не взаимодействут: с геттером работают снаружи, с сеттером работаю снаружи — весь класс нараспашку, а в нем в 100% случаев появляются данные, которые вместе не должны находиться и никак не связаны — анрушена и абстракция и инвариант и много чего еще...

    Про инвариант отдельно: например есть платеж, у него есть значение, с которым платеж инициирвоан (initValue), есть значение холда (holdAmount) и есть значение чарджа на списание (chargeAmount)
    Когда вы работаете с платежом, контролируя ивнариант в самом классе, то ваш каждый метод првоеряет др значения и позволяет перейти к др состоянию... методов будет 2-3, все инкапсулировано и безопасно.

    Например:
    class Payment {
         pub func charge(amount int) void {
              if (this.holdAmount < amount && this.initAmount < amount) {
                   throw new PaymentException('Unavailable charge amount')
              }
    
               if (this.status === PaymentStatus:finish) {
                   throw new PaymentException('Payment already fisnished')
              }
    
              this.chargeAmount = amount
              this.holdAmount -= amount
              this.status = PaymentStatus:finish
         }
    }


    Тут в одном методе полные проверки и класс сам контролирует все состояние внутри, также соблюдается закон Деметры. У даннго кода высокий cohesion (из GRASP), тк внутри идет плотная работа с внутр данными (значит они корректно тут закроекны) и низкий coupling ( с теми данными для данного кейса только один метод работы, все внутри)

    Когда вы раскроете сеттерами и геттерами, то ваше состояние становится непредсказуемо и полагается только на то, что снаружи точно подумали об инварианте (нет)
    Ответ написан
    23 комментария
  • Почему выдаёт ошибку? Подключился через MAMP PRO к локальному хосту и попытался реализовать форму регистрации, но выдаёт ошибку, почему?

    Fockker
    @Fockker Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Задавать вопрос "почему мой код не работает" бесполезно.
    Просто потому что код может не работать примерно по миллиону причин. Запаришься все перечислять.
    Причём эти причины к самому коду могут не иметь никакого отношения.
    Всегда надо задавать вопрос "как я могу узнать, почему код не работает".

    Чтобы узнать, почему РНР код не работает, надо прочитать сообщение об ошибке РНР. В данном случае мы его не видим, а видим только сообщение веб-сервера о том, что РНР завершился с ошибкой.
    Чтобы увидеть ошибку РНР, надо сделать две вещи:
    1. Убедиться, что РНР генерирует сообщения об ошибках. Для этого во-первых, всегда должен стоять максимальный уровень генерации ошибок, error_reporting(E_ALL);, и во-вторых, программист не должен сам себе стрелять в ногу, насильно подавляя сообщения об ошибках. И никогда не использовать оператор подавления ошибок, @.
    2. На время разработки поставить режим вывода ошибок на экран, ini_set('display_errors', 1);. На боевом сервере, соответственно, этот режим должен быть выключен, а логирование наоборот - включено.

    И только после получения сообщения об ошибке можно уже приходить на Хабр с вопросом. Но сначала предварительно погуглить, потому что все вопросы уже задавали по миллиону раз.
    В данном случае вероятной причиной может быть нестандартный порт mysql. Но опять же, гадать нет смысла, надо сначала увидеть сообщение об ошибке.

    Отдельно отмечу, что в таком виде регистрацию делать бессмысленно, тут сплошная SQL инъекция, то есть кто угодно сможет узнать чужой пароль, залогиниться под чужим именем или вообще зайти без пароля. Все SQL запросы, в которых участвуют переменные, в обязательном порядке должны выполняться через подготовленные выражения, с заменой переменных на знаки подстановки.
    Кроме того, пароль в обязательном порядке должен стойко хэшироваться, функцией password_hash()
    Ответ написан
    Комментировать
  • Как добавить партицию, если уже есть maxvalue?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Да, нужно делать реорганизацию - операция потенциально требует переноса данных между партициями.

    Прмер:
    CREATE TABLE table_name (create_date DATE);
    
    ALTER TABLE table_name 
    PARTITION BY RANGE(create_date + 0) (
        PARTITION p_old VALUES LESS THAN(20111201),
        PARTITION p_1 VALUES LESS THAN(20120201),
        PARTITION p_2 VALUES LESS THAN(MAXVALUE)
    );

    Добавляем партицию (точнее, разделяем партицию на две):
    ALTER TABLE table_name
        REORGANIZE PARTITION p_2 INTO (
            PARTITION p_2 VALUES LESS THAN (20130101),
            PARTITION p_max VALUES LESS THAN (MAXVALUE)
    );

    DEMO
    Ответ написан
    Комментировать
  • На каком движке работает сайт? Как сделать такой же?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Такой сайт можно сделать на любом движке. Для этого достаточно знать основы вёрстки и уметь кликать мышкой в админке любой CMS.
    Ответ написан
    Комментировать
  • Как создать локальную базу данных?

    Adamos
    @Adamos
    файл с расширение .db

    Это, скорее всего, база SQLite.
    Ответ написан
    Комментировать
  • Как получить среднее значение с начала года на каждый день SQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT *, AVG(RT) OVER (PARTITION BY Curr, YEAR(Dates) ORDER BY Dates) AS example
    FROM src_table
    Ответ написан
    Комментировать
  • Как проверить, чтобы в строке не было пробелов?

    vilinyh
    @vilinyh
    Для этого не нужны регулярные выражения. Используйте strpos для проверки наличия в строке пробела и str_replace для удаления.
    Ответ написан
    Комментировать
  • Как определить источник обращение к БД?

    Melkij
    @Melkij
    PostgreSQL DBA
    Используйте более подробный log_line_prefix. В частности, нужен %h

    log_line_prefix = '%m %p %u@%d from %h [vxid:%v txid:%x] [%i] '

    Мы такой используем если нет значимых причин для иного.
    Ответ написан
    1 комментарий
  • Какой ресурс позволит стать уверенным React-джуном?

    @Pagantuz
    Быстрый ответ - никакой

    Развернутый ответ:

    Для качественного обучения Вам недостаточно будет пройти какой-либо волшебный курс, который сделает Вас разработчиком. В первую очередь я бы рекомендовал начать с документации, а непонятные моменты уже уточнять в других источниках (например, в тех же курсах). Если Вас интересует именно видео-формат, то посоветовал бы канал Ulbi TV. И само собой Вам нужно сделать несколько своих, независимых от курса проектов.
    Время зависит только от Вас. По своему опыту скажу, что путь от нуля до устройства на работу у меня занял примерно 4 месяца. Знания у меня были весьма шаткие, но этого хватило.
    Ответ написан
    Комментировать
  • Книги по базам данных?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Спросил у нашего преподавателя, его рекомендации ниже:
    Вот интересные книги:
    “Database Internals” by Alex Petrov,
    “PostgreSQL изнутри" Рогов.

    1 книга - работа в общем для баз данных,
    2 книга - конкретно PostgreSQL
    Ответ написан
    2 комментария
  • Что осваивать после CSE?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Начал изучение computer science

    план изучения основ программирования

    Хочу научиться читать и писать, взялся за изучение высокого слога в сочинении эпических поэм.
    Ответ написан
    Комментировать
  • Как сравнить по времени в таблицах, отбросив минуты и секунды до часов?

    @alexalexes
    Select t1.ID, t1.TIME
    from 
    TABLE_1 t1 
    JOIN TABLE_2 t2 ON t1.ID=t2.ID
                  and to_char(t1.TIME, 'DD.MM.YYYY HH24') = to_char(t2.TIME, 'DD.MM.YYYY HH24')

    Вариант 2 (возможно, пригодится при оптимизации, так как на выходе сравниваются значения в типе дата время, а не строк):
    ... and trunc(t1.TIME, 'hh24') = trunc(t2.TIME, 'hh24')

    PS: Хорошо бы еще индекс создать под этот формат времени для колонок t1.TIME и t2.TIME, тогда запрос будет всегда производителен.
    Ответ написан
    4 комментария
  • Наработает цикл for в цикле while что делать?

    @negr_vitalya
    Я скелет - негр виталя
    Что-бы содержимое sql-запроса выводилось нужно итерировать вызов функции cursor.fetchall() или cursor.fetchone() после выборки из бд. А так cursor.execute ничего не возвращает и итерировать там нечего, поэтому в консоль выводится только "не работает".
    Ответ написан
    1 комментарий
  • На чем сейчас делают сайты с простым редактированием?

    Варианты:
    1) Любой онлайн конструктор сайтов подойдет.
    Плюсы - красивые блоки, простая админка, техподдержка.
    Но доступа к кодам не будет конечно + абонплата.

    2) Wordpress + редактор блоков типа Elementor (их много разных).
    Плюсы - универсальность, нет абонплаты, неограниченные возможности развития.
    Но многие блоки изначально некрасивые, надо ковырять самому, нет техподдержки.

    Мне лично wordpress больше нравится, особенно в качестве сайта компании.
    Все же онлайн конструкторы - это для быстрых и простых лендосов.
    Ответ написан
    Комментировать
  • Array_intersect работает очень странно. Что не так?

    vilinyh
    @vilinyh
    С array_intersect все хорошо, что-то не так с вашим кодом, который вы опустили для примера.

    Вместо print_r воспользуйтесь var_dump, он выводит типы. Вероятно часть из элементов при приведении типов для сравнения конвертируется не так, как вы ожидаете. С print_r вы этого не увидите.
    Ответ написан
    3 комментария
  • Как обеспечить консистентность данных между БД и поисковым движком?

    vabka
    @vabka
    Токсичный шарпист
    В программировании есть только две проблемы - именование переменных и инвалидация кэша.


    Ну тут несколько вариантов:
    1. Пытаться одновременно записать в обе базы.
    2. Сначала писать в Postgres, как в единственный источник истины, а параллельно копировать в эластик (по расписанию или ещё как)
    3. Писать в какую-нибудь брокер сообщений типа кафки, а в Postgres и ES записывать из него.

    По соотношению сложность/надёжность второй вариант лучше всего
    Если нужно, чтобы в Pg и ES данные попадали гарантированно и при этом как можно быстрее - вариант с брокером сообщений.
    Если нужна максимальная скорость и минимальные гарантии - первый вариант.
    Ответ написан
    Комментировать
  • Почему возникает ошибка Promise { pending }?

    MvcBox
    @MvcBox
    Software Developer [C/C++/JS(for Node.js)/etc]
    'use strict';
    const { MongoClient } = require('mongodb');
    const client = new MongoClient('mongodb://localhost:27017/');
    
    (async function() {
      await client.connect();
      const result = await client.db('world').collection('cyti').find().toArray();
      console.log('City: ',  result);
    })().catch(console.error);


    https://developer.mozilla.org/en-US/docs/Web/JavaS...
    https://learn.javascript.ru/async-await
    Ответ написан
    Комментировать
  • Как лучше реализовать постоянный отсчёт времени и суммирование значений?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Надо ли иметь в БД статичное значение баллов? Может, оставить свойство вычисляемым — когда требуется узнать про конкретного пользователя, сколько у него баллов — выполняется поиск купленных им карточек за последние 10 дней и до сих пор активных, и суммируются.

    Либо можно обновлять базу cron-задачей. Округлить до какого-то интервала времени: 1 сутки (если все в одном городе), или 1 час, если пользователи со всех частей света. Карта начинает действовать в ближайший следующий «момент» после активации. В ближайшую полночь, скажем.

    1000 пользователей по 5 карточек — это не нагрузка, всё легко отработает.
    Ответ написан
    1 комментарий
  • Почему нулевая дата выводится некорректно?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Потому что нулевой месяц - это на один месяц раньше первого месяца, и нулевой день тоже на один день раньше первого дня. Вот и получается:
    0000-01-01 00:00:00 минус 1 месяц = -0001-12-01 00:00:00
    -0001-12-01 00:00:00 минус 1 день = -0001-11-30 00:00:00
    Ответ написан
    Комментировать