Приветсвую всех! Есть пара вопросов для гуру: В MySQL-базе хранится текстовая строка с ключевиками (тэгами), которые используются в кулинарном рецепте. Например, Код (Text): кинза, курица, помидор, перец, морковь, масло растительное, баклажан, лук, чеснок Надо написать небольшой парсер для этой строки, чтобы он разбивал эту строку на отдельные слова (без запятой и последующего пробела) и делал их ссылками на search.php?q=кинза или на search.php?q=курица Вот как-то так... Может, у кого-то есть примеры такой разбивки или функции? Какими функциями это реализовать? И ещё вопрос как раз по поиску. Мне очень интересно, как PHP будет обрабатывать поисковый запрос (который приведён выше), если там в строке запроса встречается слово на русском языке? Или надо как-то преобразовывать это слово? Сайт и база в кодировке cp1251... Спасибо! P.S. Сорри за ламерские вопросы, но сегодня голова вообще не работает, а делать надо
PHP: <? if (!empty($row["recipeTags"])) { // Если тэги в базе есть $tags = explode(", ", $row["recipeTags"]); // Разбиваем строку на отдельные слова $tagscount = count($tags); // Считаем количество элементов массива $tags $tagline = implode(", ", "<a href=#>".$tags."</a>"); // Собираем массив обратно, но уже с УРЛами ?> Даёт ошибку в последней строке Код (Text): Warning: implode() [function.implode]: Invalid arguments passed in /home/site/www/view.php on line 42 Ведь $tags - это же массив после разбивки? Что ей не нравится?
ругается на <a href=#> внутри implode... Соответсвенно, сейчас встаёт вопрос о том, как сначала переделать каждый элемент массива $tags в ссылку, а потом собрать... Кто-нибудь решал такую задачу?
С первым вопросом моего поста разобрался. При помощи вот такого кода: PHP: <?php if (!empty($row["recipeTags"])) { // Если строка тэгов в базе не пустая, то: $tags = explode(", ", $row["recipeTags"]); // Разбиваем строку тэгов на слова $tagscount = count($tags); // Считаем их количество for ($i = 0; $i < $tagscount; $i++) { // Перебираем каждый элемент и присваиваем ему ссылку $tags[$i] = "<a href=\"/search.php?searchquery=".$tags[$i]."\">".$tags[$i]."</a>"; } $tagline = implode(", ", $tags); // Собираем обратно, но уже со ссылками echo "<tr><td>"; echo $tagline; echo "</td></tr>"; } ?> Тэги выводит, всё замечательно. При наведении на тэг ссылка выглядит так: http://mysite.com/search.php?searchquery=курица а при нажатии на неё идёт переход на http://mysite.com/search.php?searchquer ... 0%E8%F6%E0 то есть, ссылка конвертируется и, соответственно, поиск не работает и ничего не ищет. В какую сторону копать? Не хотелось бы и сайт и базу в UTF переделывать только из-за этого...
Хе... а я себе представлял облако тегов немного по-другому: при добавлении статьи, ключевые слова добавляются в специальную таблицу. При просмотре облака - считается количество ссылок на слово и в соответствии с этим определяется размер шрифта. А если по каждому слову делать поиск в бд... А что если слов будет сотня?
Насчёт "облака" - я, наверное, погорячился с определением. Просто есть кулинарный сайт, где у каждого рецепта - свои ключевые слова. Меня не интересует, например, сколько рецептов содержат слово "соль" (наверняка, в классическом облаке слово "соль" будет самым жирным). Это немного не то, как в Вордпрессе. Меня интересует, какие рецепты вообще содержат "соль". Например, редкий тэг - "васаби" (например!). Выводятся все рецепты, которые содержат в себе "васаби". И не имеет значения, как часто это слово встречается в рецептах и как жирно оно выделено в облаке. Извиняюсь, если запутал с определением.
SkyKiller Я бы все же сделал ключевые слова в другой таблице с индексным столбцом и id-шником статьи. В форме поиска был бы какой-нибудь селект, в котором ингридиенты-ключевики (они отрисовывались бы по данным SELECT DISTINCT `key` FROM `keys`), потом производился бы запрос с поиском (LIKE) в таблицу с ключами и выдавались id-статей, а на их основе можно выбрать тела/названия самих статей ("краткое описание"). Мне кажется, что такой подход имеет следующие преимущества: 1) Легко получить все ключевые слова 2) Быстрее, чем поиск и выборка по всей базе со статьями Запрос будет где-то таким - SELECT `title` FROM `items` WHERE id = ANY (SELECT `item_id` FROM `keys` WHERE `key` LIKE "%'.$word.%")
Заманчиво, но (опять же, повторюсь) мне не нужен вес тэгов. Мне просто надо знать, какие рецепты содержат ингредиент "васаби".
А там и он не узнается (хоть его и можно получить). Правда я писал про структуру базы, а не про конкретный вопрос в начале топика. По поводу самого вопроса: Как я понимаю, в таблице, где хранятся статьи есть и ключевые слова к ним. И где-то в конце страницы они выводятся. Да, необходимо делать так: $keys = explode(", ", $row["keys"]); //при выводе из базы for ($i = 0; $i < sizeof($keys); $i++) { echo '<a href="search.php?q='.$keys[$i].'">'.$keys[$i].'</a>'; } А в самом search.php - поставить urldecode при приемке строки запроса. Кодировка не должна быть bin, иначе будет регистрозависимой. Вариант из предыдущего поста это для общего поиска (допустим в разделе "поиск"). Может я чего-то не понял. Вы бы написали примерный вид всего. Что есть и что требуется увидеть.
PHP: <? ... for ($i = 0; $i < sizeof($keys); $i++) { echo '<a href="search.php?q='.$keys[$i].'">'.$keys[$i].'</a>'; } а мне кажется что foreach удобней ;-)
Именно так всё и планировалось. Вы правильно всё поняли. Всё так и сделал. Разбиваю строку, присваиваю ссылки, собираю и вывожу на экран в конце статьи или рецепта. [sql]SELECT recipeTags FROM cooking_recipe WHERE recipeID='$recipe' AND recipeStatus='PUBLISHED'[/sql] PHP: <?php if (!empty($row["recipeTags"])) { // Если строка тэгов в базе не пустая, то: $tags = explode(", ", $row["recipeTags"]); // Разбиваем строку тэгов на слова $tagscount = count($tags); // Считаем их количество for ($i = 0; $i < $tagscount; $i++) { // Перебираем каждый элемент и присваиваем ему ссылку $tags[$i] = "<a href="/search.php?searchquery=".$tags[$i]."">".$tags[$i]."</a>"; } $tagline = implode(", ", $tags); // Собираем обратно, но уже со ссылками echo "<tr><td>"; echo $tagline; // Выводим echo "</td></tr>"; } ?> В search.php проверяю методы GET и POST (поскольку оба используются для поиска) и декодирую: PHP: <?php if($_SERVER['REQUEST_METHOD']=='POST') { if (isset($_POST ['searchquery'])) $searchquery=urldecode($_POST['searchquery']); else $searchquery=''; } else if($_SERVER['REQUEST_METHOD']=='GET') { if (isset($_GET ['searchquery'])) $searchquery=urldecode($_GET['searchquery']); else $searchquery=''; } ?>