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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Отвечу на вопрос "почему".
    Потому что приведение типов.
    Строка "FALSE" - это не булево значение FALSE, а строка, 5 букв. Не имеющая никакого отношения к булевым значениям или числам. Присравнении с числом и РНР и mysql пытаются привести строку к числу. При этом из строки "FALSE" получается 0. И поэтому сравнение "работает". Но разумеется так сравнивать нельзя.

    Строка "TRUE" - это, как уже должно быть понятно, не булево значение TRUE, а строка, 4 буквы. Не имеющая никакого отношения к булевым значениям или числам. Присравнении с числом и РНР и mysql пытаются привести строку к числу. При этом из строки "TRUE" получается 0. И поэтому сравнение "не работает". Если передать не строку а булево значение TRUE, то сработает.

    Поскольку в mysql нет типа поля boolean, лучше всего не выпендриваться с TRUE и FALSE, а просто передавать 0 и 1.
    Ответ написан
    Комментировать
  • Как поменять значение в mysql через какое-то время?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Никак не делать.

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

    И в запросе на получение статуса просто учитывать дату. Если проверен и прошло меньше месяца - то проверен.
    Иначе - не проверен.
    Ответ написан
    2 комментария
  • Как правильно делать апдейт временных таблиц в цикле foreach?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это какой-то ужас, а не код. Здесь всё неправильно.

    Не нужно никаких временных таблиц, не нужно multi_query (эта функция вообще никогда не нужна). Запросы надо исполнять с помощью подготовленных выражений.

    Запрос нужен всего один.
    $sql = "INSERT INTO texts SELECT null, page_id, ballon_no, text_lang, font_size, html_left, 
            html_top, html_width, html_height, ?, rotate, text_align, aspect_ratio,
            position_ratio, calc_width, calc_left, font_color, line_height, font_type 
            FROM texts WHERE id=?";
    $stmt = $link->prepare($sql);
    $stmt->bind_param("ss", $text, $id);
    foreach ($array as $id => $text) {
        $stmt->execute();
    }
    Ответ написан
  • Как правильно получить WHERE страницы?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не лез бы ты в абстрактные классы пока.

    А если по теме, то тебе же ведь уже раз 5 объясняли как пользоваться твоим собственным классом БД

    $sql = 'UPDATE `' . static::getTableName() . '` SET `views` = `views` +1 WHERE id=?';
    return $db->query($sql, [$article->id]);


    Подставлять надо не урл, а найденный выше id
    Ответ написан
  • AJAX, PHP, SQL обработка данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    С третьей попытки осилим дописать этот черезвычайно сложный код
    $sql = 'SELECT * FROM `tasks` WHERE `id`= :id' ; // запрос вроде бы правильный
    $query = $pdo->prepare($sql);
    $query->execute(['id' => $id]); // а выполнить забыли
    echo json_encode($query->fetchAll(PDO::FETCH_OBJ)); // ой, а while оказывается не нужно!
    Ответ написан
  • Хорошо ли хранить serialize в БД?

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

    И не надо слушать советчиков из соседних ответов.
    Увы, поколение милленниалов не умеет воспринимать письменный текст, и реагирует в лучшем случае на пару ключевых слов в вопросе, не воспринимая корнтекст. Который, чтобы было понятно, звучит так: Нашел у папы в сарае заряженнвую двустволку. Прикладом очень удобно орехи колоть. Это удобнее потому что из щипцов орехи вываливаются. Нормально ли колоть орехи заряженным ружьем?

    Сериализованные данные стоит хранить в бд только в очень крайнем случае.
    На данном этапе вообще забудь про такую возможность и учись работать с БД правильно.
    Ответ написан
    9 комментариев
  • Какая вставка в бд будет быстрее? Задать в insert значения к столбцам либо использовать default?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Господи, опять оптимизируем несуществующие проблемы

    Десятки тысяч в минуту это вообще не о чём.
    На моей рабочей пукалке с дешевым ХДД 10 тысяч вставляются за пол-секунды. Обычными подготовленными запросами.
    На нормальном сервере с SSD будут сотни тысяч. в секунду. про минуты вообще речи не идет.

    Что ж вы все так стараетесь решить воображаемые проблемы-то?
    причем самым дурацким способом - высасываете из пальца самую незначительную деталь, которая вообще никак ни на что не влияет - и давай её оптимизировать.

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

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

    Если же хочется сделать по-настоящему список популярных товаров, то показывать надо не то что искали, а то что покупали. По списку заказов ищутся товары, встречающиеся чаще всего
    Ответ написан
  • Как выглядит и работает фильтрация PHP POST & GET?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Как выглядит и работает фильтрация PHP POST & GET?

    Никак.
    Я понимаю, что это утверждение не укладывается голове у человека, изучавшего пхп по видеокурсам, но это факт.
    Сами по себе НТТР запросы POST & GET никакой угрозы не несут и как-то заранее фильтровать их не надо.

    Фильтровать вообще надо не по принципу "откуда", а по принципу "куда".
    Данные надо форматировать в зависимости от того, куда они пойдут, а не откуда они пришли. SQL запросу абсолтно фиолетово, откуда взялась кавычка в данных - из GET, файла на диске, или из другой базы данных. Данные для SQL надо правильно форматировать не потому что они пришли из GET, а потому что они идут в SQL.
    (При этом надо также понимать, что SQL запрос и база данных - это не одно и тоже. Базе тоже по барабану, что в ней лежит. Любое форматирование мы делаем только для SQL запроса, а в базе данные снова должны быть как есть).

    Я думал, что будут удаляться все кавычки и теги,а по факту они остаются.

    Если бы все думали, как ты, то ты бы не смог задать свой вопрос на Тостере. Потому что без кавычек и тегов он превратился бы в бессмыслицу. Как и куча любых других вопросов.
    Разумеется, "мусор" надо не удалять, а форматировать. Потому что это "мусор" только для SQL, а для человека это нужная информация, которая помогает читать текст.

    Не использовать же для этого регулярки?

    Нет, разумеется.
    Использовать регулярки будет так же глупо, как и твою функцию.

    Для того, чтобы поместить переменную в SQL запрос, надо использовать подстановки в подготовленных выражениях. Запомни это предложение. Оно важнее всего, что ты до сих пор успел узнать про пхп. Хорошоенько запомни, ты должен это знать лучше, чем зовут маму с папой. И никогда не отступать от этого правила. Не важно - нужна тебе защита от SQL инъекций или не нужна, из POST-а ли пришли данные, или Господь бог тебе их надиктовал на горе Синайской - все равно всегда и везде только через подстановки.

    Поэтому.
    1. Выкидываешь свою функцию на помойку. Единственное слово, которое там имеет там хоть какой-то смысл - это trim(). Ну так ты можешь вызывать её напрямую.
    2. Судя по уровню кода и вопроса, для работы с бд ты используешь убогую mysqli. Поэтому забудь вообще про mysqli_query(), а все запросы, в которых используется хотя бы одна переменная, выполняешь только так
    $stmt = $conn->prepare("INSERT INTO tablitsa (login_name,email) VALUES (?,?)");
    $stmt->bind_param("ss", $login, $email);
    $stmt->execute();

    Подробнее можешь почитать в интернете.
    3. При выводе пользовательских данных в HTML, используешь функцию htmlspecialchars(). Надеюсь, к этому моменту ты уже понял главную мысль - важно не откуда пришли данные, а куда. Идут в хтмл? Отлично, форматируем их для хтмл.
    Ответ написан
    6 комментариев
  • Выборку дублирующих email адресов в sql?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну, запрос, конечно, без индекса, но один раз запустить можно

    SET SESSION group_concat_max_len = 10000000;
    select replace(replace(email, '.',''),'+',''), group_concat(email), count(1) cnt
    from table 
    group by replace(replace(email, '.',''),'+','') 
    having cnt > 1
    order by cnt desc
    Ответ написан
    1 комментарий
  • SQL выводим количество одинаковых значений?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    select login, count(*) cnt from таблица group by login having cnt > 1 order by cnt desc
    Ответ написан
    Комментировать
  • Поиск по началу слова sql и php?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Если "дохнет" значит "работает медленно", то поставить индекс.
    Если дохнет значит перестает работать но ошибок не выдает - надо включить вывод ошибок, прочесть и исправить.
    Ответ написан
  • Универсальный метод обновления данных в БД?

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

    После этого ты можешь использовать их для формирования динамических запросов.
    Например так: https://phpdelusions.net/pdo_examples/dynamical_update

    $allowed - это твой список полей.
    $_POST лучше не использовать напрямую, а передавать копию в метод, но принцип тот же - берем из поста только заполненные поля и добавляем в запрос.

    Метод Update будет у класса-предка, от которого будут наследоваться классы дл работы с отдельными сущностями, такими как article. Таким образом в классе Article у тебя вообще не будет метода Update, но при этом ты будешь писать

    $article->update($_POST);

    и все будет прекрасно обновляться.
    Ответ написан
    1 комментарий
  • Как вывести данные из базы в формате JSON (с помощью php)?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ответ на вопрос Как вывести:

    echo json_encode($result->fetch_all(MYSQLI_ASSOC));


    Но проблема в том, что у тебя нет еще никаких данных, ты запрос ещё не составил.

    Чтобы узнать, как написать запрос, который вернёт нужные данные, задай отдельный вопрос.
    Ответ написан
    Комментировать
  • Как получить уникальные значения JSON массива из ячейки MySQL?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Не надо хранить в базе данных " массивы значений в JSON'е".
    MySQL - реляционная датабаза. Это означает, что база данных строится из связанных таблиц.
    И вместо колонки values должна быть отдельная таблица,
    table_id | value
    1 | 1
    1 | 2
    1 | 3
    2 | 2
    2 | 3
    2 | 4

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    JSON
    Ответ написан
    Комментировать
  • Можно ли хранить SQL запрос в переменной сессии PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Это совершенно бессмысленно.

    Вообще, есть простое правило: не следует усложнять код на пустом месте.
    Любой код должен всегда решать кокретную, существующую проблему. "Я тут подумал" - это не проблема. Поэтому решать её не надо.
    Ответ написан
    Комментировать
  • Присвоить id в обратном порядке?

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

    Если шаловливые ручки тянутся потрогать id, то это может означать только две вещи
    - либо надо надавать по ручкам линейкой и объяснить владельцу, что уникальный идентификатор - это не цыферька для красоты, а идентификатор, намертво привязанный к строке в БД, который никогда не меняется, и умирает вместе с ней.
    - либо уникальный идентификатор для этой таблицы вообще не нужен, и его надо убрать
    Ответ написан
    4 комментария
  • Как отобразить комментарий под статьёй, под которой его написали, через PDO PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    $stmt = $db->prepare('SELECT * FROM comments WHERE article_id = ?');
    $stmt->execute([$_GET['post_id']]);
    $comments = $stmt->fetchAll(PDO::FETCH_OBJ)


    И дальше уже выводишь из массива $comments в разметке. Самый простой пример: phpfaq.ru/tpl
    Ответ написан
  • Что почитать по составлению безопасных sql запросов?

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

    И еще бы добавил что эти правила должны соблюдаться безусловно, в 100% процентов случаев, без рассуждений типа "вот эти данные у нас безопасны, их можно не защищать".

    Если же говорить о тенденциях, то с чистым SQL сейчас никто практически не работает. 95% запросов выполняются через ORM. Т.е. вместо
    $stmt = $pdo->prepare("SELECT * FROM user where id = ?");
    $stmt->execute([$id]);
    $user = $stmt->fetch();

    пишем просто
    $user = User::find($id);
    при этом защита уже вшита у ORM внутри и думать о ней не надо

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