Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Динамические Title, keywords & description
 
 автор: provodnik   (26.02.2007 в 11:22)   письмо автору
 
 

Доброго времени суток.
Ситуация такова: есть доска объявлений на MySql.
Требуется: организовать подстановку переменных, в соответствующие места.
Т.е. если открывается главная страница скрипта, то выводятся общие какие нибудь данные;
если открыта какая либо категория, то выводится название именно этой категории, её описание и т.п.; если открыто какое либо объявление, то в Title выводится заголовок объявления, в keywords и description соответственно выводится краткое содержание самого объявления и т.п.

Просмотрел много скриптов, там в начале страницы делаются запросы к базе, для извлечения данных для подстановки в эти тэги.
Хотелось бы узнать проконсультироваться с вами. Кто нибудь уже решал подобные задачи? Как осуществить задуманное с "малой кровью"?
Не особо хочется делать 3 ( лишних :) ) запроса к базе...
Будет отлично, если расскажете ещё логику кода...
Спасибо за потраченное на меня время...

   
 
 автор: mihdan   (26.02.2007 в 11:45)   письмо автору
 
   для: provodnik   (26.02.2007 в 11:22)
 

Откуда берутся 3 лишних запроса???

   
 
 автор: ZuArt   (26.02.2007 в 11:45)   письмо автору
 
   для: provodnik   (26.02.2007 в 11:22)
 

1) как сверстан код страниц - на таблицах, на слоях или потоком?
2) как работает скрипт - копит выводимый код в переменной и потом его скопом выдает или по мере выполнения кода вызываются операторы вывода?

   
 
 автор: provodnik   (26.02.2007 в 12:02)   письмо автору
 
   для: provodnik   (26.02.2007 в 11:22)
 

mihdan - 3-мя запросами достаём из базы заголовок ( title ), описание ( description ) и ключевые слова ( keywords ), т.к. я эти данные нигде не возьму раньше чем шапка...
ZuArt - страницы на таблицах: подключается файл с шапкой, файл с левой колонкой ()меню, опросы и прочая дребень), и в главной центровой колонке выводятся данные самой доски объявлений (категории, их описание, заголовки объявлений, сами объявления).
Выводится это по мере подключения файлов. Не в одной переменной...

   
 
 автор: ZuArt   (26.02.2007 в 12:08)   письмо автору
 
   для: provodnik   (26.02.2007 в 12:02)
 

1) какой смысл делать 3 запроса к тазным таблицам, когда можно вогнать все в одну таблицу - получаем один запрос

2) если все верстано на таблицах, то особого смысла выдавать страницу по мере выполнения скрипта нет... только Опера "пытается" строить таблицы на лету... а значит, можно просто копить данные в буфер, а в том месте, где выполняется "штатный" запрос, в котором есть нужные данные - выполнять построение заголовка на основе полученных данных и выдавать в браузер.

3) а чем плох вариант получения данных в начале скрипта? Эти данные будут получены более чем быстро и особых задержек вызвать не должны, при условии правильного построения БД.

   
 
 автор: ZuArt   (26.02.2007 в 12:11)   письмо автору
 
   для: ZuArt   (26.02.2007 в 12:08)
 

ЗЫ. Кстать, если заголовок строится по открытому разделу или объявлению, то определенно нужно вытаскивать эти данные по мере выполнения скрипта, иначе при "шапковом" запросе к БД, при разростании времени будет уходить на это все больше и больше...

   
 
 автор: provodnik   (26.02.2007 в 15:03)   письмо автору
 
   для: ZuArt   (26.02.2007 в 12:08)
 

>1) какой смысл делать 3 запроса к тазным таблицам, когда можно вогнать все в одну таблицу - получаем один запрос

Хм... В этом что то есть. Может и стоит создать отдельную таблицу для SEO с титлами и ключевиками... Но а если планируется на сайте иметь не только доску объявлений, а скажем к примеру, каталог сайтов, каталог фирм, фотогаллерею, и т.п. данные? Как поступить в этом случае?
Сливать все данные в одну таблицу?!


>2) если все верстано на таблицах, то особого смысла выдавать страницу по мере выполнения скрипта нет... только Опера "пытается" строить таблицы на лету... а значит, можно просто копить данные в буфер, а в том месте, где выполняется "штатный" запрос, в котором есть нужные данные - выполнять построение заголовка на основе полученных данных и выдавать в браузер.

Я очень слабо знаком с буферизацией, поэтому этот вариант не рассматриваю... Только учусь так сказать...


>3) а чем плох вариант получения данных в начале скрипта? Эти данные будут получены более чем быстро и особых задержек вызвать не должны, при условии правильного построения БД.

Просто не очень хочется плодить обращения к базе... При открытии страницы и так их предостаточно... Всякие проверки, сверки, выборки...

   
 
 автор: ZuArt   (26.02.2007 в 15:51)   письмо автору
 
   для: 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;
};
?>


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

   
 
 автор: provodnik   (26.02.2007 в 16:13)   письмо автору
 
   для: 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'];
?>

Я еще не пробовал, но мне кажется что этот массив будет недоступен..

   
 
 автор: ZuArt   (26.02.2007 в 16:29)   письмо автору
 
   для: 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[номер строки]["имя столбца"]
};
?>

   
 
 автор: provodnik   (26.02.2007 в 16:48)   письмо автору
 
   для: 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'];
?> 


Просто мне будет доступнее моя писанина...
Спасибо...

   
 
 автор: ZuArt   (26.02.2007 в 17:52)   письмо автору
 
   для: 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'];

   
 
 автор: provodnik   (26.02.2007 в 20:52)   письмо автору
 
   для: ZuArt   (26.02.2007 в 17:52)
 

Всем спасибо за потрачченое время. Я все таки решил перекроить скрипт более правильно. Файлы с шапкой и боковыми менюшками буду инклюдить после необходимого запроса, когда все нужные данные будут уже в кармане... Мне кажется это будет более гибко и правильно..
Спасибо...

   
 
 автор: ZuArt   (27.02.2007 в 09:20)   письмо автору
 
   для: provodnik   (26.02.2007 в 20:52)
 

угу... именно так и надо действовать =)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования