Ответы пользователя по тегу MySQL
  • Как связать новость на одной странице с ее развернутой формой на другой?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Поднимаем глаза наверх. Только не к Небу, а чуть ниже. К адресной строке своего браузера (пока она ещё там есть, и её не отменили улучшаторы из компании альфабет).
    И - о чудо! - видим там ссылку вида qna.habr.com/q/1077518
    Казалось бы, что могут означать эти загадочные цифры?.. ;-)
    spoiler

    Для "моего первого скрипта на пхп" правда там будет не /q/1077518, а news.php?id=1077518.
    После чего в скрипте news.php вожделенное число будет доступно в переменной $_GET['id']
    Содержимое которой можно будет использовать для запроса строки из БД.
    Только не так как это показано во всех видео на ютубе, а нормально:

    $query = "SELECT * FROM news WHERE id=?";
    $stmt = $conn->prepare($query);
    $stmt->bind_param("s", $_GET['id']);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();


    в переменной $row будет содержимое нужной строки из БД


    А так-то вопрос, конечно, про SQL ;-)
    Ответ написан
    Комментировать
  • Как корректно реализовать автовход пользователя на сайт?

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

    поэтому надо в таблицу users добавить поле autoenter, и если пользователь выбирает автологин, то в него записывать значение bin2hex(random_bytes(16)); и его же записывать в куку.
    Ответ написан
  • Как сделать дамп большой базы данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ написан
    Комментировать
  • Хранение значений массива в БД?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это задание, а не вопрос.
    Ответ написан
    5 комментариев
  • Как правильно составить запрос к БД?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Стандартный способ:
    SELECT count(*) FROM shop LEFT JOIN shopData ON shopData.shop_id=shop.id WHERE shopData.shop_id IS NULL

    Но следующий способ должен быть быстрее
    SELECT count(*) FROM shop WHERE NOT EXISTS (SELECT 1 FROM shopData WHERE shop_id=shop.id)
    Ответ написан
    2 комментария
  • Как сделать запрос через тройную связь, при это получая все связанные значения 3 таблицы в массив к 1 записи?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    GROUP_CONCAT()
    Но это редко бывает полезно поскольку обычно нужны не только названия ролей, но и их идентификаторы
    Если хочется "одной строчкой", то надо осваивать продвинутые ORM типа Doctrine
    Ответ написан
    Комментировать
  • Как перебрать все значения строки разделенные запятой в mysql?

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

    И тогда вопроса как прочитать значение никогда не возникнет
    Ответ написан
    4 комментария
  • Сколько времени должен занимать такой запрос MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Я не очень понимаю во всех этих AWS, но расход памяти в три гига - это какая-то чушь.

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

    Вообще цифры странные. Полное ощущение что индекс не влезает в память и идёт постоянная работа с диском. Но тогда должен процессор зашкаливать. А он на 5 процентах. Вот не понимаю я эти ваши авс.
    Ответ написан
  • Почему в базу записываются иероглифы?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хрестоматийный пример того, как не надо задавать вопросы.

    "Я там что-то сделал, получилось каля-маля. Колеса в разный цвет красил. Не помогает".

    Буквальный ответ на вопрос из заголовка: потому что кодировка данных не совпадает с той, которую ждёт база.
    Ответ написан
    Комментировать
  • Как перейти с mysql на elasticsearch?

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

    На основе этого сервиса сделать полнотекстовый и фасетный поиск.
    А текущую базу данных оставить как есть. Только запросы оптимизировать, чтобы "скорость работы не понижалась"
    Ответ написан
    3 комментария
  • Безопасность кода 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;
    }
    Ответ написан
    Комментировать
  • Как сделать кэширование запросов в Mysql 8?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Альтернатива только в использовании MariaDB.
    Ответ написан
    2 комментария
  • Как выполнить sql скрипт, который хранится в файле.sql, в файле питона используя библиотеку pymysql.connect?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    4. После размещения вопроса пользователю запрещается осуществлять:
    4.1. Дублирование вопроса, который уже размещался на страницах Сервиса. В том числе и в случае, если вопрос был удалён модератором, или на вопрос не был дан ответ (т.е. категорически запрещается дублирование вопроса с целью повторного привлечения к нему внимания).
    Ответ написан
    Комментировать
  • Почему mysqli_query всегда возвращает false?

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

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Проще всего будет действительно через шелл скрипт ("файл с расширением sh"), причем даже записывать эту команду в файл не обязательно, а можно просто выполнить в консоли:
    for file in `ls /path/to/files/*.sql`; do mysql -uUSER -pPASSWORD DATABASE < $file ; done

    здесь mysql - это консольный клиент mysql
    Ответ написан
  • Почему при экспорте средствами crm в файле базы mysql теряются кавычки?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если отбросить все фантастические версии, типа различий между операционными системами Centos и Ubuntu, то ошибка Duplicate entry '1' for key 'cb_tmp_acc_buttons.PRIMARY' при явном указании значения автоинкрементного поля в запросе может быть вызвана двумя причинами:
    1. в дампе дублируются значения id
    2. после установки БД уже заполнена какими-то значениями.

    Оба варианта легко проверить и исправить. В первом случае обращаться к авторам программы или поправить руками, во втором - сначала очистить базу.

    С кавычками же - это однозначно к авторам этой кривой программы.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это называется полнотекстовый поиск.
    В самом примитивном варианте создаётся fulltext index на поля, по которым будем искать. При этом база данных берет каждую запись в таблице, разбивает её на слова, записывает их в индекс и для каждого слова указывает - в каких строках таблицы оно встречается.
    После этого можно сделать запрос по нескольким словам.
    Например,
    SELECT * FROM goods WHERE MATCH(name) AGAINST ('+выключатель +белый' IN BOOLEAN MODE);

    найдёт таки все белые выключатели

    Но встроенный в MySQL полнотекстовый поиск работает так себе и обычно пользуются внешними системами, Spinx Search или Elasticsearch
    Ответ написан
    4 комментария
  • Как оптимизировать sql запрос (MySQL)?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    проблематика в том, что первая таблица (visits), где я делаю выборку по office, даёт сразу много результирующих данных.

    Не факт. БД mysql умеет исправлять самые грубые ошибки, и вполне может переписать запрос так, чтобы не payments джойнилась к visits, а наоборот - как и должно быть.

    (1) индексы на нужных полях есть
    (2) у поля p.date индекса нет


    Я один здесь вижу взаимоисключающие параграфы?

    В общем, добавить индекс на поле date
    И поменять запрос, чтобы payments была первой, а вместо date() нужная дата выбиралась через BETWEEN
    Ответ написан
    Комментировать
  • Что пришло на смену кэшу запросов в Mysql?

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

    Ну или использовать MariaDB, там кэш пока ещё остался.
    Ответ написан
  • Как лучше сделать сохранение в базу данных из нескольких запросов для одинаковых полей в базе данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это какой-то ужас.
    Я не знаю, вопрос звучит как "Мне надо надеть штаны на голову и выйти погулять. Я думаю продеть в штанины руки, зайти в туалет, облиться холодной водой, высохнуть, надеть штаны на голову и идти гулять. Вот только боюсь простудиться, потому что вода холодная".

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

    Надо сделать отдельную таблицу, где будут разные поля, которые привязываются к пользователю по его id. И никаких проблем при редактировании этих полей никогда не будет.

    Я имею в виду что должна это быть одна таблица, которая линкуется к текущей по связи один-ко-многим: таблица из трех колонок - id, user_id и собственно то значение, которое надо менять. Таким образом подмножество этой таблицы с одним и тем же user_id будет представлять из себя то самое "поле", которые вы пытаетесь редактировать сейчас. Но при этом все элементы будут лежать в отдельных строках, и редактироваться обычными SQL запросами.
    Ответ написан
    Комментировать