Ответы пользователя по тегу MySQL
  • Ошибка: 150 «Foreign key constraint is incorrectly formed» при создании новой таблицы?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это дебильное сообщение об ошибке, но если выполнить команду SHOW ENGINE INNODB STATUS, то там, под заголовком LATEST FOREIGN KEY ERROR будет нормальное объяснение, что конкретно не так.
    Ответ написан
    Комментировать
  • Как сохранить mysql базу?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    На будущее, формат, в котором сохраняется БД, называется "дамп".
    А дальше всё просто, как сохранить дамп в mysql workbench
    Ответ написан
    Комментировать
  • Объясните CASE WHEN THEN?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 0 WHERE ad_id = 34');
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 1 WHERE ad_id = 35');
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 2, amount=466 WHERE ad_id = 36');

    И не делайте себе мозги.
    Вы и сейчас-то смотрите на этот запрос как баран на новые ворота. А через месяц и вовсе перестанете понимать, что имели в виду.
    Ответ написан
    Комментировать
  • Как скрестить ElasticSearch и MySQL?

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

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

    Дружат их элементарно, к примеру на РНР пишется простой индексатор, который по крону читает данные из Mysql и обновляет индексы в Эластике.
    https://www.elastic.co/guide/en/elasticsearch/clie...

    А то что в теле вопроса написан бред - ну так это автор явно имел в виду нормальный вариант, но недоспал/перебрал и перепутал направление.
    Ответ написан
  • Как получить доступ к БД mySQL через терминал?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы соединиться с удаленным сервером, Mysql устанавливать не надо.
    Через терминал сначала соединяются с терминалом удаленного сервера по SSH. В общем случае это выглядит так
    ssh user@host.com

    Дальше вводите пароль, и если всё ок, то вы в своем терминале работаете с сервером хостинга.
    и уже на нем пишете своё
    mysql -u -p -h -P

    Но через терминал работать хотя и полезно уметь, но иногда не очень наглядно.
    Лучше поставить какую-нибудь графическую утилиту - DataGrip, Dbeaver, что-то из этой серии
    А для работы с удалённой БД можно будет поднять SSH туннель

    ssh -N -f -L 3366:127.0.0.1:3306 user@host.com
    вводите пароль и готово! можете соединяться с удалённым сервером хоть в консоли, хоть из любой программы. Только порт надо указывать 3366.
    Ответ написан
    3 комментария
  • Что сработает быстрее, что лучше использовать?

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

    Когда у вас выполняется запрос
    SELECT * FROM users WHERE DATE(created_at) = '2024-04-14'
    то СУБД должна пройти весь индекс до конца, получить каждое значение created_at, применить к нему функцию, сравнить с переданным значением, и добавить строку в результат запроса.

    Когда у вас выполняется запрос
    SELECT * FROM users WHERE created_at BETWEEN '2024-04-14 00:00:00' AND '2024-04-14 23:59:59'

    То СУБД находит бинарным поиском первое нужное значение, потом бежит по заранее отсортированному индексу и возвращает все значения до последнего, подходящего под второе условие.
    Ответ написан
    4 комментария
  • Почему не выводит первую строку в select?

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

    Откуда вы все берете учебники с таким дебильным кодом? Тут все делается в три строчки
    $result = $mysql->query("SELECT * FROM `postavshik`");
    while ($row = $result->fetch_assoc()) {
        echo  "<option>" . htmlspecialchars($row['Name_pred']). "</option>\n";
    }

    И возьмите нормальное руководство.
    Ответ написан
    1 комментарий
  • Почему запрос возвращает пустоту?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если запрос выполняется без ошибок но не возвращает ни одной строки, это значит что в БД отсутствуют данные, подходящие под указанные в запросе условия.
    Ответ написан
    Комментировать
  • Как кучу файлов с дампами таблиц соединить в один?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Эх, молодёжь...
    copy *.sql fulldump.sql
    Ещё во времена MS-DOS можно было
    Ответ написан
    1 комментарий
  • Почему не записывает в бд?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не очень понятно, что имеется в виду под "подключением", но будем считать что речь про добавление данных в БД. Это может присходить по трем причинам:
    1. Код добавления вообще не вызывался.
    2. При добавлении произошла ошибка.
    3. Данные добавились в одну базу, а результат смотрим в другой.

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

    <?php
    # Настройка ошибок
    # Для локального сервера
    ini_set('display_errors', 1);
    # Всегда
    error_reporting(E_ALL);
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

    Добавив этот код, надо запустить свой скрипт еще раз и смотреть, ошибки, которые он выведет.

    Плюс обязательно прочесть статью https://habr.com/ru/articles/662523/
    Ответ написан
    5 комментариев
  • Как делать максимально безотказные бэкапы корня сайта и mysql в динамике?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Корень сайта непонятно зачем бэкапить, если весь код и так в репозитории.
    Mysql по живому можно бэкапить c помощью специальных утилит, таких как Percona XtraBackup
    Ответ написан
    Комментировать
  • Как правильно задать запрос UPDATE где название столбца переменная?

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

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

    Здесь нужна связанная таблица, один ко многим, и она сразу снимет все проблемы, а запросы станут мягкими и шелковистыми:

    UPDATE link_count SET count=count+? WHERE link_id=? and number=?
    Ответ написан
    3 комментария
  • Как удалить запись в таблице MySQL по трём параметрам?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы правильно удалить запись в таблице по трём параметрам, надо указать все три параметра в условии WHERE
    DELETE FROM table_name WHERE col_1=val_1 AND col_2=val_2 AND col_3=val_3


    Не два, не пять, не десять, а ровно три параметра.
    Ответ написан
    Комментировать
  • Как получить данные из строки mysqli?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы получить одну строку из результата запроса, в mysqli есть функции
    • fetch_assoc(): возвращает всю строку в ассоциативный массив
    • fetch_row(): возвращает нумерованный массив (список)
    • fetch_obj(): возвращает объект класса stdClass
    • fetch_column(): возвращает значение из первой колонки запрошенной строки

    В общем случае случае осмысленный код для получения значения единственной колонки будет таким
    $sql = "SELECT link FROM tablet where id=?";
    $result = $conn->execute_query($sql, [$a]); 
    $link = $result->fetch_column();

    Но как правильно замечено в комментариях, правильнее будет рандомизировать сразу в запросе, причем все делать одним запросом, а не тремя
    function Axelmo($conn) {
        $sql2 = "SELECT link FROM tablet ORDER BY rand() LIMIT 1";
        return $conn->query($sql)->fetch_column();
    }

    Ну и чисто для иллюстрации, как сделать запрос с ограничением по id
    function Axelmo($min, $max, $conn) {
        $sql2 = "SELECT link FROM tablet where id >= ? AND id <= ? ORDER BY rand() LIMIT 1";
        return $conn->execute_query($sql, [$min, $max])->fetch_column();
    }
    Ответ написан
    1 комментарий
  • Зависит ли скорость записи в БД от количества в ней записей?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В общем случае не зависит
    В каждом конкретном случае, если вдруг будет зависеть, надо разбираться отдельно.
    Сам по себе вопрос - это одна из тех проблем, которыми не следует забивать себе голову заранее.
    Ответ написан
    Комментировать
  • Как записать массив PHP в базу данных MySQL?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Ответ на вопрос, который вы почему-то решили вынести в заголовок (при том что, судя по тексту вопроса, вы прекрасно знаете ответ на него) - и который имеет очень мало общего с вашей реальной проблемой - уже дал Slava Rozhnev.

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

    Вариант 1, при котором никакой код менять не надо. Отключаем эти проверки устанавливая переменную mysql innodb_flush_log_at_trx_commit=0. Для этого надо обладать правами рута.
    Вариант 2: заключить все вставки в транзакцию
    Вариант 3: добавлять все записи одним запросом. Это можно сделать либо кодом Slava Rozhnev, либо запросом LOAD DATA INFILE

    Да, и между вашими вариантами 2 и три нет никакой разницы. Это один и тот же вариант, про который в любом случае надо забыть: он вообще никогда не должен применяться. Переменные должны попадать в запрос только через плейсхолдеры.
    Ответ написан
    2 комментария
  • Сколько обращений к базе данных происходит в данном коде?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Обращений" - либо 4, либо 1, в зависимости от настроек и содержимого connectdbpdo()
    "заставлять базу что-то делать" - в любом случае один.
    Ответ написан
    Комментировать
  • Возможна ли sql инъекция?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нет.
    Ответ написан
    1 комментарий
  • MySQL PDO, Почему все значения при выборке типа string?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Зачем вы задаёте не тот вопрос, с которым у вас проблема?:)

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

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вопрос с подвохом.
    Я сейчас сообразил, что узбекский - это не китайский же. Либо латиница, либо кирилица.
    То есть проблема скорее всего не в кодировке.
    А, как выяснилось в комментариях - тупо в неправильном выполнении запроса, и инъекциях.
    то есть переменные надо не напрямую пихать в запрос, а через специальные маркеры, как написано здесь https://habr.com/ru/articles/662523/

    Если же говорить про кодировки, то
    у поля (или таблицы) должна стоять не "одинаковая" кодировка, а utf8mb4
    в РНР при соединении должна устанавливаться кодировка utf8mb4
    в заголовках веб-сервер должен отдавать кодировку utf-8
    если текст пишется прямо в РНР коде, то этот код тоже должен быть в кодировке utf-8
    Ответ написан
    2 комментария