Ламерские вопросы

KIrilius

Suck My Nya!
Почему не было такой темы?

Задача:
Ограничить доступ к конкретной странице за исключением списка адресов.

Возиться с настройками сервера или файрвола, ради этого не хочется. Это же можно реализовать просто php-скриптом? (знаю php только на уровне изменить_код_под_себя - потому и спрашиваю) Ну или ещё как-то проще. Хэлп.

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

vega

Администратор
Сотрудники Вега-Интернет
Почему не было такой темы?

Задача:
Ограничить доступ к конкретной странице за исключением списка адресов.

Возиться с настройками сервера или файрвола, ради этого не хочется. Это же можно реализовать просто php-скриптом? (знаю php только на уровне изменить_код_под_себя - потому и спрашиваю) Ну или ещё как-то проще. Хэлп.

задача, на мой взгляд, тривиальна, поэтому просьба обойтись без советов по курению мануалов.
способов много отшить )
основа одна.. а дальше как красиво осведомить...

Код:
$ip=getenv("REMOTE_ADDR"); #IP адрес посетителя

гденибудь хранить список Ипшнегов которые находятся в бане (например текстовый файл или база данных... или сразу массив вручную заполнять)
и перебирая массив делать проверку

типа
Код:
 for($i=0; $i<count(массив); $i++){
if ($ip==массив[$i]) отшить
}
либо еще вариант в корне сайтика создать .htaccess

и там

Код:
Deny from all
Allow from 172.17.x.x
Allow from 127.0.0.1
 

KIrilius

Suck My Nya!
не, мне прям совсем всё просто нужно, поэтому 2й вариант подходит -) Спасибо.

upd:
хотя стоп, ну получил IP и что? как собственно отшить то? вопрос собственно в этом и заключался)
 

vega

Администратор
Сотрудники Вега-Интернет
не, мне прям совсем всё просто нужно, поэтому 2й вариант подходит -) Спасибо.

upd:
хотя стоп, ну получил IP и что? как собственно отшить то? вопрос собственно в этом и заключался)
второй вариант который ты выбрал будет сразу отшивать писать Fobidden

а первым вариантом много как можно

exit;

сделать редирект на сообщение о блоке

и много много как =) на что фантазии хватит
 

KIrilius

Suck My Nya!
>exit;
вооот -)

зыж
про редирект чот не подумал оО. с ним веселее будет).
 

Steeply

Skynet
Чтобы выполнить поиск по нескольким таблицам одновременно в MySql и после вывести все найденные результаты из каждой таблицы. Как написать запрос?
Предполагаю что так:

Select FROM таблица 1 WHERE условие 1
UNIT
Select FROM таблица 2 WHERE условие 1
UNIT
Select FROM таблица 3 WHERE условие 1


или же

Select FROM таблица 1, таблица 2, таблица 3, WHERE условие 1
 

vega

Администратор
Сотрудники Вега-Интернет
Чтобы выполнить поиск по нескольким таблицам одновременно в MySql и после вывести все найденные результаты из каждой таблицы. Как написать запрос?
Предполагаю что так:

Select FROM таблица 1 WHERE условие 1
UNIT
Select FROM таблица 2 WHERE условие 1
UNIT
Select FROM таблица 3 WHERE условие 1


или же

Select FROM таблица 1, таблица 2, таблица 3, WHERE условие 1
(SELECT id , name FROM table_1) UNION ALL (SELECT id , name FROM table_2) WHERE условие ORDER by поле...

? :mellow:
 

Steeply

Skynet
(SELECT id , name FROM table_1) UNION ALL (SELECT id , name FROM table_2) WHERE условие ORDER by поле...

? :mellow:
НУ если следовать примеру из документации то
(SELECT a FROM table_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM table_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10)
ORDER BY a;

P.s. если использовать ALL то может быть повторение одной и той строки несколько раз.


Я то че спрашиваю, Есть ли еще способ организовать запрос на поиск нужной инфы, используя как можно меньше запросов и текста.
Эт конечно все хорошо когда таблиц 2-3.
А если выборку делать из 15 -20 таблиц? Замучаюсь эти Селекты писать.
 

sami

Местный
Я то че спрашиваю, Есть ли еще способ организовать запрос на поиск нужной инфы, используя как можно меньше запросов и текста.
В чем конкретно состоит задача? Я то че спрашиваю, ответить на твой вопрос в общем случае без знания задачи невозможно. Кроме того, при составлении запросов обычно не стоит задача минимизировать текст запроса. Запросы оптимизируются по скорости выполнения, по читабельности, по удобству составления и т.п. Объем - дело десятое.

Эт конечно все хорошо когда таблиц 2-3.
А если выборку делать из 15 -20 таблиц? Замучаюсь эти Селекты писать.
Если таблиц много, обычно используют runtime или compile time генерацию запросов. Про PHP неуместно говорить о compile time-е, потому первое от второго будет отличаться тем, включены ли сгенерированные запросы в исходники или ресурсы, либо генерятся по ходу выполнения.
 

vega

Администратор
Сотрудники Вега-Интернет
в документации UNION а у вас в примере вообще UNIT

мб отсюда и проблема? )
 

Steeply

Skynet
в документации UNION а у вас в примере вообще UNIT

мб отсюда и проблема? )
Проблема составить алгоритм а не написать запрос на выборку )))
Просто машинально описался когда тут вопрос писал )

В чем конкретно состоит задача? Я то че спрашиваю, ответить на твой вопрос в общем случае без знания задачи невозможно. Кроме того, при составлении запросов обычно не стоит задача минимизировать текст запроса. Запросы оптимизируются по скорости выполнения, по читабельности, по удобству составления и т.п. Объем - дело десятое.


Если таблиц много, обычно используют runtime или compile time генерацию запросов. Про PHP неуместно говорить о compile time-е, потому первое от второго будет отличаться тем, включены ли сгенерированные запросы в исходники или ресурсы, либо генерятся по ходу выполнения.

Задача в общем такая.
Организовать локальную поисковую систему на сайте.
Причем поиск должен производится по всему сайту, начиная от имени пользователя и кончая комментариям (в общем найти ВЕСЬ текст в котором встречается заданное выражение или слово).
Т.е надо просмотреть все поля во всех таблицах на условие совпадения с шаблоном.
Таблиц много (на текущий момент 15 штук. Возможно будет добавлено еще несколько штук), по этому запрос на каждую таблицу писать как то не охото.

Соответственно запрос в БД будет отсылаться через PHP
 

sami

Местный
Задача в общем такая.
Организовать локальную поисковую систему на сайте.
Причем поиск должен производится по всему сайту, начиная от имени пользователя и кончая комментариям (в общем найти ВЕСЬ текст в котором встречается заданное выражение или слово).
Т.е надо просмотреть все поля во всех таблицах на условие совпадения с шаблоном.
Таблиц много (на текущий момент 15 штук. Возможно будет добавлено еще несколько штук), по этому запрос на каждую таблицу писать как то не охото.

Соответственно запрос в БД будет отсылаться через PHP
А что за шаблон, если не секрет? Не будет же пользователь вводить шаблон в LIKE нотации? А потому - видимо без генерации запроса в рантайме не обойтись, даже если бы была только одна таблица.
 

Steeply

Skynet
А что за шаблон, если не секрет? Не будет же пользователь вводить шаблон в LIKE нотации? А потому - видимо без генерации запроса в рантайме не обойтись, даже если бы была только одна таблица.
пользователь просто напишет "ляляля"
И система ему выкинет все страницы где встречается это "ляляля"
Когда я делал с 1 таблицей я делал так

Код:
в LIKE нотации я делаю так  '%".str_replace("*","%",addslashes($search))."%'
 

sami

Местный
пользователь просто напишет "ляляля"
И система ему выкинет все страницы где встречается это "ляляля"
Когда я делал с 1 таблицей я делал так

Код:
в LIKE нотации я делаю так  '%".str_replace("*","%",addslashes($search))."%'
А если я захочу найти страницы где встречается и "SQL" и "UNION", то такой поиск мне не поможет?

Эта строка вставляется в тескт запроса, или в параметр запроса?
 

Steeply

Skynet
А если я захочу найти страницы где встречается и "SQL" и "UNION", то такой поиск мне не поможет?

Эта строка вставляется в тескт запроса, или в параметр запроса?
1. нет не поможет, будет искать только целиком строку или слово. (Например если ищим "вперед назад" то система выдаст предложение "Ваня прыгал вперед назад и вниз" и пропустит "А Коля прыгал назад вперед" )

2.
Код:
$search = htmlspecialchars($_REQUEST['ИСКОМЫЙ ТЕКСТ']);
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)-]/",$search)) $search="";

SELECT * FROM таблица WHERE где like '%".str_replace("*","%",addslashes($search))."%'

Ну в общем это какие советы будут, как написать то лучше чтобы поиск был?
 

sami

Местный
1. нет не поможет, будет искать только целиком строку или слово. (Например если ищим "вперед назад" то система выдаст предложение "Ваня прыгал вперед назад и вниз" и пропустит "А Коля прыгал назад вперед" )

2.
Код:
$search = htmlspecialchars($_REQUEST['ИСКОМЫЙ ТЕКСТ']);
if (preg_match("/[^(\w)|(\x7F-\xFF)|(\s)-]/",$search)) $search="";

SELECT * FROM [b]таблица[/b] WHERE [b]где[/b] like '%".str_replace("*","%",addslashes($search))."%'

Ну в общем это какие советы будут, как написать то лучше чтобы поиск был?

1. не поможет так не поможет
2. понятно. А как в запрос попадают имена таблиц и поля?

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

Конкретно к твоему случаю, когда критерий прост (выражается лишь с помощью одного LIKE), советы такие:
15 таблиц это не тот случай, когда тяжело скопипастить код 15 раз. Но беда здесь кроется в том, что усложнится поддержка. Т.е. чтобы доработать поиск, придется исправлять в 15 местах. Потому, с одной стороны лучше перейти к генерации SQL.

С другой стороны, вероятно 15 таблиц потребуют 15 различных способов обработки результатов запроса (здесь я полагаю, что нужно не только найти искомый текст, но и уметь показать его пользователю, т.е. сгенерировать URL перехода или что-то вроде). В одном случае потребуется имя пользователя (для показа страницы о пользователе), в другом - идентификатор темы, в которой помещен комментарий, а возможно и идентификатор темы + идентификатор комментария.
Т.е. либо придется генерировать монстра в виде
Код:
(SELECT "user_name", user_id, NULL, NULL FROM users WHERE user_name LIKE ...)
UNION
(SELECT "user_sex", user_id, NULL, NULL FROM users WHERE user_sex LIKE ...)
UNION
(SELECT "user_address", user_id, NULL, NULL FROM users WHERE user_address LIKE ...)
...
(SELECT "message_text", NULL, forum_id, message_id FROM messages WHERE message_text LIKE ...)
и организовывать диспетчеризацию строк результата по первой колонке для генерации URL-а, либо вообще выполнять запросы отдельно.
Ну а если отдельно - то какой смысл в генерации? Если бы речь шла о 150 таблицах... Если запросы отдельно, то можно выбирать только те поля, которые нужны, а не их объединение.

То что я описал выше - тривиальный случай. А могут понадобиться JOIN-ы с разными таблицами для генерации URL-ов. Или в одном случае понадобятся, а в другом - нет. Я не говорю, что генерация в таких случаях невозможна впринципе. Просто она будет сложнее, чем копипаст.

Т.е. решать тебе, все зависит от структуры сайта и того, чего нужно добиться.

И еще, всегда можно подсмотреть какое-то решение в другом месте, а лучше - не в одном.
 

Steeply

Skynet
Т.е. либо придется генерировать монстра в виде
Код:
(SELECT "user_name", user_id, NULL, NULL FROM users WHERE user_name LIKE ...)
UNION
(SELECT "user_sex", user_id, NULL, NULL FROM users WHERE user_sex LIKE ...)
UNION
(SELECT "user_address", user_id, NULL, NULL FROM users WHERE user_address LIKE ...)
...
(SELECT "message_text", NULL, forum_id, message_id FROM messages WHERE message_text LIKE ...)
Ну вот я сам только такого монстра и представляю. По этому и спрашиваю, может и есть другие способы более компактные.
А так то запросов не мало, 15 таблиц, в каждой из которых в среднем 2-3 текстовых поля, и того получает 30-45 запросов.

Ладно пороюсь в инете может чего найдется. Уж этот копипаст всегда успеем..
 

sami

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

Да дело даже не в этом, на спецфорумах надо крутится так и сяк. Там можно не только найти ответы на какие-то вопросы, но и оценить свой уровень, понять слабые места, вовремя узнать что-то новое.
 
Сверху