помогите реализовать Таги к постам

LDZ

Новичок
помогите реализовать Таги к постам

Каким образом можно сделать добавление ключевых слов к постам.

Сделал дополнительное поле tagswords в mysql

В каком виде нужно записывать введенные пользователем слова: в исходном ввиде (через запятую) или разбитую по запятым на массив?

И как проводить потом поиск сообщений по ключевым словам и выводить список самых популярных слов?

Заранее спасибо.
 

Alexandre

PHPПенсионер
таблица - таги ( таг, иди )
таблица таги-посты ( таг_иди, пост_иди )
табл посты ( ид, .... )

связи между таблицами по таг.иди -- таги-посты.таг_иди один ко многим (на один таг может быть много таг-постов )
и связь между таги-посты.пост_иди -- пост.иди - один ко многим (на один пост может быть много таг-постов )

в результате имеешь связь много ко многим между тбл. таги - посты

-~{}~ 27.06.07 19:05:

И как проводить потом поиск сообщений по ключевым словам и выводить список самых популярных слов?
высчитываешь кол-во постов по каждому тагу, упорядочиваешь по убыванию,и ограничиваешь вывод limit 10 (десять наиболее популярных тагов )
 

LDZ

Новичок
Хорошо, предположим.

Введенные через запятую слова разбиваются на массив, заносятся в таблицу тегов.

И в таблицу связей вносятся связи.

Но ведь надо как-то проверять на существование тага, ведь он может быть уже ранее введен.

Я здесь не очень понимаю, как можно все это организовать.

Если есть возможность, расскажите поподробнее процедуру вставки данных в таблицы
 

Фанат

oncle terrible
Команда форума
как-то проверять на существование тага, ведь он может быть уже ранее введен.
запрос к таблице тагов так сложен?

Это при твоей стистеме хранения, чтобы проверить сужествование тэга, надо перебрать ВСЕ записи.
а здесь - всего лишь запрос к таблице тэгов
 

Alexandre

PHPПенсионер
Если есть возможность, расскажите поподробнее процедуру вставки данных в таблицы
1) проверяешь тбл тагс на наличие тега, если есть - извлекаешь его иди

1а) если тега нет в тбл, то делаешь инсерт и извлекаешь новый иди.

2) вводишь в таблицу таг-пост иди тега и иди поста

все проще-простого
 

LDZ

Новичок
Уже делаю )) Сам додумался

-~{}~ 28.06.07 12:31:

Вот все работает,но есть одно НО:

Код:
                                $tagsw = htmlspecialchars(addslashes($_POST['tagswords']));
				$tagsw = strtolower($tagsw);
				if($tagsw!='')
				{
					$tagswords = explode(",", $tagsw);
					$sqldel = "DELETE FROM tagslink WHERE id_post='$post_id'";
					$resdel = mysql_query($sqldel) OR die("Отрубили!"); 

					foreach($tagswords as $value){
						$sql1 = "SELECT * FROM tags WHERE word='$value'";
						$res1 = mysql_query($sql1) OR die ("Я умер");
						$num1 = mysql_num_rows($res1);
	
						if($num1=='0')
						{
							$sql2 = "INSERT INTO tags VALUES(0,'$value')";
							$res2 = mysql_query($sql2) OR die("Они убили Кенни");
						}

						$sql3 = "SELECT id FROM tags WHERE word='$value'";
						$res3 = mysql_query($sql3) OR die("Скончался");
						$tag_id = mysql_result($res3,0,0);
					
						$sql4 = "INSERT INTO tagslink VALUES(0,'$post_id','$tag_id')";
						$res4 = mysql_query($sql4) OR die("Помер молодым"); 
					}
				}
Почему то $tagsw = strtolower($tagsw); не работает. Все равно регистр остается тот же, что и был

Пояснение: это код редактирования сообщения. поэтому и удаляю все раннее введенные ключевые слова для поста

Код:
					$tagswords = explode(",", $tagsw);
					$sqldel = "DELETE FROM tagslink WHERE id_post='$post_id'";
					$resdel = mysql_query($sqldel) OR die("Отрубили!");
 

Alexandre

PHPПенсионер
одно но
$sql1 = "SELECT * FROM tags WHERE word='$value'";
повторяется два раза :)
подумай, как этого избежать???

и зачем убивать все записи в тагс-пост для данного поста??
надо добавлять новые таги и убивать несуществующие (Подсказка:
задача сравнения двух массивов)
 

Фанат

oncle terrible
Команда форума
MiksIr
в отличие от похапе, на котором работают тыщи сайтов с ненастроенной локалью и не жужжат, база данных же, с "ненастроеной локалью" будет практически неработоспособна вообще. а не только в части приведения регистров.
Отсюда вывод: локализация базы настроена, скорее всего, правильно, а если нет - то настраивать все равно придется.
 

LDZ

Новичок
Alexandre
Спасибо за подсказку о повторении. Исправил.

Насчет сравнения подумаю, сейчас как раз изучаю массивы


Кстати, в других файлах работает strtolower. И работает отлично.
И LOWER() в sql тоже прекрасно работает.

-~{}~ 28.06.07 13:08:

Спасибо ВСЕМ за помощь. Очень помогли.

Функция сравнения массивов - это array_diff() ?

не врубаюсь как это реализовать:

$c = array_diff($a, $b);

массив $a - данные из базы
массив $b - данные, веденные пользователем
массив $c - их разница (те данные, что не существуют в массиве $a)

И теперь если $c не пустой, записываем их в БД

И, я понимаю, необходимо будет произвести еще одно сравнение:
$c = array_diff($b, $a);

Теперь те данные, которые есть в базе, но их нет в введенных пользователем данных - удаляются из БД

Правильно ли я мыслю?

И не легче действительно сделать так, как я сделал путем удаления?

-~{}~ 28.06.07 13:57:

Извиняюсь, но опять приходится обращаться за помощью:

Вот код вывода тагов из файла вывода сообщений на страницу:

Код:
						$sqlwords = "SELECT * FROM tagslink WHERE id_post='$row[id]' LIMIT 10";
						$reswords = mysql_query($sqlwords) OR die("Сдох при попытки самоубийства");
						$numwords = mysql_num_rows($reswords);

						if($numwords>0)
						{
							$i = 0;
							while($tagswords = mysql_fetch_array($reswords))
							{
									$sql1 = "SELECT word FROM tags WHERE id='$tagswords[id_tags]'";
									$res1 = mysql_query($sql1) OR die ("Я умер");
									$tagws[$i] = mysql_result($res1,0,0);
									$i++;
									
							}
							$i = 0;
							$tags = "Метки: ".implode(",", $tagws);
						}
Проблема возникла вот в чем: этот код выполняется в цикле вывода постов.
И выводятся сообщения по порядку.
Например у 5-го по счету сверху сообщения выводятся таги, которые я ему поставил. Но все сообщения ниже тоже показываются с этими же тагами, хотя им я не проставлял их.

Я так понял, что нужно очищать массив после каждого цикла?
Поискал в инете, нашел, что можно очистить с помощью функции unset($array)

Вставил после цикла тагов, но результат все равно тот же.

Каким образом можно исправить?

-~{}~ 28.06.07 14:08:

Все исправил сам. Всем спасибо
 
Сверху