| Другие новости по теме |
новичок

Регистрация: 25.11.2009
Сообщения: 8
Откуда: киев
|
добрый день!
нужна ваша помощь!
хочу сделать вывод "Других книг (новостей) по теме".
К примеру как здесь (да и на других сайтах полно такого вывода, но я не знаю как)
http://www.kodges.ru/36037-makrojekonomika.html
мои книги лежат в талице books, в ней же есть строка kluch из которой мы выносили word в таблицу key...
мне советовали сделать таким образом
как вывести книги по ключевым словам (ключевые слова уже занесены с помощью скрипта в сообтетствующие таблицы.
это скрипт о котором шла речь выше
Код:
for($res = my("SELECT * FROM books"); $row = mysql_fetch_assoc($res); )
{
$id = $row['id'];
$list = explode(',', $row['kluch']);
foreach($list as $word)
add_key(trim($word), $id, "key", "book_key");
}
function add_key($word, $id, $keytable, $linktable)
{
$word = "'".mysql_escape_string($word)."'";
$id = intval($id);
$key_id = myi("INSERT IGNORE INTO `$keytable` (`word`) VALUES ($word)");
if(!$key_id)
$key_id = my1("SELECT id FROM `$keytable` WHERE `word` = $word");
$key_id = intval($key_id);
my("INSERT INTO `$linktable` (key_id, obj_id) VALUES($key_id, $id)");
}
это те таблицы о которых шла выше речь
Код: CREATE TABLE `key` (
`id` int(11) NOT NULL auto_increment,
`word` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE `word`(`word`)
);
CREATE TABLE `book_key` (
`key_id` int(11) NOT NULL,
`obj_id` int(11) NOT NULL,
PRIMARY KEY (`key_id`,`obj_id`)
);
теперь о том, как собственно выбирать книги по словам.
можно выбрать список номеров ключей, которые ей соответствуют.
SELECT key_id FROM book_key WHERE obj_id = 125
или даже список самих таких книг
SELECT t3.*
FROM book_key t1
JOIN book_key t2 ON t1.key_id = t2.key_id
JOIN books t3 ON t2.obj_id = t3.id
WHERE t1.obj_id = 125
Понятное дело, что в php-код потребуется включить фрагмент, который такой запрос SQL-серверу издаст, и который потом его ответ в виде таблички на странице изобразит.
Вопрос в следующем, как вывести книги по ключевым словам, когда информация о книге выводятся таким образом:
Код: <?php
include ("blocks/bd.php"); /*соединяемся с базой*/
if (isset($_GET['id'])) {$id = $_GET['id'];}
if (!isset($id)) {$id = 1;}
$result = mysql_query ("SELECT * FROM books WHERE id='$id'",$db);
if (!$result)
{
echo "<p>Запрос на выборку данных из базы не прошел. Напишите об этом администратору 1@ukr.net <br><strong>Код ошибки:</strong></p>";
exit (mysql_error());
}
if (mysql_num_rows($result) > 0)
{
$myrow = mysql_fetch_array($result);
$new_view = $myrow["view"] + 1;
$update = mysql_query ("UPDATE books SET view='$new_view' WHERE id='$id'",$db);
}
else
{
echo "<p>Информация по запросу не может быть извлечена. В таблице нет записей.</p>";
exit();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<?
printf ("
<h2 font-size:18px; font-weight:bold; class='view_title'>%s</h2>
<img alt='%s' title='%s' class='mini_books' align='left' src='%s'>
<p class='lesson_left'><span class='lesson_add'>Автор: %s</span></br>
<span class='lesson_add'>Дата добавления: %s</span><br>
<span class='lesson_add'>Просмотров: %s</span></br>
<span class='lesson_add'>Размер: %s Кб</span></br>
<span class='lesson_add'>Закачек: %s</span>
<p class='lesson_left'>%s</p>
<span class='lesson_add'><a target='_blank' rel='nofollow' style='font-size:12px; text-align:left; font-weight:bold; color:#cc0000' href='download.php?id=%s'>Скачать '%s'</a></span></p> <p class='lesson_left'>%s</p>
<p class='lesson_left'>%s</p>",$myrow["title"],$myrow["alt"],$myrow["titleimg"],$myrow["mini_img"],$myrow["author"],$myrow["date"],$myrow["view"],$myrow["size"],$myrow["zaka"],$myrow["text"],$myrow["id"],$myrow["title"],$myrow["link_ru"],$myrow["link_ua"]);
?>
</body> </html>
не понимаю код
Код: SELECT t3.*
FROM book_key t1
JOIN book_key t2 ON t1.key_id = t2.key_id
JOIN books t3 ON t2.obj_id = t3.id
WHERE t1.obj_id = 125
не понятно нужно ли расшифровывать значения t1, t2, t1.key_id, t2.key_id, t3, t2.obj_id, t3.id ?
и что это вообще за t?
Мои страницы с книгами создаются динамически, я не могу написать WHERE t1.obj_id = 125, так как для каждой созданой страницы свой номер книги...
[/code]
|

администратор

Регистрация: 05.01.2008
Сообщения: 12
Откуда: Приволжский ФО
|
Главная проблема ВСЕХ программ - дурное проектирование. Ваша - не исключение. Зачем хранить списки ключевых слов для определенной книги отдельно от самой книги? Добавить в таблицу с книгами столбец key_words, в котором будут храниться списки ключевых слов через запятую - и проблема будет решена в разы проще. Плюс избавитесь от головоломных запросов с JOIN-ами и скрипт будет работать быстрее.
И еще:
Код: if (isset($_GET['id'])) {$id = $_GET['id'];}
if (!isset($id)) {$id = 1;}
$result = mysql_query ("SELECT * FROM books WHERE id='$id'",$db);
Я б программиста за такой код уволил. Предварительно сломав руки, что б такое больше не писал. Я даже не беру в расчет общую корявость - за одно только пренебрежение к безопасности запросов. В первой строке $id = $_GET['id'] срочно замените на
Код: $id = (int)$_GET['id']
_________________ Всю жизнь как в японском мультике... все вижу - но ничего не понимаю.
|
новичок

Регистрация: 25.11.2009
Сообщения: 8
Откуда: киев
|
так у меня так и было. В таблице с книгами books есть графа kluch в которой хранятся все ключи. а мне сказали, сделать еще таблицу key, куда эти ключи переносятся скриптом.... странно, да? у меня на сайте около 500 книг и все ключи есть в таблице books.
С таким вопросом я обратилась к уважаемым программистам; "как вывести другие статьи по теме, если ключевые слова лежат в таблице с книгами". Но вот в итоге, что вышло...
А как бы Вы организовали вывод других книг по теме?
и спасибо огромное за Ваши советы на счет исправления плохого кода, мне даже страшно подумать, сколько у меня еще таких "недоработочек"
|
новичок

Регистрация: 25.11.2009
Сообщения: 8
Откуда: киев
|
спасибо за внимание, я уже сама справилась
|