главная страница каталог файлов полезные статьи документация форум лицензионное соглашение
FAQ Поиск Пользователи Группы Регистрация Профиль Войти и проверить личные сообщения Вход
Список форумов Natali-Team » PHP-программирование » Другие новости по теме
  « Предыдущая тема | Следующая тема »
 
Начать новую тему Ответить на тему
Другие новости по теме
Late-maestro Сообщение Ср Фев 03, 2010 6:12 pm


новичок

новичок

Регистрация: 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'>&nbsp;
<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>
&nbsp;&nbsp;&nbsp; <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>&nbsp;&nbsp;&nbsp;&nbsp; <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]
Old_Chroft Сообщение Чт Фев 04, 2010 3:17 pm


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

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

Регистрация: 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']
_________________
Всю жизнь как в японском мультике... все вижу - но ничего не понимаю.
Late-maestro Сообщение Чт Фев 04, 2010 6:48 pm


новичок

новичок

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

и спасибо огромное за Ваши советы на счет исправления плохого кода, мне даже страшно подумать, сколько у меня еще таких "недоработочек" Shok
Late-maestro Сообщение Ср Фев 10, 2010 2:34 pm


новичок

новичок

Регистрация: 25.11.2009
Сообщения: 8
Откуда: киев Посмотреть профиль Отправить личное сообщение
Сообщение спасибо за внимание, я уже сама справилась
Показать сообщения:   
Список форумов Natali-Team » PHP-программирование
  Часовой пояс: GMT + 3
 
Страница 1 из 1  
Перейти:  
 
 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах