PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (81): В начало « ... 63 64 65 66 [67] 68 69 70 71 ... » В конец

> Найдено сообщений: 1209
evgenijj Отправлено: 14 Апреля, 2007 - 19:14:10 • Тема: Как отрыть доступ к серверу. • Форум: Apache и другие веб-серверы

Ответов: 26
Просмотров: 1481
У моего хостера вот так работает

Order Allow,Deny
Allow from all
Deny from 81.25.53.56 to 81.25.53.80

Запрет на доступ с диапазона ip-адресов 81.25.53.56 - 81.25.53.80
evgenijj Отправлено: 14 Апреля, 2007 - 11:02:19 • Тема: случайная запись в MySQl • Форум: Программирование на PHP

Ответов: 25
Просмотров: 5398
Возвращаюсь к теме:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function gettime()
  4. {
  5.     $part_time = explode( ' ', microtime() );
  6.     $real_time = $part_time[1].substr( $part_time[0], 1 );
  7.     return $real_time;
  8. }
  9.  
  10. // Получаем случайную запись - первый вариант
  11. $start_time = gettime();
  12. $query = "SELECT id_prd, code, title, info, price, currency, image
  13.                   FROM ".TABLE_PRODUCTS."
  14.                   WHERE leader=1 AND active=1 ORDER BY RAND() LIMIT 1";
  15. $res = db_query( $query );
  16. if ( db_num_rows( $res ) > 0 )
  17. {
  18.         $leader = db_fetch_array( $res );
  19.         echo "Код: ".$leader["code"]."<br/>";
  20.         echo "Наименование: ".$leader["title"]."<br/>";
  21.         echo "Цена: ".number_format($leader["price"], 2, '.', '')."&nbsp;".CURRENCY_CODE."<br/>";
  22. }
  23. $stop_time = gettime();
  24. $dif_time = bcsub( $stop_time, $start_time, 6 );
  25. echo "<p >Время выполнения: ".$dif_time."</p>";
  26.  
  27. // Получаем случайную запись - второй вариант
  28. $start_time = gettime();
  29. $query = "SELECT id_prd
  30.                   FROM ".TABLE_PRODUCTS."
  31.                   WHERE leader=1 AND active=1";
  32. $res = db_query( $query );
  33. while( $id = db_fetch_array($res) ) $available_ids[] = $id["id_prd"];
  34. $rand = rand( 0 , (count($available_ids)-1) );
  35. $id = $available_ids[$rand];
  36. $query = "SELECT id_prd, code, title, info, price, currency, image
  37.                   FROM ".TABLE_PRODUCTS."
  38.                   WHERE id_prd=".$id;
  39. $res = db_query( $query );
  40. if ( db_num_rows( $res ) > 0 )
  41. {
  42.         $leader = db_fetch_array( $res );
  43.         echo "Код: ".$leader["code"]."<br/>";
  44.         echo "Наименование: ".$leader["title"]."<br/>";
  45.         echo "Цена: ".number_format($leader["price"], 2, '.', '')."&nbsp;".CURRENCY_CODE."<br/>";
  46. }
  47. $stop_time = gettime();
  48. $dif_time = bcsub( $stop_time, $start_time, 6 );
  49. echo "<p >Время выполнения: ".$dif_time."</p>";
  50.  
  51. ?>
  52.  

Результаты (таблица содержит около 6000 записей):

Код: 1007
Наименование: Датчик инерционный магнитоконтактный ДИМК
Цена: 20.70 RUB
Время выполнения: 0.043781

Код: 1016
Наименование: Извещатель охранный ручной точечный электроконтактный ИО 101-1 (КНС-1 исп.А)
Цена: 147.50 RUB
Время выполнения: 0.006133
-------------------------------- -------------------------------- ---------------------
Код: 1001
Наименование: Извещатель охранный точечный магнитоконтактный ИО 102-2 (СМК-1)
Цена: 16.65 RUB
Время выполнения: 0.036725

Код: 1016
Наименование: Извещатель охранный ручной точечный электроконтактный ИО 101-1 (КНС-1 исп.А)
Цена: 147.50 RUB
Время выполнения: 0.000661
-------------------------------- -------------------------------- ----------------------
Код: 2006
Наименование: Извещатель охранный объемный радиоволновый "Аргус-2"
Цена: 796.50 RUB
Время выполнения: 0.024019

Код: 2043
Наименование: Извещатель охранный поверхностный звуковой "Стекло-3" (ИО 329-4)
Цена: 605.34 RUB
Время выполнения: 0.000361

Второй вариант явно лучше. Так что переделываю с первого на второй.
evgenijj Отправлено: 13 Апреля, 2007 - 23:16:34 • Тема: случайная запись в MySQl • Форум: Программирование на PHP

Ответов: 25
Просмотров: 5398
Цитата:
первая таблица где товары относятся к категории мебели,
вторая таблица для товаров для кухни
и третяя таблица для товаров электро-приборов

Это мне понятно. Но так получается - мы искусственно усложняем структуру БД. Создаем дополнительные таблицы, хотя с точки зрения решения задачи в них нет необходимости. Ведь для хранения информации о структуре каталога продукции достаточно двух таблиц (даже одной - но получится нерациональное расходование полей). Я здесь провожу аналогию с файловой системой - есть каталоги (директории) и есть файлы (почему я говорю - достаточно одной таблицы - потому что директория - это тоже файл, только особого вида).

Цитата:

Таблица CATEGORIES:

1;0;Извещатели охранные;1
2;0;Извещатели пожарные;2
3;0;Приборы приемно-контрольные;3
6;1;Извещатели охранные магнитоконтактные;1
7;1;Извещатели охранные электроконтактные;2
8;1;Извещатели охранные ударноконтактные;3
9;2;Извещатели пожарные тепловые;1
10;2;Извещатели пожарные дымовые;2
11;2;Извещатели пожарные комбинированные;3
17;3;Приборы приемно-контрольные охранные;1
18;3;Приборы приемно-контрольные пожарные;2
19;3;Приборы приемно-контрольные охранно-пожарные;3

Таблица PRODUCTS:

1;6;Извещатель охранный магнитоконтактный ИО 102-2;Технические характеристики ИО 102-2;1
2;6;Извещатель охранный магнитоконтактный ИО 102-4;Технические характеристики ИО 102-4;2
3;6;Извещатель охранный магнитоконтактный ИО 102-14;Технические характеристики ИО 102-14;3
4;7;Извещатель охранный электроконтактный ИО 201-1;Технические характеристики ИО 201-1;1
5;7;Извещатель охранный электроконтактный ВПК 2112;Технические характеристики ВПК 2112;2
6;8;Извещатель охранный ударноконтактный "Окно-4";Технические характеристики "Окно-4";1
7;8;Извещатель охранный ударноконтактный "Окно-5";Технические характеристики "Окно-5";2
8;8;Извещатель охранный ударноконтактный "Окно-6";Технические характеристики "Окно-6";3
9;9;Извещатель пожарный тепловой ИП 114-01;Технические характеристики ИП 114-01;1
10;9;Извещатель пожарный тепловой ИП 101-1A;Технические характеристики ИП 101-1A;2
11;9;Извещатель пожарный тепловой ИП 101-30;Технические характеристики ИП 101-30;3
12;10;Извещатель пожарный дымовой ИП 212-3СМ;Технические характеристики ИП 212-3СМ;1
13;10;Извещатель пожарный дымовой ИП 212-18СИ;Технические характеристики ИП 212-18СИ;2
14;11;Извещатель пожарный комбинированный ИП 212/101-78-А1;Технические характеристики ИП 212/101-78-А1;1
15;11;Извещатель пожарный комбинированный ИП 212/101-18 А3R1;Технические характеристики ИП 212/101-18 А3R1;2


В этих двух таблицах я могу хранить каталоги продукции 2, 3, 10, 20 разных фирм (одно условие - придется добавить дополнительное поле - идентификатор фирмы, которой принадлежит категория или товар).

Мне интересно знать, как разбить эти таблицы, если они слишком разростутся (или будут изначально велики)? Получается, я должен буду изменить все запросы к этой таблице (а точнее - уже к трем), если разобью ее на части?

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

Цитата:
Дело в том что в 15 000 строковой таблице будет слишком много строк удовлетворяющих условие Char = A & num = 1 , поэтому системных ресурсов для вычисления и запоминания, а потом сортировки по этому числу - уходить будет очень много.
Можно ещё сделать чтото вроде такого:
SELECT * FROM `table` WHERE `char`='A' AND `num`=1 AND `id`=$rnd
и повторять эту комбинацию циклом while пока из базы чтото не выберется.

Согласен. Единственно, что я бы еще сделал - попробовал все варианты и засек бы время на выплнение. Но это не дает никаких гарантий - потому как у разных хостеров может быть по-разному. У одного PHP и MySQL на одной машине, у другого - на разных. И т.п.

(Добавление)
Мне не спится. Поэтому продожу. Пусть у нас есть фирма, которая предоставляет услуги хостинга и одновременно - услуги создания сайтов. Каждый сайт, создаваемый этой фирмой имеет каталог продукции (может быть и с Интернет-магазином). Все сайты работают на одном движке. Вся информация о продукции этих фирм хранится в двух таблицах CATEGORIES и PRODUCTS. Чтобы не заморачиваться каждый раз с модификацией движка (передавая в запросы уникальный идентификатор фирмы id_firm), эта фирма создает в БД представления (view)
CREATE VIEW CATEGORIES_FIRM1 AS
SELECT * FROM CATEGORIES WHERE id_firm=1
CREATE VIEW PRODUCTS_FIRM1 AS
SELECT * FROM PRODUCTS WHERE id_firm=1

CREATE VIEW CATEGORIES_FIRM2 AS
SELECT * FROM CATEGORIES WHERE id_firm=2
CREATE VIEW PRODUCTS_FIRM2 AS
SELECT * FROM PRODUCTS WHERE id_firm=2

CREATE VIEW CATEGORIES_FIRM3 AS
SELECT * FROM CATEGORIES WHERE id_firm=3
CREATE VIEW PRODUCTS_FIRM3 AS
SELECT * FROM PRODUCTS WHERE id_firm=3

А потом достаточно создать файл конфигурации config.ini следующего содержания
define("CATEGORIES", "CATEGORIES_FIRM1");
define("PRODUCTS", "PRODUCTS_FIRM1");
для первой фирмы

define("CATEGORIES", "CATEGORIES_FIRM2");
define("PRODUCTS", "PRODUCTS_FIRM2");
для второй фирмы

и т.д.

А в самом движке при необходимости обращения к таблице товаров пишем
$query = "SELECT id_prd, title, description, price FROM ".PRODUCTS." WHERE id_prd=".$id_prd;
При этом для первой фирмы будет идти обращение к представлению PRODUCTS_FIRM1, для второй - к PRODUCTS_FIRM2 и т.д.

Вопрос, который я хотел задать - если таблица PRODUCTS становится слишком велика - как ее грамотно разбить на части и как к эти частям обращаться?
evgenijj Отправлено: 13 Апреля, 2007 - 22:47:50 • Тема: случайная запись в MySQl • Форум: Программирование на PHP

Ответов: 25
Просмотров: 5398
Я еще спросить хотел. По поводу разбить талицу на "кусочки".

Вот, положим, у меня есть таблица, где хранится информация о продукции некоторой фирмы. Содержит 15000 записай. Я ее разбил на три - по 5000 записей в каждой. Я вроде слышал, что для MySQL это полезно. Но как работать с этими таблицами?

Пока таблица была одна, я мог составить запрос для получения одной записи
SELECT title, description, price, image FROM products WHERE id_product=1001

А как быть, если я одну таблицу разбил на три? Составлять запрос типа
SELECT title, description, price, image FROM products1 WHERE id_product=1001
UNION
SELECT title, description, price, image FROM products2 WHERE id_product=1001
UNION
SELECT title, description, price, image FROM products3 WHERE id_product=1001

(Добавление)
valenok пишет:
Давай тогда ещё раз.
Что у нас происходит когда мы выполняем следующий запрос: ?
SELECT * FROM `table` WHERE `char`='A' AND `num`=1 ORDER BY RAND() LIMIT 1

Я так понимаю, что из таблицы выбираются записи, удовлетворяющие условию WHERE `char`='A' AND `num`=1. При этом, для каждой записи высисляется значение RAND() и по нему идет сортировка
evgenijj Отправлено: 13 Апреля, 2007 - 22:40:18 • Тема: Как отрыть доступ к серверу. • Форум: Apache и другие веб-серверы

Ответов: 26
Просмотров: 1481
Или так
Цитата:

Order allow,deny
allow from all
Deny from 193.220.129
Deny from 193.220.130
Deny from 193.220.131
evgenijj Отправлено: 13 Апреля, 2007 - 22:37:03 • Тема: случайная запись в MySQl • Форум: Программирование на PHP

Ответов: 25
Просмотров: 5398
valenok пишет:
mysql' овский RAND() возвращает число от 0 до 1
Для того наш rand я и поделил на 10 000

Да, я понял. Но суть дела это не меняет - нельзя сортировать записи по константе 0.1234
SELECT * FROM `table` WHERE `char`='A' AND `num`=1 ORDER BY 0.1234 LIMIT 1
Выражение ORDER BY 0.1234 не имеет смысла - запросы
SELECT * FROM `table` WHERE `char`='A' AND `num`=1 ORDER BY 0.1234 LIMIT 1
SELECT * FROM `table` WHERE `char`='A' AND `num`=1 LIMIT 1
вернут одинаковые результаты.
evgenijj Отправлено: 13 Апреля, 2007 - 22:13:27 • Тема: случайная запись в MySQl • Форум: Программирование на PHP

Ответов: 25
Просмотров: 5398
Что-то я твою идею не понял. Пусть $rnd = rand(). Т.е. это - число.
Тогда запрос будет выглядеть так
SELECT * FROM `table` WHERE `char`='A' AND `num`=1 ORDER BY 1234 LIMIT 1
При запросе
SELECT * FROM `table` WHERE `char`='A' AND `num`=1 ORDER BY RAND() LIMIT 1
функция MySQL RAND() для каждой записи выбирает случайное число - по нему и идет сортировка. А как сортировать по константе? Другими словами ORDER BY 1234 не имеет смысла и MySQL будет все время возвращать одну и ту же запись (до тех пор, пока мы не модифицируем таблицу - добавим/удалим записи)

P.S. А задачка оказалась совсем не такой тривиальной...
evgenijj Отправлено: 13 Апреля, 2007 - 21:53:20 • Тема: Как отрыть доступ к серверу. • Форум: Apache и другие веб-серверы

Ответов: 26
Просмотров: 1481
Я тут недавно набрел на сайт
http://apachedev[dot]ru/
там и форум есть. Думаю, есть смысл там спросить.
Цитата:
Что я и предложил в самом начале!!!

Ну мы же не ищем в жизни легких путей! И всегда пытаемся докопаться до истины.
evgenijj Отправлено: 13 Апреля, 2007 - 21:38:25 • Тема: Как отрыть доступ к серверу. • Форум: Apache и другие веб-серверы

Ответов: 26
Просмотров: 1481
-SCHATTEN- пишет:

А если у меня диапозон айпи типа 77.235.9.128 - 77.235.9.150

Врать не буду - ни разу с таким не сталкивался. Но думаю, в этом случае придется перечислять все IP
allow from 77.235.9.128
allow from 77.235.9.129
allow from 77.235.9.130
................................ ..

Блин, я так понимаю - мы тут все "большие" специалисты по настройке Apache.

P.S. Я тут быстро просмотрел по Интернету - записи типа
allow from 127.0.0.0 - 127.0.0.32
не разрешаются. Ты говоришь, у тебя работает. Тогда, возможно, еще нужно учитывать версию Apache 1.x или 2.x
evgenijj Отправлено: 13 Апреля, 2007 - 20:10:29 • Тема: Как отрыть доступ к серверу. • Форум: Apache и другие веб-серверы

Ответов: 26
Просмотров: 1481
Да в принципе информация в Интернете есть, надо только систематизировать
Цитата:

Order deny,allow
Deny from all
Allow from 62.148.3.4
Allow from 62.148.10

Строка Allow from 62.148.10 - открывает доступ для всех клиентов с адресами, начинающимися с 62.148.10

Цитата:

Что-то я никак не пойму - как запретить доступ всем, с подсетей, скажем,
200.*.*.*
201.*.*.*
202.*.*.*
Вообще. Напрочь. К сайту.
-------------------------------- -------------------------------- ---------------
Просто перечисляете запрещаемые подсети - по одной в строке

deny from 200
deny from 201
deny from 202

evgenijj Отправлено: 13 Апреля, 2007 - 11:06:55 • Тема: передача функции в качестве параметра • Форум: Программирование на PHP

Ответов: 5
Просмотров: 1347
valenok пишет:
global $HTTP_GET_VARS;
И так глобальный массив и указывать на его глобальность смысла не имеет.

Не совсем так. Этот массив не виден внутри функций, в отличие от $_GET. Поэтому массив $_GET называют суперглобальным.
evgenijj Отправлено: 13 Апреля, 2007 - 10:50:02 • Тема: случайная запись в MySQl • Форум: Программирование на PHP

Ответов: 25
Просмотров: 5398
valenok пишет:

Правда в документации пишут что функцию не стоит применять вместе с ORDER BY так как она повторяется многократно и влёчёт нагрузкуна систему.

Хм... Тогда переделаю
evgenijj Отправлено: 12 Апреля, 2007 - 19:33:11 • Тема: Фотогалерея участников форума. • Форум: Прочее

Ответов: 102
Просмотров: 6903

Я в центре. Новый год - корпоративная вечеринка года 3-4 назад.
evgenijj Отправлено: 12 Апреля, 2007 - 19:10:34 • Тема: случайная запись в MySQl • Форум: Программирование на PHP

Ответов: 25
Просмотров: 5398
Цитата:
В MySQL нет таковой.

Я выбирал случайный товар из каталога вот так
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $query = "SELECT id_prd, code, title, info, price, image
  4.                 FROM ".TABLE_PRODUCTS."
  5.                 WHERE 1 ORDER BY RAND() LIMIT 1";
  6. ?>
  7.  
evgenijj Отправлено: 07 Апреля, 2007 - 10:35:42 • Тема: У кого есть время. • Форум: Объявления

Ответов: 10
Просмотров: 5946
valenok пишет:

У меня его нет, я только чтоб по улыбаться.

Знаешь, не смешно. Очень уважаю людей, которые тратят свое время на то, чтобы помочь другим людям. Безвозмездно, т.е. даром Улыбка Смеяться над этим грешно. Им вообще памятники надо ставить. Из гранита. На них мир держится.
P.S. Сам тратишь свое время на помощь людям - и над такими же как ты прикалываешься.

Страниц (81): В начало « ... 63 64 65 66 [67] 68 69 70 71 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB