Задавайте вопросы, мы ответим
Вы не зашли.
Здраствуйте.
Запутался я в очередной раз.
Все данные передаваемые запросу через mysql_escape_strint попадают в запрос и в бд соответственно. И вот заметил что " не экранируется. Магические кавычки на сервере лично вырубал, но вопрос безопасно ли это? уже такая кучемала в голове по вопросам что можно, а что нельзя делать в БД и разрешать юзерам делать...
Также вопрос по индексам. Вот есть у меня форум. Там всё мило, номер топика, номер поста, автор, всякие там атрибуты... всё в своих индексах в соответствии с запросами, НО поле текста самого с типом text и оно не попадает под "класические" индексы. Сделав индекс ему fulltext в запросах это не ощущается. Если сделать explain запроса то он не выдает Using Index. Как это решить не подскажите?
Заранее спасибо.
Неактивен
Магические кавычки правильно, что вырубили, см. статью http://webew.ru/articles/198.webew
Что значит " не экранируется? Если бы не экранировалась, то Вы бы получили синтаксическую ошибку при выполнении запроса. В базе конечно должно знаниться в обычном виде.
Никак не сделать в общем виде индекса на text-поле. А какие конкретно запросы и что именно хотите добиться?
Неактивен
То есть я в пхпmyadmin вижу что в поле например:
---
текст текст цитата: "ля ля ля"
---
а разве правильно должно быть не
---
текст текст цитата: \"ля ля ля\"
---
?! Просто нас несколько людей на проекте, и один сделал вставку данных в бд с "слешированием" кавычек, а у меня везде без, вот и запутался. Что правильно и что безопасно, а что нет соответственно.
Ну пример опять же: "SELECT * FROM `forum`.`post` WHERE `tid`= 1"
Выбираем все сообщения для топика с ID 1.
Структура таблицы:
fid int(8)
tid int(8)
pid int(8)
aid int(8)
text text
date datetime
editdate datetime
st enum
Опять же насколько мне говорили на форуме softtime если сделать EXPLAIN запроса, то должно писать в extra типа "Using where; using index; using filesort", а у меня:
id = 1
select_type = SIMPLE
table = post
type = ALL
possible_keys = null
key = null
key_len = null
ref = null
rows = 435
Extra = using where
Может мне чепуху сказали на софттайме? Просто там четко сформулировали что при explain должны выводиться параметры индексов (ключ, его размер и т.п.) и соответственно в extra должно встречаться Using Index
Мол иначе без использования индексов запрос довольно медленно будет исполняться и т.п. Нам сейчас к сожалению не проверить реальной нагрузкой устойчивость этого отсутсвия индекса, но всё же хотелось бы знать истину. Потому что есть ряд запросов, которые работали по 3-6 сек, после оптимизации с помощью создания индексов добились, чтобы в первый раз работал за 0.5 - 0.6, а потом из кеша ещё быстрее (сложный запрос на 5 таблиц и кучу подсчетов).
Отредактированно Proger (25.10.2008 16:02:29)
Неактивен
Правильно и безопасно делать "слеширование" с помощью специальных функций: например, в php это mysql_escape_string(), т.к. нужно экранировать не только двойные кавычки, но и одинарные:
Неактивен
Индексы такие:
pid (номер сообщения автоинкремент) PRIMARY
Потом индекс gid, в нём все поля кроме текст
и поле text с fulltext.
А как ключ на tid сделать, если он же должен быть уникальным для каждого поста. А tid номер топика. То есть в одном же топике не одно же сообщение. Сразу поясню что fid это номер форума где топик и пост, а aid это ид автора поста. st - системный статус сообщения. date, editdate дата создания/редактирования сообщения.
Я тут вообще где-то вычитал, что индекс fulltext нужен в большинстве для полнотекстового поиска, который я не использую...
Насчет "слеширования" видимо в отдельном скрипте, где " как-то не так через mysql_escape_string проходят, я посмотрю. Главное что теперь знаю как должно быть и уверен в этом. Не будет путаницы в дальнейшем. Спасибо.
Правда маленькая неясность:
Что значит " не экранируется? Если бы не экранировалась, то Вы бы получили синтаксическую ошибку при выполнении запроса. В базе конечно должно знаниться в обычном виде.
Что всё-таки в конечном результате через phpmyadmin или mysql query browser я должен видеть в полях? " или \" ???
Отредактированно Proger (26.10.2008 09:32:09)
Неактивен
Через phpmyadmin должны видеть все в оригинальном виде, без лишних слешей.
Ключ на tid сделать: ALTER TABLE имя_таблицы ADD KEY(tid);
При это он не обязательно уникальный. Еще рекомендую прочитать про составные ключи.
Неактивен
хм... ну и получил в итоге при EXPLAIN: extra: Using where; Using filesort, key: tid
Вроде как он обратился к этому индексу, но как-то странно...
ЗЫ кстати я думал что такой одинарный индекс ничем не поможет. Спасибо, буду знать такой "приём"
Неактивен
хм... ну и получил в итоге при EXPLAIN: extra: Using where; Using filesort, key: tid
Что, прям вот на прямой обычный SELECT показывает filesort? наверняка у Вас там в WHERE или ORDER BY какая-нибудь составная операция есть.
Неактивен
я сделал как в рабочем скрипте... вывод конкретного топика... WHERE `tid` = 24
Неактивен
Вы можете весь запрос привести? (интересно, откуда filesort)
Неактивен
Да конечно... если нужно могу дать дамп.
Запрос про который я говорил это
Неактивен
В таком случае нужен составной ключ:
Неактивен
Спасибо!
Неактивен