Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » MySQL » Как исправить SQL запрос в плагине?

Как исправить SQL запрос в плагине?


     31.08.2020    Все вопросы » MySQL    121

вопрос
Пишу свой плагин для новостей, и в разделе "Действия в MySQL" при установке модуля нужно чтобы в таблице если не существует столбец, то он был создан. Если существует, то нужно перейти к следующей строке SQL запроса.
Такая команда выдаёт ошибку при установке модуля:
ALTER IGNORE TABLE `{userprefix}_post` ADD COLUMN `status` int(10) NOT NULL;

Ответа пока нет


14 комментариев

LazyDev
PHP-developer

LazyDev - 31 августа 2020 11:46 -

Убрать IGNORE, начиная с MySQL 5.7.4 для запроса ALTER TABLE оно было убрано, и при использовании IGNORE будет выдавать ошибку.
Сделай по другому. Перед этим запросом используй еще один
ALTER TABLE `{PREFIX}_post` DROP IF EXISTS `status`;

И используй PREFIX а не USERPREFIX для таблиц новостей.

Мой блог: LazyDev.pro

Если мне не интересен вопрос - не помогаю, и за этим по контактам прошу не писать.

Nesterovich2797
Юзер

Nesterovich2797 - 31 августа 2020 12:40 -

Использовать
ALTER TABLE `{PREFIX}_post` DROP IF EXISTS `status`;

можно, но мне нужно, чтобы после удаления и при повторной установке плагина, столбец status не перезаписывался, а сохранялся

LazyDev
PHP-developer

LazyDev - 31 августа 2020 15:39 -

Nesterovich2797, тогда нужно писать более сложный запрос
DELIMITER $$
CREATE PROCEDURE addStatusColumn()
BEGIN
    IF NOT EXISTS(SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '{PREFIX}_post' AND column_name = 'status')
        THEN
            ALTER TABLE `{PREFIX}_post` ADD COLUMN `status` int(10) NOT NULL;
END IF;
END $$
DELIMITER ;
CALL addStatusColumn();
DROP PROCEDURE addStatusColumn;

Мой блог: LazyDev.pro

Если мне не интересен вопрос - не помогаю, и за этим по контактам прошу не писать.

Nesterovich2797
Юзер

Nesterovich2797 - 31 августа 2020 15:41 -

Ошибка: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER $$ CREATE PROCEDURE addStatusColumn() BEGIN IF NOT EXISTS(SELECT N' at line 1

LazyDev
PHP-developer

LazyDev - 31 августа 2020 16:02 -

Nesterovich2797, понял, плагины не умеют в такие запросы.

Мой блог: LazyDev.pro

Если мне не интересен вопрос - не помогаю, и за этим по контактам прошу не писать.

LazyDev
PHP-developer

LazyDev - 31 августа 2020 16:07 -

Nesterovich2797, вот для плагинов запрос, должен работать
DELIMITER //
CREATE PROCEDURE addStatusColumn()
BEGIN
    IF NOT EXISTS(SELECT NULL FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '{PREFIX}_post' AND column_name = 'status')
        THEN
            ALTER TABLE `{PREFIX}_post` ADD COLUMN `status` int(10) NOT NULL;
END IF;
END //
DELIMITER ;
CALL addStatusColumn();
DROP PROCEDURE addStatusColumn;

Мой блог: LazyDev.pro

Если мне не интересен вопрос - не помогаю, и за этим по контактам прошу не писать.

dj-avtosh
PHP-developer

dj-avtosh - 31 августа 2020 16:37 -

сейчас окажется, что у него права у юзера мускуля ограничены.

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

Nesterovich2797
Юзер

Nesterovich2797 - 31 августа 2020 16:41 -

Собственно, всё та же ошибка
Ошибка: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER // CREATE PROCEDURE addStatusColumn() BEGIN IF NOT EXISTS(SELEC' at line 1

Он у меня на INFORMATION_SCHEMA.COLUMNS до всех ваших советов ругался, когда я сам пытался что-то написать. Может в нём дело или действительно прав каких-нибудь не хватает. Тогда где их нужно выставить?

LazyDev
PHP-developer

LazyDev - 31 августа 2020 17:45 -

Nesterovich2797, значит нет прав.

Мой блог: LazyDev.pro

Если мне не интересен вопрос - не помогаю, и за этим по контактам прошу не писать.

Nesterovich2797
Юзер

Nesterovich2797 - 1 сентября 2020 08:48 -

Проверил, все права есть

dj-avtosh
PHP-developer

dj-avtosh - 1 сентября 2020 10:56 -

на сколько я помню, DELIMITER не относится к api mysql.

Поэтому тут нужно попытаться сделать на php (внутри самого плагина), что-то вроде сперва проверки на существования поля

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'tbl_name'
AND table_schema = 'db_name'
AND column_name = 'column_name'


а потом на создание, если ничего не вернулось в ответ по ней.

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.): @blob42
В телегу писать сразу задачу и бюджет.

Nesterovich2797
Юзер

Nesterovich2797 - 2 сентября 2020 14:34 -

Спасибо, попробую. Странно что функционал плагинов это не позволяет сделать

LazyDev
PHP-developer

LazyDev - 2 сентября 2020 14:57 -

Nesterovich2797, позволяет.

Мой блог: LazyDev.pro

Если мне не интересен вопрос - не помогаю, и за этим по контактам прошу не писать.

Nesterovich2797
Юзер

Nesterovich2797 - 2 сентября 2020 15:34 -

Тогда какой запрос должен сработать. Проверил, у меня все права на БД в mySQL выданы. И все вышеперечисленные запросы через Плагин- Действия в MySQL не работают.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх