Задать вопрос
  • Как вывести общее количество записей из базы данных?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    select count(*) as cnt from tbl_file
    Выводить обычным порядком, судя по предыдущим вопросам, работать с mysql из PHP вы умеете.
    Ответ написан
    Комментировать
  • Как сделать вывод и сортировку строк sql?

    @Layton

    fetchone


    Переведите это и поймёте. Ну и прочитайте базовую инструкцию по использованию вашей базы.
    Ответ написан
    3 комментария
  • Есть ли какие-то сервисы или форумы, куда можно выложить свой код, чтобы его могли оценить и оптимизировать другие люди?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В теории можно было бы и сюда, но хотя тег и есть, но сами модераторы признают, что модерируют его как бог на душу положит - то пропускают вопросы, то удаляют.

    На английском есть специализированный сайт codereview@stackexchange, при наличии языка это идеальный вариант.

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

    Самый надёжный способ получить code-review, это завести два аккаунта. С одного задать вопрос, "как сделать то-то", а с другого - запостить код, который это делает. И тут же набегут советчики, рассказать, что в этом коде неправильно.
    Ответ написан
    2 комментария
  • Как сделать decode только в mysql запросе?

    SagePtr
    @SagePtr
    Еда - это святое
    Как-то так:
    CREATE FUNCTION textDecrypt (input TEXT)
    RETURNS TEXT DETERMINISTIC
    BEGIN
      DECLARE crypt_str BLOB;
      DECLARE key_str BINARY(32);
      DECLARE init_vector BINARY(16);
      SET crypt_str = FROM_BASE64(input);
      SET key_str = UNHEX(SHA2('marks', 256));
      SET init_vector = REPEAT('\0', 16);
      SET block_encryption_mode = 'aes-256-cbc';
      RETURN AES_DECRYPT(crypt_str, key_str, init_vector);
    END

    https://sqlize.online/sql/mysql80/6fde6e8b7a619316...
    Ответ написан
    Комментировать
  • Какие существуют конструкторы веб-приложений?

    @12rbah
    Например, создать простой личный кабинет, не программируя его, а используя конструктор.
    Соединить с базой данных, создать таблицы пользователей, параметров. Задать интерфейс.
    И чтобы компилировалось в код по итогу из конструктора.
    CMS?
    Ответ написан
    Комментировать
  • Почему тормозит код записи в MySQL после разбивки его на функции?

    @rPman
    хоть один пример такой функции показал бы

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

    p.s. гугли - php профилирование вызовов функций
    Ответ написан
    1 комментарий
  • Какой можно применить алгоритм для хранение индекса для 50 миллиардов записей в golang?

    2ord
    @2ord
    Apache Parquet вполне может подойти, т.к. это формат хранения, а не движок. Есть реализации на Го. Хранить можно на любом подходящем хранилище. Индексы колонок тоже поддерживаются.
    Ответ написан
    Комментировать
  • Как получить данные с БД за Н количество дней?

    ipatiev
    @ipatiev Куратор тега 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 ( с теми данными для данного кейса только один метод работы, все внутри)

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

    ipatiev
    @ipatiev Куратор тега 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
    Ответ написан
    Комментировать
  • Как определить источник обращение к БД?

    Melkij
    @Melkij
    DBA Team для вашего PostgreSQL?
    Используйте более подробный 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 комментария