| |
|
|
| | Доброго времени суток.
Ситуация такова: есть доска объявлений на MySql.
Требуется: организовать подстановку переменных, в соответствующие места.
Т.е. если открывается главная страница скрипта, то выводятся общие какие нибудь данные;
если открыта какая либо категория, то выводится название именно этой категории, её описание и т.п.; если открыто какое либо объявление, то в Title выводится заголовок объявления, в keywords и description соответственно выводится краткое содержание самого объявления и т.п.
Просмотрел много скриптов, там в начале страницы делаются запросы к базе, для извлечения данных для подстановки в эти тэги.
Хотелось бы узнать проконсультироваться с вами. Кто нибудь уже решал подобные задачи? Как осуществить задуманное с "малой кровью"?
Не особо хочется делать 3 ( лишних :) ) запроса к базе...
Будет отлично, если расскажете ещё логику кода...
Спасибо за потраченное на меня время... | |
| |
|
|
| |
|
|
| |
для: provodnik
(26.02.2007 в 11:22)
| | | Откуда берутся 3 лишних запроса??? | |
| |
|
|
| |
|
|
| |
для: provodnik
(26.02.2007 в 11:22)
| | | 1) как сверстан код страниц - на таблицах, на слоях или потоком?
2) как работает скрипт - копит выводимый код в переменной и потом его скопом выдает или по мере выполнения кода вызываются операторы вывода? | |
| |
|
|
| |
|
|
| |
для: provodnik
(26.02.2007 в 11:22)
| | | mihdan - 3-мя запросами достаём из базы заголовок ( title ), описание ( description ) и ключевые слова ( keywords ), т.к. я эти данные нигде не возьму раньше чем шапка...
ZuArt - страницы на таблицах: подключается файл с шапкой, файл с левой колонкой ()меню, опросы и прочая дребень), и в главной центровой колонке выводятся данные самой доски объявлений (категории, их описание, заголовки объявлений, сами объявления).
Выводится это по мере подключения файлов. Не в одной переменной... | |
| |
|
|
| |
|
|
| |
для: provodnik
(26.02.2007 в 12:02)
| | | 1) какой смысл делать 3 запроса к тазным таблицам, когда можно вогнать все в одну таблицу - получаем один запрос
2) если все верстано на таблицах, то особого смысла выдавать страницу по мере выполнения скрипта нет... только Опера "пытается" строить таблицы на лету... а значит, можно просто копить данные в буфер, а в том месте, где выполняется "штатный" запрос, в котором есть нужные данные - выполнять построение заголовка на основе полученных данных и выдавать в браузер.
3) а чем плох вариант получения данных в начале скрипта? Эти данные будут получены более чем быстро и особых задержек вызвать не должны, при условии правильного построения БД. | |
| |
|
|
| |
|
|
| |
для: ZuArt
(26.02.2007 в 12:08)
| | | ЗЫ. Кстать, если заголовок строится по открытому разделу или объявлению, то определенно нужно вытаскивать эти данные по мере выполнения скрипта, иначе при "шапковом" запросе к БД, при разростании времени будет уходить на это все больше и больше... | |
| |
|
|
| |
|
|
| |
для: ZuArt
(26.02.2007 в 12:08)
| | | >1) какой смысл делать 3 запроса к тазным таблицам, когда можно вогнать все в одну таблицу - получаем один запрос
Хм... В этом что то есть. Может и стоит создать отдельную таблицу для SEO с титлами и ключевиками... Но а если планируется на сайте иметь не только доску объявлений, а скажем к примеру, каталог сайтов, каталог фирм, фотогаллерею, и т.п. данные? Как поступить в этом случае?
Сливать все данные в одну таблицу?!
>2) если все верстано на таблицах, то особого смысла выдавать страницу по мере выполнения скрипта нет... только Опера "пытается" строить таблицы на лету... а значит, можно просто копить данные в буфер, а в том месте, где выполняется "штатный" запрос, в котором есть нужные данные - выполнять построение заголовка на основе полученных данных и выдавать в браузер.
Я очень слабо знаком с буферизацией, поэтому этот вариант не рассматриваю... Только учусь так сказать...
>3) а чем плох вариант получения данных в начале скрипта? Эти данные будут получены более чем быстро и особых задержек вызвать не должны, при условии правильного построения БД.
Просто не очень хочется плодить обращения к базе... При открытии страницы и так их предостаточно... Всякие проверки, сверки, выборки... | |
| |
|
|
| |
|
|
| |
для: provodnik
(26.02.2007 в 15:03)
| | | > Я очень слабо знаком с буферизацией, поэтому этот вариант не рассматриваю... Только учусь так сказать...
В этом пункте я имел в виду не столько буферизацию PHP, сколько простую переменную =)... и не более того...
т.е. фактически алгоритм будет выглядеть так... пока Вы не выстроили код для отдачи браузеру - просто выводите не через echoб а через ToEcho("...") 2 параметр ставить не надо...
После того, как Вы получили нужную информацию для заголовка, достраиваете переменную $buff и вызываете ТОЛЬКО ОДИН РАЗ ToEcho("", true) - этот вызов выкинет накопленый буфер в поток вывода и очистит "буфер" - далее можно использовать в коде или echo или ToEcho - разницы уже не будет...
<?
$out = false;
$buff = "";
ToEcho($txt, $set=false)
{
global $buff, $out;
if(($set)and(strlen($buff) > 0))
{
$out = true;
echo $buff;
$buff = "";
};
if($out)
echo $txt;
else
$buff .= $txt;
};
?>
|
ЗЫ. Но это маленько геморный путь - по мне - я бы просто оптимизировал работу скриптов, чтобы минимизировать кол-во запросов + делал запрос на получение информации которая включает в себя заголовочную информацию вначале, и просто результат сохранил в каком-либо "буфере" до того места скрипта, где эта инф-ция понадобиться... тогда получится что нет ни лишних запросов, ни непонятных задержек. | |
| |
|
|
| |
|
|
| |
для: ZuArt
(26.02.2007 в 15:51)
| | | >ЗЫ. Но это маленько геморный путь - по мне - я бы просто оптимизировал работу скриптов, чтобы минимизировать кол-во запросов + делал запрос на получение информации которая включает в себя заголовочную информацию вначале, и просто результат сохранил в каком-либо "буфере" до того места скрипта, где эта инф-ция понадобиться... тогда получится что нет ни лишних запросов, ни непонятных задержек.
Посмотрите, правильно ли я вас понял:
Что бы поиметь некоторые данные для титлов и ключевиков я должен сделать вначале запрос в базу. Но запросы же я буду делать в те таблицы, данные из которых мне понадобятся позже, на этой же странице, для вывода, к примеру, объявлений.
Т.е. я могу одним запросом извлечь первичные данные:
<?
$query = mysql_query("SELECT * FROM board WHERE");
if (mysql_num_rows ($query) > 0)
{
while($message = mysql_fetch_array($query))
{echo "Телефон".$message['phone'];}
}
?>
|
А потом, через, скажем, 500 строк кода снова заюзать этот массив?
<?
echo "Категория: ".$message['name_cat'];
echo "Текст объявления: ".$message['text'];
?>
|
Я еще не пробовал, но мне кажется что этот массив будет недоступен.. | |
| |
|
|
| |
|
|
| |
для: provodnik
(26.02.2007 в 16:13)
| | | не совсем ...
1) массив стоит объявить глобальным
2) считывание производится в ОДИН и тот-же массив, с замещением... т.к. читаете несколько строк выборки в одну строку массива... правильнее будет
<?
$mess = array();
$query = mysql_query("SELECT * FROM board WHERE ТУТ УСЛОВИЕ ВЫБОРКИ");
if (mysql_num_rows ($query) > 0)
{
while($mess[] = mysql_fetch_array($query))
{тут просто поставить пустой оператор};
}
?>
тут еще черт знам скока строк кода, НО без обращения для изменений к массиву $mess
<?
тут обращение к массиву $mess[номер строки]["имя столбца"]
function Func(...) // так тоже можно
{
global $mess; // обязательно объявить как глобальную, чтобы получить к ней доступ
тут обращение к массиву $mess[номер строки]["имя столбца"]
};
?>
|
| |
| |
|
|
| |
|
|
| |
для: ZuArt
(26.02.2007 в 16:29)
| | | Прошу меня извинить за переливание из пустого в порожнее, но я хочу попросить написать поконкретнее...
Мне непонятно
"{тут просто поставить пустой оператор};",
тут обращение к массиву $mess[номер строки]["имя столбца"]
Если можно, то на моём примере кода:
Допустим есть таблица board, и в ней некоторые столбцы: id, title, body
<?
$query = mysql_query("SELECT * FROM board WHERE здесь критерии выборки из базы");
if (mysql_num_rows ($query) > 0)
{
while($message = mysql_fetch_array($query))
{echo "Номер".$message['id'];}
}
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////// 500 строчек кода :), без обращения к массиву $message //////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
//Здесь вызов массива $message:
echo "Заголовок".$message['title'];
echo "Сообщение".$message['body'];
?>
|
Просто мне будет доступнее моя писанина...
Спасибо... | |
| |
|
|
| |
|
|
| |
для: provodnik
(26.02.2007 в 16:48)
| | | пустой оператор - я сейчас не помню эту функцию... но по сути, на его месте просто поставиить ЛЮБОЙ оператор, который будет телом цикла, например $a=1;
тут обращение к массиву $mess[номер строки]["имя столбца"]
echo "Заголовок".$mess[0]['title'];
echo "Сообщение".$mess[0]['body'];
Объясню, ПОЧЕМУ тут массив строк, т.к. запрос построен таким образом, что выборка может быть не одной строкой, а несколькими, то и запоминаем мы все строки в массив строк...
если к SQL запросу добавить limit 1, тогда можно будет заменить в чтении таблицы $mess[] на $mess, И соотвественно при обращении к массиву
echo "Заголовок".$mess['title'];
echo "Сообщение".$mess['body']; | |
| |
|
|
| |
|
|
| |
для: ZuArt
(26.02.2007 в 17:52)
| | | Всем спасибо за потрачченое время. Я все таки решил перекроить скрипт более правильно. Файлы с шапкой и боковыми менюшками буду инклюдить после необходимого запроса, когда все нужные данные будут уже в кармане... Мне кажется это будет более гибко и правильно..
Спасибо... | |
| |
|
|
| |
|
|
| |
для: provodnik
(26.02.2007 в 20:52)
| | | угу... именно так и надо действовать =) | |
| |
|
|