• Возможно ли составить такой SQL запрос?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ничто не мешает использовать оконный вариант агрегатных функций. Кроме слишком старой версии СУБД, не поддерживающей оконные функции, конечно.
    SELECT MIN(`min_price`) OVER () as `min_price`, 
           MAX(`max_price`) OVER () as `max_price`, 
           `item_id` as `id`
    FROM `product_table` 
    WHERE `id` IN (SELECT  тут запрос)

    Получишь все нужные id, и в каждой строке - нужные MIN и MAX.

    ======================


    Akina, да, версия 5.7.21 и она, я так понимаю, не поддерживает оконные функции.


    SELECT t2.min_price, 
           t2.max_price, 
           t1.item_id as id
    FROM product_table t1
    CROSS JOIN ( SELECT MIN(min_price) AS min_price, 
                 MAX(max_price) AS max_price
                 FROM product_table ) t2
    WHERE t1.id IN (SELECT  тут запрос)
    Ответ написан
  • Как обработать возникшую ошибку в PHP скрипте загрузки страницы?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это очень хороший вопрос, по многим причинам.

    Во-первых, очень хорошо что он сам по себе поставлен. Обычно пользователи РНР не задумываются о таких "мелочах". Но на самом деле об этом должен думать каждый программист, делающий сайты
    Во-вторых, здесь мы можем видеть довольно характерный баг Апача, который действительно, почему-то не выполняет директиву ErrorDocument для 500 ошибок, полученных от РНР. Ну и вообще, завязываться на Апач во времена доминирования Нжинкса как-то не очень дальновидно.
    В-третьих, как правильно заметил Stalker_RED, сделать редирект при 500 статусе (или 500 статус при редиректе) невозможно - статус может быть только один. Да это и нет смысла делать - проще сразу на месте нужную страницу и прочитать.
    В-четвертых, текущий подход, прямо скажем, не очень оптимальный:
    - о роботах мы позаботились, о пользователе позаботились, но надо ещё не забыть и программиста. Которому как раз сообщение об ошибке-то нужно видеть во всех подробностях!
    - просто отдать нужный НТТР код недостаточно - надо бы ещё и завершить работу скрипта.
    - ловить все ошибки вручную через try-catch так себе удовольствие. И код раздувает,и поведение потом быстро не поменяешь. А если в какой-то момент захочется для отладки прикрутить whoops - это придётся по всем блокам бегать?

    Чтобы решить все эти проблемы разом, надо сделать единый обработчик ошибок. Который и подробности для программиста залогирует, и нужный заголовок отправит, и красивый хтмл юзеру покажет.

    В самом простом варианте это будет что-то вроде такого:

    set_exception_handler(function ($e)
    {
        error_log($e);
        http_response_code(500);
        if (ini_get('display_errors')) {
            echo $e;
        } else {
            include 'pages/error_500.php';
        }
    });

    В теории, конечно, можно заменить error handler на глобальный try-catch который оборачивает точку входа, но это менее удобно. Тем более, что для обработки фатальных ошибок нужен свой отдельный обработчик, и в итоге код обработки ошибок начинает занимать довольно значительный объем и лучше конечно его инициализацию вынести отдельно.
    Ответ написан
    Комментировать
  • Безопасность кода php -> mysql?

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

    На первом месте тут конечно , конечно, незабвенный Бобби Тейблс и его прошаренная мамаша.
    Таблицу здесь удалить не получится, но вот скачать всю базу - запросто.

    Плюс мамаша конечно тупит. Данные надо не "экранировать", поскольку почти никто не понимает, что это значит, а отправлять в БД отдельно от запроса.

    Но меня здесь больше интресует не безопасность, а осмысленность данного кода.
    Если элемент "login" попадает в сессию в результате авторизации, то зачем снова делать все эти 100500 запросов в БД?
    Я бы этот код сократил до
    <?php
    require_once $_SERVER["DOCUMENT_ROOT"] . "/engine/core/session.php";
    if (empty($_SESSION["user_id"])) {
        include "login.php";
        die;
    }

    и поместил в profile.php

    При этом убедившись, что код собственно авторизации выглядит как-то так

    $stmt = $conn->prepare("SELECT * FROM users_all WHERE name=?");
    $stmt->bind_param("s", $_POST['name']);
    $stmt->execute();
    $user = $stmt->get_result()->fetch_assoc();
    
    if ($user && password_verify($_POST['password'], $user['password']))
    {
        $_SESSION['user_id'] = $user['id'];
        header("Location: /profile.php");
        die;
    }
    Ответ написан
    Комментировать
  • Безопасность кода php -> mysql?

    @d-sem
    "select password from users_all where name='".$_SESSION['login']."'"


    https://owasp.org/www-community/attacks/SQL_Injection

    $_SESSION['password']
    https://stackoverflow.com/questions/19594202/is-it...
    Ответ написан
    Комментировать
  • Какую базу данных выбрать для сервера на Node.js?

    Melkij
    @Melkij
    PostgreSQL DBA
    Доступ к DB Read Only. Т.е. после сдачи сервера в эксплуатацию DB не меняется.

    Поиск нужной записи по одному ID.

    При старте приложения загрузить в память приложения хоть из рядового csv или чего угодно ещё.
    При этих ограничениях задачи внешняя БД избыточна.
    Ответ написан
    5 комментариев
  • Как из другой таблицы выбрать последние три записи?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    WITH `cte` AS (
      SELECT *, ROW_NUMBER() OVER `w` AS `row_num`
        FROM `posts`
        WINDOW `w` AS (
          PARTITION BY `user_id`
          ORDER BY `time` DESC
        )
    ) SELECT *
      FROM `cte`
      JOIN `users` ON `users`.`id` = `cte`.`user_id`
      WHERE `cte`.`row_num` <= 3
    Ответ написан
    1 комментарий
  • Как считывать данные из базы данных в sqlite с помощью python?

    Vindicar
    @Vindicar
    RTFM!
    Потому что нужно читать документацию, там на первой же паре страниц есть примеры кода, в том числе запрос SELECT.

    Что ты вообще ожидаешь получить вызовом str(cursor.execute), если ты знаешь, что cursor.execute() - это метод?
    И почему ты игнорируешь возвращаемое им значение, когда выполняешь запрос?

    Короче, ещё раз - читай доки. Они полезные.
    for row in cursor.execute('SELECT bdname FROM user_city'):
            print(row)
    Ответ написан
    Комментировать
  • Как очищать текст в php?

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

    На самом деле этот вопрос встречается довольно часто. Вот например популярный ответ на Stack Overflow, который подробно разбирает этот распространённое заблуждение: https://stackoverflow.com/a/3126175. И основная мысль там:

    Понятие такой генерализованной "очистки данных" изначально бессмысленное и вредное.

    Особенно такой вот индусской функцией, которая сама по себе - пример редкого идиотизма: сначала заменяем символы < и > на HTML сущности... а потом бодро пытаемся вырезать HTML теги. Которых к этому моменту в тексте не останется ни одного!
    Или функция stripcslashes, которая здесь вообще ни к селу, ни к городу. Если я хочу написать сочетание \n, то с какой стати эта функция будет заменять его на перевод строки?
    Всё что можно оставить из этого безумного набора - это trim(). Да и то не всегда. Как правильно заметил Rsa97, могут быть случаи, когда лидирующие пробелы имеют значение, например, при выводе форматированного кода. Кстати, этим как раз грешит Хабр. Если запостить код с отступами, то первый будет "съеден"!


    Очистка

    Любая "очистка" (хотя правильнее говорить про форматирование), имеет смысл только в определённом контексте.
    И поэтому "очищать" надо только адресно, строго перед использованием в том или ином конкретном случае.

    Например, базе данных ни жарко, ни холодно от наличия HTML тегов.
    А проблемы могут начаться только при выводе данных в HTML. Но если мы будем предотвращать эти проблемы заранее, то просто попортим кучу данных. Поэтому форматировать данные для использования в контексте отрисовки HTML следет строго перед этой отрисовкой. То есть при выводе.
    Что и делают все популярные РНР шаблонизаторы автоматически.
    То есть вручную колупаться с "очисткой" вообще не нужно.

    Больше того, "очистка" HTML поможет данным, выводимым в яваскрипт, как мёртвому припарки. То есть опять же - всегда надо понимать, в какой именно контекст мы выводим данные, и форматировать соответствующим образом. В частности любые данные передавать в яваскрипт только через json_encode()

    И таких контекстов неисчислимое множество. Например, если мы используем переменную для передачи параметров в консольный скрипт, то надо обязательно обрабатывать её через escapeshellarg(). Если в регулярку - то preg_quote(). Имя файла для инклюда из переменной (хотя так делать вообще не стоит) надо хотя бы обрабатывать через basename(). И так далее.

    Валидация

    Если же наличие HTML тегов в поступающих данных противоречит техническому заданию, то надо заниматься не "очисткой", а валидацией: проверить регулярным выражением, есть ли в строке HTML теги. И если есть, то вернуть пользователю с сообщением об ошибке.

    Защита БД

    И кстати, по поводу "использую pdo".
    На всякий случай уточню, что само по себе использование PDO не защищает ни от каких проблем
    Важно помнить, что защита - это когда в базу данных отправляется строго константная строка запроса, полностью на 100% составленная из значений, прописанных в коде РНР, и в ней не используется ни одно значение, пришедшее в код извне. Причем PDO помогает здесь только наполовину, позволяя использовать в запросе подстановки вместо самих данных.
    Но при этом для всех остальных частей запроса - например имен полей - у ПДО нет никакой защиты и её надо организовывать самостоятельно. Либо проверяя по белому списку, лабо, по крайней мере, прогоняя через регулярку.
    Ответ написан
    13 комментариев
  • Как организовать работу с картами клиентов (БД) в веб?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Почитайте про оптимистические блокировки.
    Ответ написан
    Комментировать
  • Let's Encrypt конфликтует с MySQL?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Типичная sql инъекция.
    Строки нужно экранировать, прежде чем пихать в базу.
    https://www.php.net/manual/ru/mysqli.real-escape-s...
    Ответ написан
    3 комментария
  • Скачка файлов на сервер с удаленного хоста. Как передать параметр из php-скрипта в wget?

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

    Решение смешной проблемы в текущем коде - надо всего лишь использовать двойные кавычки вместо одинарных.
    $fileD = escapeshellarg("https://domain.zone/files/file".date("Ymd").".zip");
    exec ("wget -O todayfile.zip $fileD");

    Для решения же исходной задачи, разумеется, не нужен никакой РНР. Использовать для этих целей РНР - это все равно что сначала завернуть котлету в целлофановый пакет, а потом её есть. Ну ведь wget - это уже шелловая команда, и запускать её надо напрямую.

    /usr/bin/wget -O /path/todayfile.zip "https://domain.zone/files/file$(date '+%Y%m%d').zip"
    Ответ написан
    3 комментария
  • Как удалить одинаковые записи?

    @Akina
    Сетевой и системный админ, SQL-программист.
    нужно удалить записи с одинаковыми date и user_id

    DELETE t1.*
    FROM tablename t1
    JOIN tablename t2 USING (date, user_id)
    WHERE t1.id > t2.id


    а лучше не создавать их

    CREATE UNIQUE INDEX indexname ON tablename (date, user_id)

    Выполнить строго после удаления дубликатов - иначе упадёт по ошибке.
    Ответ написан
    Комментировать
  • Есть ли разница в этих запросах SQL с join?

    Stalker_RED
    @Stalker_RED
    Разницы в результате не будет.
    Разницы в производительности не должно быть, если корректно отработал оптимизатор запросов.
    На простых запросах, типа этого, он обычно отлично справляется, но чем сложнее запрос, тем больше смысла разжевывать ему все поподробнее, указывать правильные индексы, и все такое.
    Ответ написан
    Комментировать
  • Реально ли работать в одном IT-проекте (продуктовом) больше 5-ти лет и не деградировать профессионально?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Если задачи сложные и разноплановые (особенно если повезло и иногда встречаются творческие), то никакой деградации не должно быть. Как вариант - кодить что-то своё ("пет-проект") в свободное время, изучать какие-нибудь штуки. А вообще, пока нет выгорания - не стоит переживать )) Вот как выгоришь, там и деградация, и все прочие углеводы.
    Ответ написан
    Комментировать
  • Только PHP ли такой?

    Вариант 1 - шаблонизаторы плюс рендер на стороне сервера
    Вариант 2 - RESTful API на PHP а рендер на фронте по полученным данным
    Ответ написан
    Комментировать
  • Очень быстро лить в БД 1 млн. строк в секунду и настолько же быстро читать их. Как лучше осуществить?

    @Yury093
    Конечно может, вопрос в железе. И микроскопом можно забить гвоздь.
    Но на слова "хочу быстро вставлять и быстро читать потоком" так и хочется ответить "а зачем тебе БД?"

    Поэтому хотелось бы уточнить у автора: а вот кроме описанного "вставить миллион, считать миллион" - что предполагается делать с данными? Менять их построчно? Искать по какому-то ключу? это все надо? Если нет - я бы все же рекомендовал не использовать БД.

    Тут следует понимать что любая нормальная БД это [почти] всегда двойная запись на диск: вы пишите в таблицу И в лог базы данных. Именно поэтому файл или Kafka или иной MQ будет всегда быстрее.

    Ну а если БД все равно нужно - ну тогда BULK режимы вам в помощь. Обычно они используются для пакетной инициализирующей загрузки. В некоторых БД они на время своей работы могут отключать какие-то фичи или даже логирование в лог транзакций.
    ----------------------------
    Вообще по всем признакам в вашем случае идеальным будет вариант писать в MQ (RabbitMQ или Kafka или см аналоги), а уже из нее в БД. "Все так делают", по крайней мере в крупных компаниях это довольно типовое решение для подобных вашей задач. Причем БД в этой истории нужна только если вам потом нужно хранить и селектить. Если после первой операции данные вам более не нужны, либо нужен только бэкап, то БД не нужна - пишите в файл, пакуйте в zip (в энтерпрайзе - кидайте файлы в Hadoop в каком нибудь Parquet формате).
    Ответ написан
    1 комментарий
  • Как хранить и управлять большим количеством скриптов под разные задачи?

    karabanov
    @karabanov Куратор тега Linux
    Системный администратор
    Подойдёт.
    Ответ написан
    Комментировать
  • Как разместить сайт не по корневой ссылке?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Запрос обрабатывает веб-сервер, он и принимает решение что делать дальше — передать «в React» или «в WordPress». React, разумеется, запросы на /blog перехватывать не должен.
    Ответ написан
    2 комментария
  • Как в Postgres скрыть из списка базы данных, которые не доступны пользователю?

    @Xtensive
    Если не залезать в глубь системной БД postgres - никак.

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

    Быстрый поиск даёт такой и такой ответы на SO.

    Во втором варианте предлагают у простого пользователя отнять права на Select из Information Schema в системной БД. К сожалению такие действия могут привести к непредсказуемым последствиям.

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