Ответы пользователя по тегу PHP
  • Как правильно сделать скрипт для крона?

    @Akina
    Сетевой и системный админ, SQL-программист.
    А к какой заднице тут вообще CRON прислонился?

    Если же имеется в виду, что указанным запросом надо удалять записи регулярно - то CRON для решения такой задачи просто нафиг не нужен..

    Using the Event Scheduler

    PS. И в запросе следует избавиться от WHERE IN и переписать его на обычный JOIN.
    Ответ написан
    Комментировать
  • Как исправить ошибку с бд?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Представим, что проблему сохранения вы как-то решили... А что вы намерены делать с сохранённым значением?

    Вариант 1 - всегда только извлекать весь массив целиком, в том виде, в каком он сохранялся. Никаких извлечений части массива, никаких по нему поисков, сортировок и прочего. Тогда преобразуйте массив во вменяемый сериализованный формат и сохраняйте в поле БД. Виктор Кожухарь в своём ответе разобрал этот вариант.

    Вариант 2 - возможна какая-то обработка. Извлечение части массива по какому-то критерию (порядковый номер, соответствие шаблону и пр.), поиск в массиве по заданному критерию, сортировка самого массива либо массивов по какому-то критерию.. Тогда однозначно делите массив на отдельные элементы и сохраняйте их по одному (конечно, соответствующим образом должна измениться структура БД). Делить можно и на стороне PHP (как показывает Евгений в своём ответе), и в запросе на запись на стороне MySQL. Первое, как я понимаю, вам проще сделать, но правильно - второй вариант.
    Ответ написан
    Комментировать
  • Как составить SQL запрос на получение дочерних категорий woocommerce, чьи дочерние категории имеют записи?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Модельное решение:

    SELECT brand.b_id
    FROM brand
    NATURAL LEFT JOIN model 
    NATURAL LEFT JOIN item
    GROUP BY 1
    HAVING NOT SUM(i_id IS NULL)


    fiddle
    Ответ написан
    Комментировать
  • Какую кодировку выбрать для бд чтобы хранить фото?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Не надо хранить бинарные файлы в БД.

    В дополнение ко всему сказанному - в MySQL извлечение сохранённых бинарных файлов именно в виде файлов, а не массива байтов, тоже занятие нетривиальное. Выполняется по одному, запросом SELECT INTO DUMPFILE, да ещё и отдельно от остальных полей записи.
    Ответ написан
    Комментировать
  • Как сделать запись в mysql с проверкой на уникальность с учётом времени из поля?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Легко решается триггером. Пример:

    - исходная таблица:
    CREATE TABLE users (
      id INT AUTO_INCREMENT PRIMARY KEY,
      username VARCHAR(100),
      created_at DATETIME DEFAULT CURRENT_TIMESTAMP
    );


    - триггер:

    CREATE TRIGGER tr_users_bi
    BEFORE INSERT ON users
    FOR EACH ROW
    BEGIN
      DECLARE allowed_created_at DATETIME;
      DECLARE error_message_text VARCHAR(64);
      SELECT MAX(created_at) + INTERVAL 12 HOUR INTO allowed_created_at
      FROM users
      WHERE username = NEW.username;
      IF NEW.created_at < allowed_created_at THEN
        SET error_message_text = CONCAT('Регистрация возможна не ранее ', allowed_created_at);
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = error_message_text; 
      END IF;
    END


    DEMO fiddle

    PS. Надеюсь, получение сгенерированного сообщения об ошибке и показ его юзеру не составит проблемы..
    Ответ написан
    Комментировать
  • Почему paragonie/easydb не пропускает слэши?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Первым делом хорошо посчитайте количество шагов экранирования. Один - сам MySQL, второй - видимо, используемый язык, но там ещё может вмешаться фреймворк или что ещё...

    Рекомендую включить временно General Log, и посмотреть, какой именно текст запроса получает MySQL. После чего отрихтовать текст запроса.

    В крайнем случае
    WHERE `value` LIKE CONCAT('%', CHAR(92), CHAR(92), '%')
    Ответ написан
    Комментировать
  • Как распределить число равномерно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Обычный подход - тупо:

    Количество(Склад Номер Х) = ВсегоТовара * НомерСклада / ВсегоСкладов - Количество(Склады Номер 1 .. Х-1)


    Т.е. если, как в вопросе, три склада и 5 товаров:

    Склад 1: количество = 5 * 1 / 3 - 0 = 1,666 = 2 штуки
    Склад 2: количество = 5 * 2 / 3 - 2 = 1,333 = 1 штука
    Склад 3: количество = 5 * 3 / 3 - (2 + 1) = 1,666 = 2 штуки


    $amount = 5;
    $num = 3;
    
    for($used = 0, $i = 1; $i <= $num; $i++) {
      $used += ($current = round($amount * $i / $num - $used));
      echo("$i: $current\n");
    }


    https://phpize.online/sql/mysql57/undefined/php/ph...
    Ответ написан
  • MySQL PDO, Почему все значения при выборке типа string?

    @Akina
    Сетевой и системный админ, SQL-программист.
    После сохранения значения в таблице MySQL оно имеет тип того поля, в которое сохраняется, вся история потеряна, какой код и с каким флагами выполнял вставку, ни на что не влияет. Потому при выборке ну никак не может прийти другой тип данных именно от MySQL.

    То есть какие-то дополнительные преобразования, изменяющие тип данных, выполняет PHP уже после того, как он получил ответ от MySQL. Или не PHP, а коннектор, который PHP использует для доступа к MySQL. Но в любом случае это происходит уже на стороне клиента.

    Предположу, что эмуляция - процесс двусторонний. То есть не только на пути "туда", но и на обратном пути. Что при дополнительной обработке, которую требует настройка PDO::ATTR_EMULATE_PREPARES => true, корёжит тип данных.

    На всякий случай проверьте, не вызывает ли изменение этого флага корректировки других флагов. В частности, PDO::ATTR_STRINGIFY_FETCHES.
    Ответ написан
  • Как объединить запросы?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Два LEFT JOIN, условие связывания - по id и определённому значению типа.
    Ответ написан
    Комментировать
  • Как получать данные из формы на сайте в разные таблицы БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    При добавлении набора данных в связанные таблицы (а по большому счёту - вообще всегда) следует забыть о существовании INSERT .. VALUES и пользоваться исключительно INSERT .. SELECT. Первый запрос вставляет запись в основную таблицу, второй вставляет в зависимую, получая необходимое для связывания значение из основной по известным критериям отбора (по только что вставленным значениям, либо, в случае MySQL, из LAST_INSERT_ID).
    Ответ написан
    Комментировать
  • Как вывести из sql таблицы все строки с совпадающими значениями?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH cte AS (
        SELECT a, b, c, COUNT(*) OVER (PARTITION BY a, c) cnt
        FROM table
    )
    SELECT a, b, c
    FROM cte 
    WHERE cnt > 1
    Ответ написан
    1 комментарий
  • Как получить timestamp,обрезав пустое время?

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Применительно к данной конкретной задаче:
    • СУБД предназначена для хранения и обработки массивов данных.
    • ЯП предназначен для обеспечения пользовательского интерфейса этого процесса и управления им.


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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ответ написан
    Комментировать
  • Как сделать SQL запрос из двух таблиц?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В синтаксисе MySQL:
    SELECT c.name category_name, p.id post_id, p.name post_name, p.title post_title
    FROM posts p
    JOIN categories c ON p.category_id = c.id
    UNION ALL
    SELECT name, NULL, NULL, NULL
    FROM categories 
    ORDER BY category_name, post_id IS NOT NULL

    Соответственно если в поле post_id обнаруживается NULL, то в этой записи категория, и она рисуется как категория. Если же там не NULL - то это пост, и он рисуется со смещением.

    Дурь, конечно, но для сельской местности сойдёт..
    Ответ написан
    1 комментарий
  • Как узнать CIDR или маску подсети по голому ip адресу?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В общем случае нерешаемо.

    Максимум - можно получить сведения о диапазоне, в который входит целевой IP, по учётным данным регистратора. Но вот как выделенный диапазон порезал его арендатор, и в какой подсети находится целевой адрес, определить в общем случае невозможно.
    Ответ написан
    3 комментария
  • Как работать с двумя и более базами данных одновременно?

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

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

    То есть после подключения к серверу доступны все БД этого сервера (ну в рамках имеющихся прав доступа, конечно). И, указывая полное имя таблиц, включающее имя БД, можно обращаться к любой доступной БД этого сервера, в т.ч. и к таблицам из разных БД в одном запросе.

    А если ещё подключить внешние таблицы (используя FEDERATED ENGINE) - то можно работать и с данными из баз на другом инстансе (сервере) MySQL.
    Ответ написан
    Комментировать
  • Как отсортировать массив?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT name, `text`
    FROM product
    JOIN product_attribute USING (product_id)
    JOIN attribute_description USING (attribute_id)
    -- JOIN attribute USING (attribute_id)   -- таблица в запросе не нужна
    GROUP BY 1, 2
    HAVING COUNT(*) > 1;

    fiddle

    Если нужна именно сортировка как в эталоне - ну добавить ORDER BY MAX(attribute_id)

    Таблица attribute потребуется лишь в случае, если данные из неё нужны (например, в запрос добавится отбор по значению attribute_group_id).

    Если надо сравнивать атрибуты у более чем 2 товаров, то соотв. образом откорректировать условие пост-отбора. Например, для 3 товаров и атрибутов, имеющихся у всех трёх, это будет HAVING COUNT(*) = 3
    Ответ написан
  • Как упорядочить id записей в MySQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если речь об автоинкрементном поле-первичном ключе, то забудь про сию хотелку, и чем скорее, тем лучше.

    PRIMARY KEY выполняет в таблице только одну функцию - однозначно идентифицирует запись. В нормальных условиях значение такого поля используется исключительно для связывания данных (установления соответствия), и надобности видеть значение этого поля не существует в принципе.

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

    В общем, надо тебе поле-нумератор? создай для этого дела ещё одно поле, просто числовое, не автоинкремент, и заполняй программно. А ещё лучше - организуй односвязный список, и нумеруй прямо в запросе на получение данных.
    Ответ написан
    Комментировать
  • Насчет экспорта таблицы MySQL в Excel средствами PHP?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Выполняем SELECT .. INTO OUTFILE, полученный CSV прекрасно читается в Excel. Т.е. PHP выполняет указанный запрос, а потом, если надо, организует перемещение полученного CSV в нужное место.
    Ответ написан