Показване на сродни новни?

streleca_stz

Registered
Здравейте! Искам да ви попитам как би трябвало да стане заявката, за да може да изкарва сродни новини? Понеже аз се мъчих, но все ми изкарваше същата новина като сродна..?
 
PHP:
$title = "asd";
$i = '';
$query = mysql_query("SELECT * FROM `table` WHERE title LIKE '%$title%' ORDER BY title LIMIT 0,10;");
if (mysql_num_rows($query) > 0) {
	while ($row = mysql_fetch_array($query)) {
		$i++;
		echo "$i: <a href=\"#\">$row[title]</a><br />";
	}
} else {
	echo " Няма намерени сродни новини";
}
 
За да прецениш наистина дали една новина е подобна на друга трябва да ползваш full-text search. Така имаш възможност да подредиш резултатите по процент на съвпадение. like търси за точно съвпадение, според мен няма да свърши работа в този случай.

Хвърли един поглед на тези адреси:
http://devzone.zend.com/article/1304
http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

Освен това имаш шанс да работиш с мааалко по-дълги стрингове (разумно по-дълги) с висока скорост, но за сметка на малко по-голямо физическо пространство. Не ти препоръчвам да ползваш съдържанието на новината за сравнение. Ползвай заглавията и ключови думи, ако отделят такива.

P.S. - има един drawback на този метод. Той изисква повечко ресурси и затова обикновено има ограничение от страна на сървъра за търсените стрингове. Те не могат да са по-малки от 4 символа (все пак помисли си какво ще стане ако започнат да се сравняват всички съюзи - и, но, за, до...). Все пак можеш да настроиш сървъра така, че този лимит да е 3 символа без проблем.
 
sandh каза:
За да прецениш наистина дали една новина е подобна на друга трябва да ползваш full-text search. Така имаш възможност да подредиш резултатите по процент на съвпадение. like търси за точно съвпадение, според мен няма да свърши работа в този случай.

Хвърли един поглед на тези адреси:
http://devzone.zend.com/article/1304
http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

Освен това имаш шанс да работиш с мааалко по-дълги стрингове (разумно по-дълги) с висока скорост, но за сметка на малко по-голямо физическо пространство. Не ти препоръчвам да ползваш съдържанието на новината за сравнение. Ползвай заглавията и ключови думи, ако отделят такива.

P.S. - има един drawback на този метод. Той изисква повечко ресурси и затова обикновено има ограничение от страна на сървъра за търсените стрингове. Те не могат да са по-малки от 4 символа (все пак помисли си какво ще стане ако започнат да се сравняват всички съюзи - и, но, за, до...). Все пак можеш да настроиш сървъра така, че този лимит да е 3 символа без проблем.

Мм нещо не мога да го разбера този фул-текст .. До колкото го разбрах, се променя и в phpmyadmin?
 
Ако имаш phpmyadmin - можеш да го ползваш, да. Иначе можеш да го добавиш и така:
- A full-text index in MySQL is an index of type FULLTEXT.

- Full-text indexes can be used only with MyISAM tables, and can be created only for CHAR, VARCHAR, or TEXT columns.

- A FULLTEXT index definition can be given in the CREATE TABLE statement when a table is created, or added later using ALTER TABLE or CREATE INDEX.

http://www.mysqlfaqs.net/mysql-faqs/Indexes/Full-Text-Indexes/How-to-create-full-text-index-in-MySQL
 
sandh каза:
За да прецениш наистина дали една новина е подобна на друга трябва да ползваш full-text search. Така имаш възможност да подредиш резултатите по процент на съвпадение. like търси за точно съвпадение, според мен няма да свърши работа в този случай.
...

Ползвам го за сравнение при заглавия или ключови думи - работи. Без да тестваш нещо, няма начин да разбереш дали работи :?:
 
Работи, когато търсиш една дума в заглавието на новината.

Обаче ако сравняваш две заглавия... например:
- Борисов ще строи нова магистрала
- Нова магистрала ще строи Борисов

Тези две заглавия са не само подобни, а дори се отнасят за едно и също нещо, т.е. тук трябва да получиш 100% съвпадение.

ако направиш така:[sql]select * from `news` where `title` like '%Борисов ще строи нова магистрала%';[/sql]Какво ще стане? Нищо, базата данни няма да намери втората новина, защото заглавието просто не е същото.

Ако търсиш така обаче:
[sql]select * from
`news`
where
`title` like '%Борисов%' or
`title` like '%ще%' or
`title` like '%строи%' or
`title` like '%нова%' or
`title` like '%магистрала%'
;[/sql]Това вече ще има някакъв ефект, но първо - заявката ще е много по-бавна, второ - пак нямаш процент на съвпадение - т.е. няма как да разбереш коя новина съвпада в по-голяма степен (тук вече влиза и сравняване на комбинации от тези думи като фрази... в най-лошия случай - декартово произведение, което ще ти гръмне сървъра).
 
Факт, но преувеличи малко с описанието..



- декартово произведение, което ще ти гръмне сървъра

(примерен код)

[sql]ALTER TABLE `table` ADD FULLTEXT (title); [/sql]

PHP:
$query = mysql_query("SELECT id FROM `table` WHERE id != $id AND MATCH (title) AGAINST ('". addslashes($title) ."') ORDER BY id DESC LIMIT 0,10")or die(mysql_error());

ЕДИТ:
PHP:
$id = 1;
$title = "asd";
$i = '';
$query = mysql_query("SELECT id FROM `table` WHERE id != $id AND MATCH (title) AGAINST ('". addslashes($title) ."') ORDER BY id DESC LIMIT 0,10")or die(mysql_error());
if (mysql_num_rows($query) > 0) {
        while ($row = mysql_fetch_array($query)) {
                $i++;
                echo "$i: <a href=\"#\">$row[title]</a><br />";
        }
} else {
        echo " Няма намерени сродни новини";
}
 
Не разбрах примера. Това, което цитираш е правилното решение според мен.

P.S. - към това отгоре може само да се промени order by клаузата, както е в линка към zend.com, за да подрежда резултатите по процент на съвпадение (или напълно да се премахне, защото сортирането по подразбиране е откъм най-точния към по-слабия избор).
 
Хмм на мен ми дава грешка..?
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND MATCH (title) AGAINST ('') ORDER BY post_id DESC LIMIT 0,10' at line 1
Ето как аз го преправих и добавих fulltext-a
PHP:
$id = $row['post_id'];
$other_title = $row['title'];
$i = '';
$query = mysql_query("SELECT post_id,title FROM `posts` WHERE post_id != $id AND MATCH (title) AGAINST ('". addslashes($other_title) ."') ORDER BY post_id DESC LIMIT 0,10")or die(mysql_error());
if (mysql_num_rows($query) > 0) {
	while ($other = mysql_fetch_array($query)) {
	$i++;
	echo "$i: <a href=\"#\">$other[title]</a><br />";
}
} else {
	echo " Няма намерени сродни новини";
}
 
PHP:
			$id = $row['post_id'];
			$other_title = $row['title'];
			$i='';
			$mysql = mysql_query("SELECT * ,
			MATCH (
			title
			)
			AGAINST (
			'$other_title'
			) AS score
			FROM `announced`
			WHERE post_id != $id
			AND MATCH (
			title
			)
			AGAINST (
			'$other_title'
			IN BOOLEAN
			MODE
			)
			ORDER BY score DESC
			LIMIT 0 , 10;");
			if (mysql_num_rows($mysql) > 0) {
				while ($other = mysql_fetch_array($mysql)) {
					$i++;
					echo "$i: <a href=\"#\">{$other['title']}</a><br />";
				}
			} else {
				echo " Няма намерени подобни обяви ";
			}
 
nom3r1 каза:
PHP:
			$id = $row['post_id'];
			$other_title = $row['title'];
			$i='';
			$mysql = mysql_query("SELECT * ,
			MATCH (
			title
			)
			AGAINST (
			'$other_title'
			) AS score
			FROM `announced`
			WHERE post_id != $id
			AND MATCH (
			title
			)
			AGAINST (
			'$other_title'
			IN BOOLEAN
			MODE
			)
			ORDER BY score DESC
			LIMIT 0 , 10;");
			if (mysql_num_rows($mysql) > 0) {
				while ($other = mysql_fetch_array($mysql)) {
					$i++;
					echo "$i: <a href="#">{$other['title']}</a><br />";
				}
			} else {
				echo " Няма намерени подобни обяви ";
			}
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in D:\xampp\htdocs\tokiohotel-bg\bg\read_more.php on line 107
 
Вместо `announced` трябва да е твоята таблица... тоест `posts`

Ако пак дава грешка си дай целия код.
 
Мм да и като го смених пак ми даде грешка..

Ми и да ти дам целия код.. то не е нищо особено. извикването на 1 заявка за новината и проверка дали ID-то е вярно...?
 
[sql]SELECT * ,
MATCH (title)
AGAINST ('$other_title') AS score
FROM `announced`
WHERE post_id != '$id'
AND MATCH (title)
AGAINST ('$other_title' IN BOOLEAN MODE)
ORDER BY score DESC
LIMIT 0 , 10[/sql]
 
Karcho каза:
[sql]SELECT * ,
MATCH (title)
AGAINST ('$other_title') AS score
FROM `announced`
WHERE post_id != '$id'
AND MATCH (title)
AGAINST ('$other_title' IN BOOLEAN MODE)
ORDER BY score DESC
LIMIT 0 , 10[/sql]

Сега не вади грешка, но на всички новини показва, че няма дродни новини (а знам, че трябва да имат..) май ще се размина със сродните новини..
 
Дай си целия код... чакате на готово и не можете да отделите от безценното си време , за да се научите къде грешите и да прочетете някой друг ред..
 
nom3r1 каза:
Дай си целия код... чакате на готово и не можете да отделите от безценното си време , за да се научите къде грешите и да прочетете някой друг ред..

<?php
$queryString = strtolower($_SERVER['QUERY_STRING']);
if (strstr($queryString,"<") OR strstr($queryString,">") OR strstr($queryString,"(") OR strstr($queryString,")") OR
strstr($queryString,"..") OR
strstr($queryString,"%") OR
strstr($queryString,"*") OR
strstr($queryString,"+") OR
strstr($queryString,"!") OR
strstr($queryString,"@")) {
$loc = $_SERVER['PHP_SELF'];
$ip = $_SERVER['REMOTE_ADDR'];
$date = date ("d-m-Y @ h:i:s");
$lfh = "../log.txt";
$log = fopen ( $lfh,"a+" );
fputs ($log, "Attack Date: $date | Attacker IP: $ip | QueryString: $loc?=$queryString\n");
fclose($log);
echo "You are wasting your time..."; exit;
}

require '../functions.php';
db_init();
ban_system();

$user = $_SESSION['user_info']['username'];
$post_id = (int)$_GET['post'];

if(!isset($post_id) || !is_numeric($post_id) || $post_id < 1)
{
header('Location: index.php');
exit();
}
$q = "UPDATE `posts` SET `views` = views+1 WHERE `post_id`= $post_id LIMIT 1 ";
mysql_query($q) or die(mysql_error());
$result = mysql_query("SELECT post_id, title, category, content, author, date, views FROM `posts` WHERE post_id = '$post_id'") or die (mysql_error());
$post = mysql_fetch_assoc($result);
$sql = "SELECT * FROM posts_categories WHERE cat_id='$post[category]'";
$res = mysql_query($sql) or die (mysql_error());
$cat = mysql_fetch_assoc($res);

if(isset($_POST['addComment']))
{
$post_id = $_POST['post'];
$author = $_SESSION['user_info']['username'];
$date_added = date("d.M.Y");
$comment = $_POST['comment'];
$comment = str_replace(':)', '<img src="../img/smiles/smile.png" alt="pic" />', $comment);
$comment = str_replace('(O_o)', '<img src="../img/smiles/lol.png" alt="pic" />', $comment);
$comment = str_replace(';(', '<img src="../img/smiles/cry.png" alt="pic" />', $comment);
$comment = str_replace('(chuckle)', '<img src="../img/smiles/chuckle.png" alt="pic" />', $comment);
$comment = str_replace(':*', '<img src="../img/smiles/cunka.png" alt="pic" />', $comment);
$comment = str_replace('(mmm)', '<img src="../img/smiles/mmm.png" alt="pic" />', $comment);
$comment = str_replace('(ligi)', '<img src="../img/smiles/ligi.png" alt="pic" />', $comment);
$comment = str_replace('(inlove)', '<img src="../img/smiles/inlove.png" alt="pic" />', $comment);
$comment = str_replace(':D', '<img src="../img/smiles/xaxa.png" alt="pic" />', $comment);
$comment = str_replace('|-(', '<img src="../img/smiles/pff.png" alt="pic" />', $comment);
$comment = str_replace('(OMG!)', '<img src="../img/smiles/omg.png" alt="pic" />', $comment);
$comment = str_replace('(uuu..)', '<img src="../img/smiles/uuu.png" alt="pic" />', $comment);
$comment = addslashes(htmlspecialchars($comment));
if(strlen($comment) < 2)
{
$error_com = '<center><i>Не можете да пускате коментар по - малък от 2 символa!!</i></center>';
}
else
{
mysql_query("INSERT INTO posts_comments (post_id,comment,author,date_added) VALUES ('$post_id','$comment','$author','$date_added')") or die (mysql_error());
}
$q = mysql_query("SELECT user_id FROM users WHERE username = '$post[author]'") or die (mysql_error());
$a_id = mysql_fetch_assoc($q);
}
bg_header($post['title'].' •');
?>
<div class="news_box_top"><?php echo $post['title']; ?></div>
<div class="news_box_body"><?php echo htmlspecialchars_decode($post['content']); ?></div>
<div class="right">
<div class="desc_news">
<span>Сподели</span>
<div class="right"><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.tokiohotel-bg.info/bg/read_more.php?post=<?php echo $post['post_id']; ?>&layout=button_count&show_faces=false&width=125&action=like&font=verdana&colorscheme=dark&height=21" style="border: medium none; overflow: hidden; width: 125px; height: 21px; margin-left: 17px; vertical-align: center;" allowtransparency="true" scrolling="no" frameborder="0"></iframe></div>
<div class="right"><a href="http://twitter.com/share" style="width: 505px;" class="twitter-share-button" data-count="horizontal">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>
<div class="right"><g:plusone size="medium" href="http://www.tokiohotel-bg.info/bg/read_more.php?post=<?php echo $post['post_id']; ?>"></g:plusone></div>
<div style="clear: right;"></div>
<center>Тази новина е добавена на <i><?php echo $post['date']; ?></i><br />от <i><?php echo $post['author']; ?></i> в <i><a href="category.php?cat=<?php echo $cat['cat_id']; ?>"><?php echo $cat['name']; ?></a></i> и е прегледана <i><?php print $post['views']; ?></i> <sup>пъти</sup></center>
</div>

<?php
$id = $row['post_id'];
$other_title = $row['title'];
$i='';
$mysql = mysql_query("
SELECT * ,
MATCH (title)
AGAINST ('$other_title') AS score
FROM `posts`
WHERE post_id != '$id'
AND MATCH (title)
AGAINST ('$other_title' IN BOOLEAN MODE)
ORDER BY score DESC
LIMIT 0 , 10
") or die (mysql_error());
if (mysql_num_rows($mysql) > 0) {
while ($other = mysql_fetch_array($mysql)) {
$i++;
echo "$i: <a href="#">{$other['title']}</a><br />";
}
} else {
echo " Няма намерени подобни обяви ";
}
?>
</div>
<div class="left">
<?php if($_SESSION['is_logged']===true) { ?>
<center><div id="comment_field">
<form method="post" action="">
<a href="javascript: void(0);"><img src="../img/smiles/smile.png" alt="Smile" onclick="emo(':)')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/lol.png" alt="O_o" onclick="emo('(O_o)')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/cry.png" alt="Cry" onclick="emo(';(')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/chuckle.png" alt="Chuckle" onclick="emo('(chuckle)')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/cunka.png" alt="Kiss" onclick="emo(':*')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/mmm.png" alt="Mmm..." onclick="emo('(mmm)')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/ligi.png" alt="Лиги" onclick="emo('(ligi)')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/inlove.png" alt="Влюбен" onclick="emo('(inlove)')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/xaxa.png" alt="Laugth" onclick="emo(':D')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/pff.png" alt="Stupid" onclick="emo('|-(')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/omg.png" alt="OMG!!" onclick="emo('(OMG)')" /></a>
<a href="javascript: void(0);"><img src="../img/smiles/uuu.png" alt="УуУуУ :)" onclick="emo('(wow)')" /></a><br />
<textarea id="emo" class="textarea" name="comment" rows="4" cols="50"></textarea><br />
<input type="hidden" name="post" value="<?php echo $_GET['post']; ?>" />
<input type="submit" name="addComment" class="button_reg" value=" ДОБАВИ КОМЕНТАРА " />
</form>
</div></center>
<?php }
$q = mysql_query("SELECT comment, author, date_added FROM posts_comments WHERE post_id='$post_id' ORDER BY comment_id DESC");
while($comment = mysql_fetch_assoc($q))
{
$rs = mysql_query("SELECT user_id,rank,avatar FROM users WHERE username = '".$comment['author']."'") or die (mysql_error());
$com_info = mysql_fetch_assoc($rs);
?>
<div class="comm">
<div class="name_hour">
<div class="left"><b><a href="userID.php?id=<?php echo $com_info['user_id']; ?>"><?php
if($com_info['rank'] == 0){
echo $comment['author'];
}
if($com_info['rank'] == 1){
echo '<span style="color: #fd4239; text-shadow: #000 0px 0px 2px;">'.$comment['author'].'</span>';
}
if($com_info['rank'] == 2){
echo '<span style="color: #fff100; text-shadow: #000 0px 0px 2px;">'.$comment['author'].'</span>';
}
if($com_info['rank'] == 3){
echo '<span style="color: #8fd400; text-shadow: #000 0px 0px 2px;">'.$comment['author'].'</span>';
}
if($com_info['rank'] == 5){
echo '<span style="color: #FF9900; text-shadow: #000 0px 0px 2px;">'.$comment['author'].'</span>';
}
?></a></b> каза:</div>
<div class="right"><?php
if(strlen($comment['date_added'] > 1))
{
echo '<b>Добавен на:</b> '.$comment['date_added'];
}
?></div>
<div style="clear: both;"></div>
</div>
<div class="left"><a href="userID.php?id=<?php echo $com_info['user_id']; ?>"><?php
if(strlen($com_info['avatar']) == 0)
{
echo '<img src="http://tokiohotel-bg.info/img/default.png" style="margin: 6px 3px 3px 3px; border: 1px solid #000;" width="70px" height="70px" alt="avatar" />';
}
else
{
echo '<img src="'.$com_info['avatar'].'" style="margin: 6px 3px 3px 3px; border: 1px solid #000;" width="70px" height="70px" alt="user_avatar" />';
}
?></a></div>
<p style="padding: 3px;"><?php echo htmlspecialchars_decode($comment['comment']); ?></p>
<div style="clear: left;"></div>
</div>
<?php } ?>
</div>
<div style="clear: both;"></div>
<?php
bg_footer();
?>
 

Back
Горе