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

Форум PHP

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

 

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

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

тема: другие новости по теме
 
 автор: VikaRI   (17.03.2009 в 13:25)   письмо автору
 
 

добрый день! подскажите, пожалуйста, как сделать вывод "Других книг (новостей) по теме".
К примеру как здесь (да и на других сайтах полно такого вывода, но я не знаю как)
http://www.kodges.ru/36037-makrojekonomika.html
Спасибо, заранее, всем откликнувшимся

   
 
 автор: nikita2206   (17.03.2009 в 19:26)   письмо автору
 
   для: VikaRI   (17.03.2009 в 13:25)
 

если вы когда нибудь реализовывали поиск на сайте, то это он и есть можно сказать.
просто в качестве ключевого слова берем поочереди слова из залоговка новости

   
 
 автор: VikaRI   (18.03.2009 в 12:35)   письмо автору
 
   для: nikita2206   (17.03.2009 в 19:26)
 

спасибо за подсказку. идея отличная. но поиск никогда реализовывала, я еще вообще мало чего раеализовывала), подскажите,пожалуйста с кодом...

   
 
 автор: VikaRI   (20.03.2009 в 11:25)   письмо автору
 
   для: VikaRI   (18.03.2009 в 12:35)
 

Это действительно такой сложный код, что стоит забыть о нем(((?
Подскажите, пожалуйста!!!!!

   
 
 автор: Hitball   (10.08.2009 в 15:02)   письмо автору
 
   для: VikaRI   (20.03.2009 в 11:25)
 

Меня тоже интересует такой скрипт! ГУРУ, пожалуйста, опишите поподробнее как это сделать!

   
 
 автор: Саня   (10.08.2009 в 16:03)   письмо автору
 
   для: VikaRI   (17.03.2009 в 13:25)
 

В CMS Bitrix привязка новостей по темам осуществляется явно и вручную. Грубо говоря это запись вида: ID исходной новости -> список ID новостей по теме.

   
 
 автор: hitball   (10.08.2009 в 16:14)   письмо автору
 
   для: Саня   (10.08.2009 в 16:03)
 

Так этот сайт сделан на CMS Bitrix?
А нельзя ли применять скрипты с CMS Bitrix для обычных сайтов нfписаных на php и mysql?

   
 
 автор: Саня   (10.08.2009 в 16:20)   письмо автору
 
   для: hitball   (10.08.2009 в 16:14)
 

Этот сайт (softtime.ru) написан не на битриксе. Я просто рассказываю как с вашим вопросом обстоят дела в больших проектах.
Грубо говоря это две таблицы в БД:
novosti (
  id INT,
  title TEXT,
  body TEXT
)

novosti_po_teme (
  parent_id INT,
  child_id INT
)
Где parent_id — идентификатор основной новости, а child_id — идентификатор связанной новости.

   
 
 автор: hitball   (10.08.2009 в 16:38)   письмо автору
 
   для: Саня   (10.08.2009 в 16:20)
 

Спасибо огромное за идею! Сейчас опробую и отпишусь.

   
 
 автор: hitball   (10.08.2009 в 17:43)   письмо автору
 
   для: Саня   (10.08.2009 в 16:20)
 

Забыла спросить, если у меня две таблицы articles и books? как мне организовать таблицу novosti_po_teme? Там все путается в одинаковых id для разных таблиц.

   
 
 автор: Trianon   (10.08.2009 в 17:07)   письмо автору
 
   для: VikaRI   (17.03.2009 в 13:25)
 

Задавая такой вопрос, вообще-то не лишним будет приводить дамп структуры (лучше даже вместе с дампом данных) БД, к которой идут запросы.

   
 
 автор: hitball   (10.08.2009 в 17:56)   письмо автору
1006 байт
 
   для: Trianon   (10.08.2009 в 17:07)
 

Вот дамп структуры. Извените, что сразу его не выложила!

   
 
 автор: hitball   (11.08.2009 в 17:45)   письмо автору
 
   для: hitball   (10.08.2009 в 17:56)
 

Забыла спросить, если у меня две таблицы articles и books?

   
 
 автор: Trianon   (11.08.2009 в 18:18)   письмо автору
 
   для: hitball   (11.08.2009 в 17:45)
 

То есть Вам нужно вывести книги, связанные со статьей?
Или вывести все книги связанные со всеми статьями, которые связаны с конкретной книгой?

Таблица
CREATE TABLE `art_books` 
(
 `art_id` int(6) NOT NULL,  
 `book_id` int(7) NOT NULL,
);


SELECT b.*
  FROM  art_books ab 
    JOIN books b2 ON b.id = ab.book_id
  WHERE art_id = $article


SELECT b.*
  FROM  art_books ab1
    JOIN art_books ab2 ON ab1.art_id = ab2.art_id
    JOIN books b ON b.id = ab2.book_id AND b.id <> ab1.book_id
  WHERE ab1.book_id = $book AND 

   
 
 автор: hitball   (11.08.2009 в 19:05)   письмо автору
 
   для: Trianon   (11.08.2009 в 18:18)
 

Мне нужно вывести в книгах - похожие книги, а в статьях - похожие статьи.

   
 
 автор: mihdan   (11.08.2009 в 19:12)   письмо автору
 
   для: hitball   (11.08.2009 в 19:05)
 

На чем основана похожесть? Я бы предложил сделать как в блоге ввести теги - к каждой книге набор тегов.

   
 
 автор: hitball   (11.08.2009 в 19:17)   письмо автору
 
   для: mihdan   (11.08.2009 в 19:12)
 

да, у меня тоже к каждой книге и статье есть набор ключевых слов, графа в таблице kluch

   
 
 автор: Trianon   (11.08.2009 в 19:19)   письмо автору
 
   для: hitball   (11.08.2009 в 19:17)
 

По каким критериям одна книга считается похожей на другую?

И какое отношение ко всему к этому имеют записи в таблице articles ?

   
 
 автор: hitball   (11.08.2009 в 19:33)   письмо автору
 
   для: Trianon   (11.08.2009 в 19:19)
 

По ключевым словам в поле kluch и по описанию книги в поле text.

   
 
 автор: hitball   (12.08.2009 в 09:18)   письмо автору
 
   для: hitball   (11.08.2009 в 19:33)
 

Отношения таблицы articles и books к друг другу не имеют. Просто нужно выводить под книгами- похожие книги, а под статьями - похожие статьи.

   
 
 автор: Trianon   (12.08.2009 в 09:31)   письмо автору
 
   для: hitball   (11.08.2009 в 19:33)
 

понятно.
не хотим ни делать, ни думать, ни даже на вопросы отвечать по-человечески.

   
 
 автор: hitball   (12.08.2009 в 09:46)   письмо автору
 
   для: Trianon   (12.08.2009 в 09:31)
 

Чесно говоря не знаю, что я ответила "не по-человечески".
Пишу по-другому.
Статья (а также книга) считается похожей одна на другую по ключевым словам в поле kluch и по описанию книги в поле text.
Отношения таблицы articles и books к друг другу не имеют. Просто нужно выводить под книгами- похожие книги, а под статьями - похожие статьи.
А насчет "не хочу думать", так если бы я могла сама придумать, я бы и спрашивала...
Извените, если мои ответы показались Вам неккоректными

   
 
 автор: Trianon   (12.08.2009 в 10:06)   письмо автору
 
   для: hitball   (12.08.2009 в 09:46)
 

Вот пример критерия.
Статья A считается похожей на статью B если содержимое поля kluch записи A равно содержимому поля kluch записи B или содержимое поля text записи A равно содержимому поля text записи B

У Вас же только общие слова.
Слова это конечно хорошо, если четких условий пока нет.
Но тогда они должны подробнейшим образом описывать, что Вы вкладываете в понятие ключевых слов, описания, и тому подобных терминов, на которые ссылаетесь.
Потому что это не термины Базы данных. Это термины Вашей модели.


Сразу замечу - списки чего либо в БД в одном поле чохом не хранят. В том числе и списки ключевых слов.
Для этого организуют таблицу ключевых слов (чтобы иметь список этих самых слов) и таблицу связки, (которую Вам предложил и показал не только я) соединяющую книги и слова.
Ну или в случае статей - статьи и слова.
При чем если ключевые слова одни и те же - достаточно одной таблицы ключевых слов, но само собой - две разные таблицы связок - одна с книги-слова, другая статьи-слова.


В ситуации со статьями меня лично поразило то, что Вы (как оказалось) излагаете две одинаковые по смыслу задачи.

   
 
 автор: hitball   (12.08.2009 в 10:46)   письмо автору
 
   для: Trianon   (12.08.2009 в 10:06)
 

Дамс, вот это дел я натворила. Пойду еще раз осмыслю что Вы написали.

   
 
 автор: serjinio   (12.08.2009 в 10:55)   письмо автору
 
   для: hitball   (11.08.2009 в 19:05)
 

Мне нужно вывести в книгах - похожие книги, а в статьях - похожие статьи.

нужно сделать полнотекстовый индекс по статьям и полнотекстовый индекс по книгам, и искать по нему похожие статьи и похожие книги.
http://dev.mysql.com/doc/refman/4.1/en/fulltext-natural-language.html

   
 
 автор: Trianon   (12.08.2009 в 11:06)   письмо автору
 
   для: serjinio   (12.08.2009 в 10:55)
 

Чушь.
Из-за попытки подменить термин "похожий" собственным пониманием.

   
 
 автор: hitball   (12.08.2009 в 11:27)   письмо автору
 
   для: Trianon   (12.08.2009 в 11:06)
 

А почему нельзя связать "таблицу связки" и ПРОСТО таблицы articles и books (без создания дополнительной таблицы ключевых слов)? Через идентификатор id.
Я бы создала таблицу articles_id - для статей и books_id - для книг. И уже в эту таблицу вручную вписывала бы похожие статьи по id. Только не знаю как связать эти две таблицы.

   
 
 автор: serjinio   (12.08.2009 в 11:43)   письмо автору
 
   для: Trianon   (12.08.2009 в 11:06)
 

Какой вопрос ---такой ответ... :)
В данной постановке вопроса оптимальное решение:
Сделать таблицу связей ,где статьям будут соответствовать определенные книги
или таблицу связей многие-ко-многим ,где не только к статье будут соответствовать разные книги,но и к книге будут соответствовать разные статьи

   
 
 автор: hitball   (12.08.2009 в 11:51)   письмо автору
 
   для: serjinio   (12.08.2009 в 11:43)
 

каким образом это все можно связать?

   
 
 автор: serjinio   (12.08.2009 в 12:16)   письмо автору
 
   для: hitball   (12.08.2009 в 11:51)
 

id_a       article_title
1               статья 1
2               статья 2
3               статья 3

id_b        book_title
1               книга  1
2               книга 2
3               книга 3

к статье 1 относятся книгам 2,3
id_link   id_a        id_b
1          1            2
2          1            3

выбираем книги для статьтьи 1 : WHERE id_a = 1
к книге 1 относятся статьям 3,1
id_link    id_a         id_b
1           3             1
2           1            1

выбираем статьи для книги 1 : WHERE id_b = 1

   
 
 автор: Trianon   (12.08.2009 в 12:19)   письмо автору
 
   для: serjinio   (12.08.2009 в 12:16)
 

id_link в принципе не требуется.

   
 
 автор: hitball   (12.08.2009 в 12:48)   письмо автору
 
   для: serjinio   (12.08.2009 в 12:16)
 

Спасибо большое, но мне действительно надо вывести в книгах - похожие книги, а в статьях - похожие статьи.

   
 
 автор: Trianon   (12.08.2009 в 12:58)   письмо автору
 
   для: hitball   (12.08.2009 в 12:48)
 

если таблицы пока пусты - я не понимаю что Вы теряете.
если списки ключевых слов у Вас уже забиты в таблицы - скрипт, который раскидает списке из полей kluch в отдельные таблицы займет 15-20 строк отсилы.

   
 
 автор: hitball   (12.08.2009 в 13:04)   письмо автору
 
   для: Trianon   (12.08.2009 в 12:58)
 

да как же пустые? у меня статей только штук 500)

   
 
 автор: Trianon   (12.08.2009 в 13:08)   письмо автору
 
   для: hitball   (12.08.2009 в 13:04)
 

Фрагмент дампа мы увидим?

   
 
 автор: hitball   (12.08.2009 в 13:16)   письмо автору
12.1 Кб
 
   для: Trianon   (12.08.2009 в 13:08)
 

Вот кусочек дампа таблицы books

   
 
 автор: Trianon   (12.08.2009 в 13:23)   письмо автору
 
   для: hitball   (12.08.2009 в 13:16)
 

но тут нет поля kluch?

   
 
 автор: hitball   (12.08.2009 в 13:26)   письмо автору
 
   для: Trianon   (12.08.2009 в 13:23)
 

есть, конечно. Оно же поле kluch находится в таблице books. У меня нет отдельной таблицы для ключевых слов.

   
 
 автор: Trianon   (12.08.2009 в 13:50)   письмо автору
 
   для: hitball   (12.08.2009 в 13:26)
 

А, пардон.
Тогда алгоритм, схематично представленный в предыдущей реплике(12.08.2009 в 13:19), вполне это поле разложит по таблицам.
Если эти таблицы создать, конечно.

   
 
 автор: Trianon   (12.08.2009 в 13:19)   письмо автору
 
   для: Trianon   (12.08.2009 в 13:08)
 

Вкратце, если позволите:

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)");
}

   
 
 автор: hitball   (12.08.2009 в 13:45)   письмо автору
 
   для: Trianon   (12.08.2009 в 13:19)
 

Я так понимаю мне нужно создать какие-то дополнительные поля в таблице?

   
 
 автор: Trianon   (12.08.2009 в 13:46)   письмо автору
 
   для: hitball   (12.08.2009 в 13:45)
 

Нет. Их и так уже перебор.
Вам нужно рассказать, где лежат ключевые слова, и что самое главное - как они там лежат?

   
 
 автор: hitball   (12.08.2009 в 13:50)   письмо автору
 
   для: Trianon   (12.08.2009 в 13:46)
 

Ключевые слова лежат в таблицах books и articles. В графе kluch.
Лежат они, к примеру, в таком виде: дети, родители, развитие детей, обучение, игры.
Как видите, у меня иногда встречается и сочетания слов.

   
 
 автор: Trianon   (12.08.2009 в 12:21)   письмо автору
 
   для: serjinio   (12.08.2009 в 11:43)
 

Вы бы прочли сперва тред.
В частности (11.08.2009 в 18:18)
Что за идея ляпнуть не глядя то, что уже показано?

   
 
 автор: Loki   (12.08.2009 в 11:49)   письмо автору
 
   для: Trianon   (12.08.2009 в 11:06)
 

Отчего же... это вполне реально... правда целесообразность... а тем паче эффективность... мде...

   
 
 автор: hitball   (12.08.2009 в 11:55)   письмо автору
 
   для: Loki   (12.08.2009 в 11:49)
 

Я, конечно, понимаю, что это будет очень хлопотно, но, мне кажеться, что создавать новую таблицу с ключевыми словами будет еще хлопотнее или Вам так не кажеться?

   
 
 автор: Trianon   (12.08.2009 в 12:23)   письмо автору
 
   для: hitball   (12.08.2009 в 11:55)
 

нет.
Это не так.
Тем более что у Вас в дампе с десяток таблиц присутствует.
А значит сами по себе таблицы ценностью не являются.

   
 
 автор: Loki   (12.08.2009 в 12:25)   письмо автору
 
   для: hitball   (12.08.2009 в 11:55)
 

Зависит от того, что Вы хотите получить в итоге. Если работающее приложение, то ключевые слова - наименее затратное решение, если "псевдоинтеллектуальную систему", которая неважно сколько занимает места и/или как быстро работает, тогда можно и через полнотекстовый поиск.

   
 
 автор: Trianon   (12.08.2009 в 12:19)   письмо автору
 
   для: Loki   (12.08.2009 в 11:49)
 

Забивание шурупов молотком - вполне реальный прием...

   
 
 автор: Loki   (12.08.2009 в 12:28)   письмо автору
 
   для: Trianon   (12.08.2009 в 12:19)
 

И ведь заметь, забитый шуруп держится лучше чем завинченный гвоздь:)

   
 
 автор: Trianon   (12.08.2009 в 12:29)   письмо автору
 
   для: Loki   (12.08.2009 в 12:28)
 

Я вот гадал, хватит тебя такта не вспоминать эту пошлость или нет?
Точнее, вспомнив, понять, что я о ней тоже помню. И не цитировать.
Не угадал.

   
 
 автор: hitball   (12.08.2009 в 12:30)   письмо автору
 
   для: Trianon   (12.08.2009 в 12:29)
 

Ничего не пошлость, а очень образно)

   
 
 автор: Trianon   (12.08.2009 в 12:35)   письмо автору
 
   для: hitball   (12.08.2009 в 12:30)
 

Я знаю. Сам здесь цитировал.
Но просто именно эта идея - развратна по сути.
Нельзя оправдывать выбор плохого приема тем, что в теории существует худший.

   
 
 автор: Loki   (12.08.2009 в 12:34)   письмо автору
 
   для: Trianon   (12.08.2009 в 12:29)
 

Я уже заметил постом выше что зависит от задач: если задачи реальные, то и методы должны быть адекватные, если же делаем "сферического коня в вакууме", то можно ни в чем себе не отказывать.

   
 
 автор: Trianon   (12.08.2009 в 12:37)   письмо автору
 
   для: Loki   (12.08.2009 в 12:34)
 

забитый шуруп это метод, неадекватный любой цели.
К теме.
Ты предложил выбрать из текущей книги список её ключевых слов и воткнуть напрямую в полнотекстовый запрос?

полнотекстовый запрос (шуруп) проектировался для обработки human-created поисковых запросов (из расчета на то, что будет завинчен отверткой)

   
 
 автор: Loki   (12.08.2009 в 12:41)   письмо автору
 
   для: Trianon   (12.08.2009 в 12:37)
 

Даже еще тупее: скормить текст книги в качестве полнотекстового запроса и получить пары id - релевантность.

   
 
 автор: Trianon   (12.08.2009 в 12:43)   письмо автору
 
   для: Loki   (12.08.2009 в 12:41)
 

О... это не конь в вакууме. Это газенваген какой-то...

   
 
 автор: Loki   (12.08.2009 в 12:50)   письмо автору
 
   для: Trianon   (12.08.2009 в 12:43)
 

Собственно, это всего лишь комментарий к утверждению что похожесть можно определять на основании результатов полнотекстового поиска. Да можно. Попробуй не согласиться:)

И чем принципиально система ключевых слов отличается от этого? Только тем, что в данном случае определение ключевых слов отдано на откуп механизму построения полнотекстовых индексов.

   
 
 автор: Trianon   (12.08.2009 в 13:00)   письмо автору
 
   для: Loki   (12.08.2009 в 12:50)
 

>Собственно, это всего лишь комментарий к утверждению что похожесть можно определять на основании результатов полнотекстового поиска. Да можно. Попробуй не согласиться:)

Можно.
Просто у нас цели разные.

   
 
 автор: hitball   (12.08.2009 в 14:53)   письмо автору
 
   для: Trianon   (12.08.2009 в 13:00)
 

Ключевые слова лежат в таблицах books и articles. В графе kluch.
Лежат они, к примеру, в таком виде: дети, родители, развитие детей, обучение, игры.
Как видите, у меня иногда встречается и сочетания слов.

   
 
 автор: Trianon   (12.08.2009 в 16:50)   письмо автору
 
   для: hitball   (12.08.2009 в 14:53)
 

представленный код с этим полем kluch и работает

   
 
 автор: hitball   (12.08.2009 в 17:26)   письмо автору
 
   для: Trianon   (12.08.2009 в 16:50)
 

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)");


Извените за настойчивость, я понимаю, что за сегодня Вы уже переобщались со мной...
Пожалуйста, расскажите, что это за переменные:
"key", "book_key", $keytable, $linktable, $word...
А то мне выдает такую ошибку: Fatal error: Call to undefined function: my() in
Я явно что-то не то делаю

   
 
 автор: Trianon   (12.08.2009 в 18:35)   письмо автору
 
   для: hitball   (12.08.2009 в 17:26)
 

Я нарисовал набросок кода.
в моем примере:
$keytable - параметр функции, который показывает имя таблицы с ключевыми словами .
$linktable - параметр функции, который показывает имя таблицы связки ключ-книга, или ключ-статья
соответственно
key - название таблицы ключевых слов key(key_id, obj_id)
book_key - название таблицы связки ключ-книга book_key(id, word)

функци my(), my1(), myi() - аналоги mysql_query() , mysql_result(mysql_query(),0) и mysql_insert_id(mysql_query()) с соответствующим аккуратным анализом ошибок и вывдачей результатов.

   
 
 автор: hitball   (12.08.2009 в 19:16)   письмо автору
 
   для: Trianon   (12.08.2009 в 18:35)
 

Я совсем запуталась.
Мне нужно создать таблицы key с полями key_id, obj_id и book_key с полями id, word?
Или что обозначают переменные в скобках?
Какие данные мне нужно заменить на свои?

   
 
 автор: Trianon   (12.08.2009 в 19:30)   письмо автору
 
   для: hitball   (12.08.2009 в 19:16)
 

Прошу прощения.
Это я уже наборы полей перепутал.
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`)
);


Все имена исключительно для примера.
Я ничего не навязываю.

   
 
 автор: hitball   (12.08.2009 в 21:30)   письмо автору
 
   для: Trianon   (12.08.2009 в 19:30)
 

названия очень подходящие.
Но у меня не получилось.
Пишет ошибку: Parse error: syntax error, unexpected $end
А какие данные мне необходимо заносить в эти таблицы?

   
 
 автор: Trianon   (12.08.2009 в 22:02)   письмо автору
4.4 Кб
 
   для: hitball   (12.08.2009 в 21:30)
 

Эти.
таблицы.
заполняет.
скрипт.
который я привел в (12.08.2009 в 13:19)
Беря данные из полей kluch Вашей таблицы.
Во всяком случае у меня - после того, как я набросал те три функции - заполнил.

но можете заполнить и сами (см. аттач)

   
 
 автор: Trianon   (12.08.2009 в 22:17)   письмо автору
 
   для: Trianon   (12.08.2009 в 22:02)
 

<?php 
function my($sql)
{
    
$res mysql_query($sql);
    if(!
$res)
        exit(
"error in: <hr> ".nl2br(htmlspecialchars($sql))."<hr>".mysql_error());
    return 
$res;
}
function 
my0($sql)
   {    
$res my($sql);    return  mysql_num_rows($res) ?  mysql_fetch_array($res) : 0;}

function 
my1($sql)
   {    
$row my0($sql);   return  is_array($row)? $row[0] : 0; }

function 
myi($sql)
  {    
$res my($sql);     return  mysql_affected_rows() ? mysql_insert_id() : 0; }
?>

   
 
 автор: hitball   (13.08.2009 в 08:52)   письмо автору
 
   для: Trianon   (12.08.2009 в 22:17)
 

Доброе утро!
Продолжаю доставать Вас дилетантскими вопросами.
Что мне делать с последним приведенным кодом?

И теперь выдает такую ошибку:
error in:
INSERT INTO `book_key` (key_id, obj_id) VALUES(129, 288)
Duplicate entry '129-288' for key 1

   
 
 автор: Trianon   (13.08.2009 в 10:35)   письмо автору
 
   для: hitball   (13.08.2009 в 08:52)
 

>Что мне делать с последним приведенным кодом?
Здрасти. Приехали.
Что мне делать с Вашим дампом?


>
>И теперь выдает такую ошибку:
И когда - теперь?

>error in:
>INSERT INTO `book_key` (key_id, obj_id) VALUES(129, 288)
>Duplicate entry '129-288' for key 1

Такое может произойти только при повторном вызове скрипта.

   
 
 автор: hitball   (13.08.2009 в 11:04)   письмо автору
 
   для: Trianon   (13.08.2009 в 10:35)
 

Вы хотите сказать, что я два раза написала в коде один и тот же скрипт?
Но ведь это не так.
Не знаю какой именно из моих скриптов мешает работать Вашему, по-этому приведу код страницы view_books.php целиком.

<?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>Запрос на выборку данных из базы не прошел. Напишите об этом администратору Late-maestro@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 > 
<head> 
<meta name="Description" content="<?php echo $myrow['meta_d']; ?>" /> 
<meta name="Keywords" content="<?php echo $myrow['meta_k']; ?>" /> 
<meta http-equiv="Content-type" content="text/html; charset=windows-1251" /> 
<title><?php echo $myrow['title']; ?></title> 
<meta http-equiv="Content-type" content="text/html; charset=windows-1251" /> 
<link href="style.css" rel="stylesheet" type="text/css" />
<style type="text/css">
<!--
TABLE {
 table-layout: fixed; /* Ячейки фиксированной ширины */
}
-->
</style>
</head> 
<body> 
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="main_border"> 
<!--Подключаем шапку--> 
<? include("blocks/header.php"); ?> 
<td ><div align="center"> 
<table width="100%" cellpadding="0" cellspacing="0"> 
<tr> 
<!--левую часть--> 
<? include ("blocks/lefttd.php"); ?> 
<td width="63%" valign="top"><? include ("blocks/nav.php");?><p> 
<?  
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 style='font-size:10px; text-align:left; color:#808080;'><span style='font-weight:bold; color:#808080;'>Книга найдена по ключевым словам:</span> %s</p>

<p class='lesson_left'>%s</p>
&nbsp;&nbsp;&nbsp; <span class='lesson_add'><a 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["kluch"],$myrow["text"],$myrow["id"],$myrow["title"],$myrow["link_ru"],$myrow["link_ua"]);    
?> 



<form action="download.php" method="post" name="vv"> 
<p class="pvot">Поставить оценку: &nbsp; 1 <input name="score" type="radio" value="1" /> 2 <input name="score" type="radio" value="2" /> 3 <input name="score" type="radio" value="3" /> 4 <input name="score" type="radio" value="4" /> 5 <input name="score" type="radio" value="5" checked/>&nbsp;&nbsp; 
<input class="sub_vote" name="submit" type="submit" value="Оценить" /> 
<input name="id" type="hidden" value="<? echo "$id";?>" /> 
</p> 
</form> 


<? 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)"); 
?>


<?php  
function my($sql

    
$res mysql_query($sql); 
    if(!
$res
        exit(
"error in: <hr> ".nl2br(htmlspecialchars($sql))."<hr>".mysql_error()); 
    return 
$res

function 
my0($sql
   {    
$res my($sql);    return  mysql_num_rows($res) ?  mysql_fetch_array($res) : 0;} 

function 
my1($sql
   {    
$row my0($sql);   return  is_array($row)? $row[0] : 0; } 

function 
myi($sql
  {    
$res my($sql);     return  mysql_affected_rows() ? mysql_insert_id() : 0; } 
?>


<? 
echo "<p class='post_comment'>Комментарии:</p>"
$result3 mysql_query ("SELECT * FROM comments_books WHERE post='$id'",$db); 
if (
mysql_num_rows ($result3) > 0

$myrow3 mysql_fetch_array($result3); 
do 

printf ("<div class='post_div'><p class='post_comment_add'>Комментарий добавил(а): <strong>%s </strong><br> Дата: <strong> %s</strong></p><p class='post_comment_addd'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%s</p></div>",$myrow3["author"], $myrow3["date"], $myrow3["text"]); 

while (
$myrow3 mysql_fetch_array($result3)); 

$result4 mysql_query ("SELECT img FROM comments_setting",$db); 
$myrow4 mysql_fetch_array ($result4); 
?>
<p class='post_comment'>Добавить Ваш комментарий или пожаловаться на битую ссылку:</p> 
<form action="comment_books.php" method="post" name="form_com"> 
<p class='post_comment_add'><label>Ваше имя: </label><input name="author" type="text" size="42" maxlength="40" /></p> 
<p class='post_comment_add'><label>Текст комментария: <br><textarea name="text" cols="40" rows="4"></textarea></label></p> 
<p class='post_comment_add'>Введите сумму чисел с картинки</p> 
<p class='post_comment_add' ><img style='margin-top:9px;' src="<? echo $myrow4["img"]; ?>" alt="Финансовая грамотность" width="58" height="31" />  
<input style='margin-bottom:10px;' name="pr" type="text" size="5" maxlength="5" /></p> 
<input name="id" type="hidden" value="<? echo $id?>" /> 
<p class='post_comment_add' ><input name="sub_com" type="submit" value="Комментировать" /></p> 
</form> 
</p>

.

</td> 
<!--Подключаем правую часть--> 
<div align="center"> 
<? include("blocks/pravtd.php"); ?> 
</div> 
</tr> 
</table> 
</div></td> 
</tr> 
<!--Подключаем низ--> 
<? include ("blocks/footer.php")?> 
</table> 
</body> 
</html>

   
 
 автор: Trianon   (13.08.2009 в 11:11)   письмо автору
 
   для: hitball   (13.08.2009 в 11:04)
 

код вообще говоря предназначен был для однократного вызова - чтобы списки ключей переделать для тех пятисот записей, которые у Вас уже в таблице.
Хотя функцию add_key можно применить и для добавления ключей вновь добавляемых записей.

Правда для этого код нужно понять, а не слепо копировать.

Попытка повторно перегнать все ключевые наборы, естественно, приводит к ошибкам о дублирующихся записях.

   
 
 автор: hitball   (13.08.2009 в 11:14)   письмо автору
 
   для: Trianon   (13.08.2009 в 11:11)
 

То есть для новых записей он не будет работать, да?

Правда для этого код нужно понять, а не слепо копировать.

В моем случае лучше слепо копировать, а то хуже сделаю...

   
 
 автор: Trianon   (13.08.2009 в 11:16)   письмо автору
 
   для: hitball   (13.08.2009 в 11:14)
 

>В моем случае лучше слепо копировать, а то хуже сделаю...

Тогда лучше было обращаться не ко мне.

Сделать хуже, чем слепо что-то скопировать (пусть даже идеальный код), по-моему, просто невозможно.

   
 
 автор: hitball   (13.08.2009 в 11:21)   письмо автору
 
   для: Trianon   (13.08.2009 в 11:16)
 

Спасибо за веру в мои способности)

   
 
 автор: Trianon   (13.08.2009 в 11:33)   письмо автору
 
   для: hitball   (13.08.2009 в 11:21)
 

приведенный код лучше прикрепить в виде файла, поскольку в окно экрана он не лезет категорически.
И без вставки нового.

Кроме того, изменения нужно делать в том скрипте , который заносит записи, и возможно редактирует списки ключей, если такое поддерживается.

   
 
 автор: Trianon   (13.08.2009 в 11:19)   письмо автору
 
   для: hitball   (13.08.2009 в 11:14)
 

Для новых записей не нужен цикл SELECTа по старым.
Для новой требуется лишь добавить ключи из списка этой записи.

   
 
 автор: hitball   (13.08.2009 в 12:02)   письмо автору
 
   для: hitball   (13.08.2009 в 11:04)
 

Я не очень разбираюсь в Ваших записях
<функци my(), my1(), myi() - аналоги mysql_query() , mysql_result(mysql_query(),0) и mysql_insert_id(mysql_query()) с соответствующим аккуратным анализом ошибок и вывдачей результатов.

Не знаю как мне убрать SELECT из Вашего скрипта, чтобы ничего не напортить...

   
 
 автор: Trianon   (13.08.2009 в 12:10)   письмо автору
 
   для: hitball   (13.08.2009 в 12:02)
 

верните свои скрипты в исходное состояние.

   
 
 автор: hitball   (13.08.2009 в 12:17)   письмо автору
 
   для: Trianon   (13.08.2009 в 12:10)
 

Мой скрипт так и выглядит
<?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>Запрос на выборку данных из базы не прошел. Напишите об этом администратору Late-maestro@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 >  
<head>  
<meta name="Description" content="<?php echo $myrow['meta_d']; ?>" />  
<meta name="Keywords" content="<?php echo $myrow['meta_k']; ?>" />  
<meta http-equiv="Content-type" content="text/html; charset=windows-1251" />  
<title><?php echo $myrow['title']; ?></title>  
<meta http-equiv="Content-type" content="text/html; charset=windows-1251" />  
<link href="style.css" rel="stylesheet" type="text/css" /> 
<style type="text/css"> 
<!-- 
TABLE { 
 table-layout: fixed; /* Ячейки фиксированной ширины */ 

--> 
</style> 
</head>  
<body>  
<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" class="main_border">  
<!--Подключаем шапку-->  
<? include("blocks/header.php"); ?>  
<td ><div align="center">  
<table width="100%" cellpadding="0" cellspacing="0">  
<tr>  
<!--левую часть-->  
<? include ("blocks/lefttd.php"); ?>  
<td width="63%" valign="top"><? include ("blocks/nav.php");?><p>  
<?   
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 style='font-size:10px; text-align:left; color:#808080;'><span style='font-weight:bold; color:#808080;'>Книга найдена по ключевым словам:</span> %s</p> 

<p class='lesson_left'>%s</p> 
&nbsp;&nbsp;&nbsp; <span class='lesson_add'><a 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["kluch"],$myrow["text"],$myrow["id"],$myrow["title"],$myrow["link_ru"],$myrow["link_ua"]);     
?>  

.  

<form action="download.php" method="post" name="vv">  
<p class="pvot">Поставить оценку: &nbsp; 1 <input name="score" type="radio" value="1" /> 2 <input name="score" type="radio" value="2" /> 3 <input name="score" type="radio" value="3" /> 4 <input name="score" type="radio" value="4" /> 5 <input name="score" type="radio" value="5" checked/>&nbsp;&nbsp;  
<input class="sub_vote" name="submit" type="submit" value="Оценить" />  
<input name="id" type="hidden" value="<? echo "$id";?>" />  
</p>  
</form>  


<? 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)");  
?> 


<?php   
function my($sql)  
{  
    
$res mysql_query($sql);  
    if(!
$res)  
        exit(
"error in: <hr> ".nl2br(htmlspecialchars($sql))."<hr>".mysql_error());  
    return 
$res;  
}  
function 
my0($sql)  
   {    
$res my($sql);    return  mysql_num_rows($res) ?  mysql_fetch_array($res) : 0;}  

function 
my1($sql)  
   {    
$row my0($sql);   return  is_array($row)? $row[0] : 0; }  

function 
myi($sql)  
  {    
$res my($sql);     return  mysql_affected_rows() ? mysql_insert_id() : 0; }  
?> 


<?  
echo "<p class='post_comment'>Комментарии:</p>";  
$result3 mysql_query ("SELECT * FROM comments_books WHERE post='$id'",$db);  
if (
mysql_num_rows ($result3) > 0)  
{  
$myrow3 mysql_fetch_array($result3);  
do  
{  
printf ("<div class='post_div'><p class='post_comment_add'>Комментарий добавил(а): <strong>%s </strong><br> Дата: <strong> %s</strong></p><p class='post_comment_addd'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%s</p></div>",$myrow3["author"], $myrow3["date"], $myrow3["text"]);  
}  
while (
$myrow3 mysql_fetch_array($result3));  
}  
$result4 mysql_query ("SELECT img FROM comments_setting",$db);  
$myrow4 mysql_fetch_array ($result4);  
?> 
<p class='post_comment'>Добавить Ваш комментарий или пожаловаться на битую ссылку:</p>  
<form action="comment_books.php" method="post" name="form_com">  
<p class='post_comment_add'><label>Ваше имя: </label><input name="author" type="text" size="42" maxlength="40" /></p>  
<p class='post_comment_add'><label>Текст комментария: <br><textarea name="text" cols="40" rows="4"></textarea></label></p>  
<p class='post_comment_add'>Введите сумму чисел с картинки</p>  
<p class='post_comment_add' ><img style='margin-top:9px;' src="<? echo $myrow4["img"]; ?>" alt="Финансовая грамотность" width="58" height="31" />   
<input style='margin-bottom:10px;' name="pr" type="text" size="5" maxlength="5" /></p>  
<input name="id" type="hidden" value="<? echo $id?>" />  
<p class='post_comment_add' ><input name="sub_com" type="submit" value="Комментировать" /></p>  
</form>  
</p> 



</td>  
<!--Подключаем правую часть-->  
<div align="center">  
<? include("blocks/pravtd.php"); ?>  
</div>  
</tr>  
</table>  
</div></td>  
</tr>  
<!--Подключаем низ-->  
<? include ("blocks/footer.php")?>  
</table>  
</body>  
</html>

   
 
 автор: Trianon   (13.08.2009 в 12:21)   письмо автору
 
   для: hitball   (13.08.2009 в 12:17)
 

В этом скрипте нет ни одного SQL-оператора INSERT
Как он вообще может что-то добавлять в базу?

Кроме того, мои строки из него нужно удалить. Все.
Не потому что жалко, а потому что в нем они будут нарушать логику работы.
Они не для него писались.

   
 
 автор: hitball   (13.08.2009 в 12:24)   письмо автору
 
   для: Trianon   (13.08.2009 в 12:21)
 

Я их уже вынесла в файл key.php и подключила через
<? include ("key.php");?>

   
 
 автор: Trianon   (13.08.2009 в 12:27)   письмо автору
 
   для: hitball   (13.08.2009 в 12:24)
 

так и подключение нужно убрать.
В таком виде его оставлять смысла нет.

Вы не ответили на вопрос - какой скрипт у Вас добавляет в таблицу строку о книге?
Или хотя бы формирует значение поля kluch ?
Вностить изменения придется в нем.

   
 
 автор: hitball   (13.08.2009 в 12:28)   письмо автору
 
   для: Trianon   (13.08.2009 в 12:27)
 

Конечно не имеет, он же мне выдает всю ту же ошибку(

Вот этот скрипт выводит данные о книге
<?    
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 style='font-size:10px; text-align:left; color:#808080;'><span style='font-weight:bold; color:#808080;'>Книга найдена по ключевым словам:</span> %s</p>  

<p class='lesson_left'>%s</p>  
&nbsp;&nbsp;&nbsp; <span class='lesson_add'><a 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["kluch"],$myrow["text"],$myrow["id"],$myrow["title"],$myrow["link_ru"],$myrow["link_ua"]);      
?>  

   
 
 автор: Trianon   (13.08.2009 в 12:45)   письмо автору
 
   для: hitball   (13.08.2009 в 12:28)
 

Создайте, пожалуйста, еще одну тему - эта слишком длинная уже.

Откуда взялись эти данные в таблице БД?

   
 
 автор: hitball   (13.08.2009 в 12:53)   письмо автору
 
   для: Trianon   (13.08.2009 в 12:45)
 

создала
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=67298&page=1

   
Rambler's Top100
вверх

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