Задать вопрос
  • Почему тормозит код записи в MySQL после разбивки его на функции?

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

    В целом, цифры какие-то дикие. Что 8 секунд, что 16, что 3. Для записи одного "продукта" нужно максимум 0.1 секунды, если всё очень сильно тормозит
    Ответ написан
  • Почему sql-оператор IN (в WHERE) плох с точки зрения оптимизации?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Использование оператора IN (значение0, значение1, значение2) никак не сказывается на производительности SQL-запроса.
    Чтобы запрос был менее ресурсозатратным, надо посмотреть результат EXPLAIN и расставить индексы.
    Ответ написан
    Комментировать
  • Существует ли тип данных List или Array в MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Разумеется, существует.
    Тип данных List или Array в реляционной базе данных - это связанная таблица.

    Соответственно, inventory - это просто таблица из двух полей, id игрока и id скина
    Ответ написан
    Комментировать
  • Поиск по нескольким свойствам по динамическим записям?

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

    В принципе, поиск по одному значению - это просто, по джойну на каждое свойство. Но вот когда выбор из нескольких...
    Как-то так должно по идее работать
    SELECT p.*, sum(po1.classifier_id=1) num1, sum(po2.classifier_id=2) num2 FROM products p
        left JOIN product_options po1 on po1.product_id = id and po1.classifier_id=1 and po1.option_id in (1,2)
        left JOIN product_options po2 on po2.product_id = id and po2.classifier_id=2 and po2.option_id in (10,11)
    group by id having num1 > 1 and num2 > 1;
    Ответ написан
    Комментировать
  • Не передает переменную в запрос?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я думаю, имелось в виду что-то вроде этого
    function regis($pdo, $login, $pass ): bool
    {
        $res = $pdo->prepare("INSERT INTO users(login, password) VALUES (:login,:pass)");
        $res->execute(["login" => $login, "pass" => $pass]);
        return true;
    }


    На будущее: функция должна всегда делать что-то одно. Все проверки, работа с НТТР, сессии - должно быть снаружи.
    Ответ написан
    2 комментария
  • Как реализовать математическую формулу в Telegram боте, написанном на языке python?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Комментировать
  • Как узнать размер файла на PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как правильно тут все пишут, для того чтобы узнать размер файла, надо указать к нему правильный путь.
    Для этого надо во-первых, не путать файлы с URL-ами, а во-вторых, правильно строить путь к файлу от корня диска.

    В данном случае скорее всего подойдёт
    $file = $_SERVER['DOCUMENT_ROOT']."/files/file.png";
    echo filesize($file);


    Если нет - надо сначала разобраться, как этот код вызывается и где на самом деле лежит файл.
    И обязательно почитать про абсолютные и относительные пути
    Ответ написан
    1 комментарий
  • Как получить данные с БД за Н количество дней?

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

    r.date_added > curdate() - interval 30 day

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Мужчина, вы издеваетесь?
    Я вам уже раз пять повторил ответ на этот вопрос:

    имена колонок и таблиц нельзя брать в одинарные кавычки. Потому что в одинарных кавычках пишутся строки.
    И если даже иногда sqlite и смотрит сквозь пальцы на такую ошибку (когда она может понять по контексту, что имеется в виду), это не значит, что так будет везти всегда.
    Строка 'money' никогда не будет равна числу.
    Ответ написан
    3 комментария
  • Fatal error: Allowed memory size. Как сделать запрос SQL чтобы не получать ошибку?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Читаем https://www.php.net/manual/ru/mysqlinfo.concepts.b...
    и делаем свой запрос небуферизованным.
    Ну и разумеется читаем все 300 офигиллиардов строк не сразу в массив, а обрабатываем по одной.
    Ответ написан
    6 комментариев
  • Почему не видит файл?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как правильно заметили в комментарии выше, какой-то из файлов не является изображением.
    Соответственно, такие файлы надо пропускать
    imgs = os.listdir("images")
    for file in imgs:
        img = cv.imread(f"images\{file}")
        if img is not None:
            copy = img.copy()


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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Разумеется, API.
    Сейчас даже в рамках одного "хостинга" многие проекты переходят на микросервисную архитектуру, ходя в лежащую рядом БД не напрямую, а обращаясь по НТТР к сервису, который уже и лезет в БД.

    Тем более что тут нужна не вся БД, а всего-то одна таблица. То есть код пишется за полчаса.
    На клиенте file_get_contents, на сервере такой же код, что и при обычной авторизации, но возвращает не Location а true.
    Ответ написан
    Комментировать
  • Как правильно распределить хранение комментариев?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Правильно все однородные данные хранить в одной таблице.
    Связи в БД строятся на основании содержимого таблиц, а не на основании их имён.
    Иначе потом приходится "бегать по всем этим таблицам и собирать записи".

    Так же при проектировании БД следует опираться на требования архитектуры, а не на влажные эротические мечты про "сумасшедшие масштабы". Если когда-нибудь проект достигнет сумасшедших масштабов, то к этому моменту вся архитектура будет переделана не один раз. И проблема комментариев будет решаться в зависимости от реальных проблем с которыми столкнётся проект, а не в соответствии с фантазиями, которые были у кого-то на начальном этапе.
    Ответ написан
    Комментировать
  • Как работать с сырыми результатами SELECT MySQL CLI в PHP CLI?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос, конечно, ад, из серии "помогите достать занозу гвоздодёром" но в целом мне приходилось такое делать. Ключик -X и simplexml

    Ну и всякие мелочи, типа -N чтобы получить сразу значение, если запрос возвращает одно поле одной строки, group_concat() если надо получить значения через запятую, и прочее
    Ответ написан
    1 комментарий
  • Почему не записываются данные в бд SQLITE?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    После запросов, выполняющих изменения в БД, надо вызывать
    self.connection.commit()

    И имена колонок и таблиц нельзя брать в одинарные кавычки. Потому что в одинарных кавычках пишутся строки.
    И если даже иногда sqlite и смотрит сквозь пальцы на такую ошибку (когда она может понять по контексту, что имеется в виду), это не значит, что так будет везти всегда.
    Строка 'money' никогда не будет равна числу.
    Ответ написан
    8 комментариев
  • Как обновлять данные каждые 24 часа в MySQL?

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас задача на сложение переменных, которые являются элементами разных словарей.
    А не на скоростное гугление по запросу "как сложить элементы в одном словаре".
    Чтобы сложить три переменные, не нужно создавать новый словарь. Надо просто сложить три переменные и вывести результат.

    Это всё очень плохо.
    Программы, которые мы пишем, должны выдавать правильный результат при любых вводных.
    А ваша будет всегда будет выдавать 514, либо её надо будет каждый раз переписывать под новые данные.
    Потому что она считает не то что было задано, а какой-то левый массив, который не имеет никакой связи с исходными данными.
    Ответ написан
    Комментировать
  • Парсинг JSON в Python. Как брать конкретные данные?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Получить "конкретный ключ" - это "парсить все данные" до тех пор, пока не найден искомый.
    То есть банально два оператора, for и if. Только не говорите, что вы даже их не знаете.
    for item in json:
        if item['Ccy'] == 'EUR':
            break
    print(item)

    но лучше сразу перегнать список в словарь,
    rates = {}
    for item in json:
        rates[item['Ccy']] = item

    и дальше просто обращаться по индексу
    Ответ написан
    1 комментарий
  • Как создать локальную базу данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    На mysql не создают такой файл.
    Mysql - это отдельная программа, которая хранит данные в своих собственных файлах.
    "Создавать" её не надо. На хостинге она уже есть, дома она обычно тоже уже есть, в составе какого-нибудь набора - XAMPP, MAMP и пр.
    Если никаких наборов нет, то скачать и установить Mysql с офсайта.

    После этого вся работа с БД будет производиться через SQL.
    Лучше это делать через нормальный клиент, типа PHPStorm, Workbench и так далее. В крайнем случае - phpmyadmin, но это конечно очень уродливая программа.
    Настроить программу на соединение с сервером БД и выполнять в нем команды SQL.
    Например, создать database - это типа такой каталог, в котором лежат таблицы - CREATE DATABASE mydb;
    И вот это mydb потом указывать в параметрах подключения PDO.
    Ответ написан
    Комментировать
  • Дают ли выигрыш ссылки на элементы массива и на поля объектов в PHP?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    С точки зрения памяти не даёт, потому что в РНР и так очень оптимальное управление памятью.
    В частности, при присвоении значений переменным применяется принцип copy-on-write. Объекты же и так всегда копируются по ссылке.

    С точки зрения "вычислять адрес промежуточного объекта" - я никогда не слышал о таких проблемах. Судя по всему, это явно не является узким местом для динамически интерпретируемого языка.
    В любом случае, учитывая copy-on-write, исходно это снова будет опять ссылка.

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