Задать вопрос
Профиль пользователя заблокирован сроком с 10 апреля 2022 г. и навсегда по причине: систематические нарушения правил сервиса
Ответы пользователя по тегу SQL
  • Почему не ищет новость в базе по заголовку?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    https://habr.com/ru/post/563530/

    Как правильно написал galaxy в комментариях, если база что-то "не находит", надо переводить обе строки в бинарное представление с помощью bin2hex() и смотреть разницу.

    и потом по результатам добавить str_replace
    Ответ написан
    Комментировать
  • Как сформировать запрос к 3-м таблицам сразу?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    с точки зрения оптимизации правильнее чтобы это была одна таблица
    тогда и дурацких вопросов задавать не придётся
    Ответ написан
    4 комментария
  • Не получается внести данные с формы в бд, хелпанете?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ написан
    Комментировать
  • Как хранить ID категорий в базе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для нормальных разработчиков, а не хипстеров, разъясняем:

    "В колонке с типом JSON" - это не современный хайповый способ, а очень редкий вариант, которые следует применять не где попало как советует тов. Rsa97, а с большой осторожностью и только в предназначенных для этого случаях: а именно, когда структура хранимых данных не определена.

    В данном же случае необходимо использовать стандартный способ со связанной таблицей. Поскольку при использовании стандартных методов хранения можно пользоваться всеми возможностями, которые предоставляет БД, такими как контроль целостности данных, компактность хранения, использование в индексах и так далее. Не говоря уже о простоте запросов и поддержке со стороны существующих библиотек.
    Ответ написан
    Комментировать
  • SQL инъекция в UPDATE возможна ли?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Инъекция может быть через любой запрос.
    И защищать тоже надо любые запросы.
    Никогда не надо торговаться, "а можно я не буду защищать именно этот запрос? Ну мааааам!"
    Надо просто всегда следовать простым правилам - любая переменная попадает в запрос только через плейсхолдер

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

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

    То есть сама уязвимость никак не зависит ни от каких второстепенных факторов - типа запроса, передаваемых данных, способов их валидации, твоих знаний SQL. Это сам факт. Можно подставить свой код в запрос? Значит он уязвим. А как конкретно можно нагадить - это отдельная тема.

    Кроме того, любая уязвимость - это всегда ошибки. Если в $id будет пусто, то запрос вызовет ошибку. Если в $id будет слово select то запрос вызовет ошибку. Если будет слово "привет", то запрос вызовет ошибку. Оно тебе надо?

    При этом разных вариантов возможных ошибок и способов воспользоваться уязвимостью - тысячи, им посвящены целые учебники и статьи. Но для того чтобы защищаться, не надо знать ни одного. Потому что защищаться надо не от отдельных способов эксплуатации, а закрывать саму уязвимость. И сделать это очень просто:
    1. Любые данные должны добавляться в запрос только через плейсхолдеры
    2. Любые другие элементы запроса должны выбираться из белого списка - заранее прописанных в нашем коде значений.


    Если вопрос "а можно я не буду защищаться?" вызван ленью, то это тоже решаемо. В принципе, лень - это очень важное качество для программиста. Главное - направить её в нужное русло.

    Если каждый раз писать по три строчки долго
    $sql = "INSERT INTO users SET email = ?, password = ?"; // заменяем на знаки вопроса
    $stmt = $db->prepare($sql); // подготавливаем запрос, получаем stmt
    $stmt->bind_param("ss", $email, $hash); // два знака вопроса - две переменных - две буквы s
    $stmt->execute(); // выполняем запрос

    То надо воспользоваться такой вещью, как программирование. И написать функцию, которая возьмет на себя всю рутинную работу.
    function prepared_query($mysqli, $sql, $params, $types = "")
    {
        $types = $types ?: str_repeat("s", count($params));
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        return $stmt;
    }

    и в итоге предыдущие 4 строчки превратятся в одну:
    prepared_query($db, "INSERT INTO users SET email = ?, password = ?", [$email, $hash]);

    или твой запрос:
    prepared_query($db, "UPDATE table SET test WHERE id = ?", [$id]);

    - просто, быстро, удобно и безопасно
    Ответ написан
    26 комментариев
  • Импорт в базу данных не работает null. В чем ошибка?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Использовать подготовленные выражения
    пруф
    Ответ написан
  • Что создать для практики Php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Начни пользоваться своими "блогом" и "соц-сетью". Сразу поймешь что пользоваться ими невозможно.
    И начинай допиливать потихоньку.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    В самом простом варианте вообще никакой инфы хранить не надо - в качестве имени папки тупо берется ид товара, и фотки заливаются в эту папку.
    Ответ написан
  • Как делать фильтрацию PHP / RestAPI / RedBeanPHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Извиниться перед заказчиком, вернуть аванс, купить учебник или оплатить достойные курсы, освоить основы программирования, основы веб-программирования, основы SQL, основый безопасности веб-приложений, основы алгоритмов, основый работы с БД из РНР, и только после этого постепенно приступать к данной задаче.

    Сейчас этот треш нельзя выкладывать в продакшен ни под каким видом.
    Ответ написан
    Комментировать
  • Почему SELECT возвращает только данные малых таблиц?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    если запрос возврашает пустоту, то в таблице нет данных.
    если ты видишь эти данные в другой программе, значит эта программа соединяется с другим сервером
    Ответ написан
    2 комментария
  • Как добавить NULL из PHP в БД MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всегд выполняй запросы только через подготовленные выражения. Это решает сразу КУЧУ проблем, включая твои страдания с null.

    По поводу же автоматизации, варианты есть, но сдается мне что в твоем случае вот эту ливерную колбасу из name1 - name30 надо порезать на кусочки и записать по-человечески в отдельные колонки. И тогда проблем автоматизировать запросы не будет.
    Ответ написан
  • Если обрабатывать множество запросов к БД в цикле, насколько правильным будет заворачивать в транзакцию каждую итерацию?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Логика зависит от логики.

    Ты должен спросить себя: если что-то пошло не так при обработке одной записи, то надо откатить изменения связанные только с этой записью, или со всем чанком?
    И получишь ответ на свой вопрос

    Если все равно, то лучше весь чанк.
    Ответ написан
    7 комментариев
  • Можно ли в запросе SELECT к одной таблице так же получить информацию о существовании записи в другой таблице?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это какая-то бессмыслица.

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

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это поиск не по двум языкам, а по одному.
    Тебе надо сначала определиться со своим вопросом, и только потом его задавать
    Ответ написан
  • Достаточно ли подготовленных запросов и и проверки на спец. символы для защиты?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну и каша.

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

    То есть эти два подхода защищают разные части запроса, и вместе гарантируют защиту.

    А htmlspecialchars вообще не имеет никакого отношения к БД
    Ответ написан
    Комментировать
  • Как получить данные из select во время транзакции?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Обычно, так же как и всегда.

    К транзакциям твой вопрос не имеет отношения. А только к тому способу, которым ты выполняешь запросы.

    Не надо пытаться запихать все запросы в один. Запросы надо выполнять по отдельности. И никаких ошибок не будет.
    Ответ написан
    Комментировать
  • Как сделать анализ и спроектировать сложный SQL-запрос?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    принцип очень простой.
    Я его использую при оптимизации тормозящих запросов, только в другом направлении.

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

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

    То есть грубо говоря сначала формируем логику, потом добавляем украшения.
    Ответ написан
    Комментировать