Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя
Показано с 11 по 20 из 22
  1. #11
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    То бишь, там хранится текст, который игрок сам и записывает в него.
    Да.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    И, при этом, текст привязан к предмету инвентаря
    Нет, сейчас просто привзян к книге, которая в diary. Сейчас же хочу как-то привязать к инвентарю или т.п.

    Цитата Сообщение от DeimoS Посмотреть сообщение
    И что у тебя сейчас за структура таблиц? Не очень понятно зачем две таблицы и что за привязка к игроку.
    Одна таблица, где хранится сама книга, вторая - где её записи. Раньше просто не хотел привязываться к столбцу в accounts и на будущее для, например, каких-то нововведений в книгу.

    Сейчас же, я так понял, необходимо так-же оставить всё, но не привязываться к игроку, к которому принадлежит, а чтобы книга была сама по себе. И в инвентаре, например, создать extra_int где будет хранится ID строки книги и по ней загружать остальные данные, что-ли

    PHP код:
    mysql_query(DIARY_MYSQL_CONNECTION_ID"\
                CREATE TABLE IF NOT EXISTS `diary` ( \
                `id` int(11) NOT NULL AUTO_INCREMENT, \
                `owner_id` int(11) NOT NULL, \
                PRIMARY KEY (`id`) \
                ) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;"
    false);
            
            
    mysql_query(DIARY_MYSQL_CONNECTION_ID, !"\
                CREATE UNIQUE INDEX \
                    owner_id \
                ON \
                    diary(owner_id)"
    false);

            
    mysql_query(DIARY_MYSQL_CONNECTION_ID, !"\
                ALTER TABLE \
                    `diary`\
                ADD CONSTRAINT \
                    `diary_accounts_fk_1` \
                FOREIGN KEY \
                    (`owner_id`) \
                REFERENCES \
                    `accounts` (`pID`) \
                    ON DELETE CASCADE ON UPDATE CASCADE"
    false);





    mysql_format(DIARY_MYSQL_CONNECTION_IDquery_stringsizeof query_string"\
                    CREATE TABLE IF NOT EXISTS `diary_notation` ( \
                    `id` int(11) NOT NULL AUTO_INCREMENT, \
                    `diary_id` int(11) NOT NULL, \
                    `caption` varchar(%d) NOT NULL, \
                    `contents` varchar(%d) NOT NULL, \
                    `date` date NOT NULL, \
                    PRIMARY KEY (`id`) \
                    ) ENGINE=InnoDB DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;"
    ,
                    
    DIARY_MAX_CAPTION_LENGTHDIARY_MAX_CONTENTS_LENGTH);
            
    mysql_query(DIARY_MYSQL_CONNECTION_IDquery_stringfalse);

            
    mysql_query(DIARY_MYSQL_CONNECTION_ID, !"\
                CREATE INDEX \
                    diary_id \
                ON \
                    diary_notation(diary_id)"
    false);
            
            
    mysql_query(DIARY_MYSQL_CONNECTION_ID, !"\
                CREATE INDEX \
                    date \
                ON \
                    diary_notation(date)"
    false);

            
    mysql_query(DIARY_MYSQL_CONNECTION_ID, !"\
                ALTER TABLE \
                    `diary_notation`\
                ADD CONSTRAINT \
                    `diary_notation_diary_fk_1` \
                FOREIGN KEY \
                    (`diary_id`) \
                REFERENCES \
                    `diary` (`id`) \
                    ON DELETE CASCADE ON UPDATE CASCADE"
    false); 

  2. #12
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Создаёшь таблицу со структурой
    1. id | diary_id | header | text | date

    id - это, соответственно, primary key + AUTO_INCREMENT
    diary_id - тут будет хранится ID дневника, который уже будет указываться в инвентаре и т.п.
    На diary_id и date цепляешь составной индекс (именно в порядке: diary_id + date).

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

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. Пользователь сказал cпасибо:
    execution (13.02.2021)
  4. #13
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Спасибо в очередной раз.
    Немного не понял - каким образом я тогда буду генерировать уникальный ид diary_id, если не будет бд со всеми дневниками?

  5. #14
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1. SELECT MAX(diary_id)+1 as unique_diary_id FROM table
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. Пользователь сказал cпасибо:
    execution (13.02.2021)
  7. #15
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Небольшой совет: лучше подобные запросы (CREATE TABLE IF NOT EXISTS) запускать из файла

  8. #16
    Аватар для execution
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.03.2018
    Сообщений
    255
    Репутация:
    24 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Небольшой совет: лучше подобные запросы (CREATE TABLE IF NOT EXISTS) запускать из файла
    Почему?

  9. #17
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от execution Посмотреть сообщение
    Почему?
    Меньше проблемы с экранированием / переносом строк. Легче вставить экспорт из БД

  10. Пользователь сказал cпасибо:
    execution (13.02.2021)
  11. #18
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Небольшой совет: лучше подобные запросы (CREATE TABLE IF NOT EXISTS) запускать из файла
    имхо, это работает только если запрос в будущем будет часто видоизменяться (что бывает крайне редко). В остальных случаях, как по мне, проще вставить запрос в код и забыть о нём. Ибо файл и перекидывать постоянно нужно при переезде с хостинга на хостинг (что легко забыть и тот или иной файл легко потерять), и в случае взлома хоста, взломавший легко получает доступ к этим самым файлам.


    Цитата Сообщение от tnc Посмотреть сообщение
    Меньше проблемы с экранированием / переносом строк. Легче вставить экспорт из БД
    С нормальным редактором кода, поддерживающим функцию многострочного курсора, каких-то проблем с подобным добавлением нет.

    UPD: От себя я бы добавил, что не стоит забывать о конструкции
    1. SHOW TABLES LIKE ...

    если нужно не просто проверить, создана ли таблица, а либо удостовериться в существовании таблицы, либо загрузить из неё данные.
    Последний раз редактировалось DeimoS; 14.02.2021 в 05:56.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  12. #19
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    имхо, это работает только если запрос в будущем будет часто видоизменяться (что бывает крайне редко).
    В таблицы часто добавляют новые столбцы => идет обновление структуры таблицы. Это может быть довольно часто (например: таблица аккаунтов).
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ибо файл и перекидывать постоянно нужно при переезде с хостинга на хостинг (что легко забыть и тот или иной файл легко потерять)
    Ну так не терять файл? :) Хранить его в scriptfiles и нет проблем?

    P.S: Я конечно не проверял, но mysql_tqeury_file возвращает 0 в любом другом случаи, если не получилось выполнить (например: нет нужного файла в папке) запрос. Можно добавить проверку на возвращаемое значение и выводить, что mysql_tquery_file не был выполнен.
    Цитата Сообщение от DeimoS Посмотреть сообщение
    и в случае взлома хоста, взломавший легко получает доступ к этим самым файлам.
    Если получили доступ до сервера, то тут уже никакая защита не поможет, а это проблема безопасности. Тем более, какие данные получить взломщик? Структуру таблицы? Что ему дальше с ней делать?

    P.S: Если взломали сервер, ничего не стоит подключить свой плагин и перехватить вызов mysql_connect и достать данные, так что тут нет смысла об этом говорить, что какие-то файлы лежат в корне сервера (или ещё где-то с серверными файлами)
    Последний раз редактировалось tnc; 14.02.2021 в 07:06.

  13. #20
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    В таблицы часто добавляют новые столбцы => идет обновление структуры таблицы. Это может быть довольно часто (например: таблица аккаунтов).
    Ну так в этом случае разницы между добавлением в код и добавлением в мод особой не будет. В коде тебе нужно лишь добавить обратные слэши в конец строки и заменить уже вставленный ранее запрос, а в случае с файлом, тебе нужно сначала заменить содержимое файла и потом ещё на хостинг его залить. По трудозатратам это +- одинаковые телодвижения.

    Ну и в таких случаях нужно просто изучить синтаксис запроса на создание таблицы, дабы не просить каждый раз phpMyAdmin составить новый запрос, а просто вручную добавить нужный столбец в старый.
    Либо можно просто через ALTER TABLE ADD COLUMN добавлять новые столбцы, не редактируя основной запрос на создание таблицы.

    Цитата Сообщение от tnc Посмотреть сообщение
    Ну так не терять файл? :) Хранить его в scriptfiles и нет проблем?
    Речь о том, что это лишние файлы, которые нужно постоянно подтягивать и держать в актуальном состоянии. Это, конечно, не смертельно, но если есть вариант избежать подобного, лично я лучше выберу его. Ибо добровольно создавать в своей работе лишний простор для человеческой ошибки я как-то не очень хочу.

    Цитата Сообщение от tnc Посмотреть сообщение
    Если получили доступ до сервера, то тут уже никакая защита не поможет, а это проблема безопасности. Тем более, какие данные получить взломщик? Структуру таблицы? Что ему дальше с ней делать?
    Как минимум, это открывает доступ к SQL-инъекциям.

    Цитата Сообщение от tnc Посмотреть сообщение
    P.S: Если взломали сервер, ничего не стоит подключить свой плагин и перехватить вызов mysql_connect и достать данные, так что тут нет смысла об этом говорить, что какие-то файлы лежат в корне сервера (или ещё где-то с серверными файлами)
    Вот только далеко не каждый сможет такой плагин написать :)


    В любом случае, автор сам решит какой подход ему ближе.
    Последний раз редактировалось DeimoS; 14.02.2021 в 17:19.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •