2010-08-30 5 views
0

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

Вот моя таблица MySQL.

CREATE TABLE categories ( 
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
parent_id INT UNSIGNED NOT NULL DEFAULT 0, 
category VARCHAR(255) NOT NULL, 
url VARCHAR(255) NOT NULL, 
PRIMARY KEY (id), 
INDEX parent (parent_id), 
UNIQUE KEY(parent_id, url) 
); 

CREATE TABLE users_posts (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
user_id INT UNSIGNED NOT NULL, 
title TEXT NOT NULL, 
summary TEXT DEFAULT NULL, 
post_content LONGTEXT NOT NULL, 
PRIMARY KEY (id) 
); 

Вот мой сценарий, простите беспорядок.

$posts_categories = array(); 
$ac_query = mysqli_query($mysqli, "SELECT category_id 
            FROM posts_categories 
            WHERE post_id = '" . $post_id . "'"); 

if (!$ac_query) { 
    print mysqli_error($mysqli); 
} else { 
    while($row = mysqli_fetch_array($ac_query)){ 
     $posts_categories[] = $row['category_id']; 
    } 
} 

$posts_categories_name = array(); 
$acn_query = mysqli_query($mysqli, "SELECT category 
            FROM categories 
            WHERE id IN(" . implode(',', $posts_categories) . ")"); 

if (!$acn_query) { 
    print mysqli_error($mysqli); 
} else { 
    while($row = mysqli_fetch_array($acn_query)){ 
     $posts_categories_name[] = $row['category']; 
    } 
} 

$x2 = ''; 
$c2 = ''; 
foreach($posts_categories_name as $acn) { 
    $x2++; 
    if($x2 == 1){ 
     $c2 .= " users_posts.title LIKE '%$acn%' OR users_posts.summary LIKE '%$acn%' OR users_posts.post_content LIKE '%$acn%'"; 
    } else { 
     $c2 .= " OR users_posts.title LIKE '%$acn%' OR users_posts.summary LIKE '%$acn%' OR users_posts.post_content LIKE '%$acn%'"; 
    } 
} 

$rac_query = mysqli_query($mysqli, "SELECT * 
            FROM users_posts 
            WHERE $c2 
            ORDER BY RAND() 
            LIMIT 5"); 
if (!$rac_query) { 
    print mysqli_error($mysqli); 
} else { 
    while($row = mysqli_fetch_array($rac_query)){ 
     echo '<li>' . $purifier->purify(strip_tags($row['title'])) .'</li>'; 
    } 
} 

ответ

0

Самый простой способ держать идентификатор текущей записи в переменную (мы будем называть его $ current_post_id), то просто:


if (!$rac_query) { 
    print mysqli_error($mysqli); 
} else { 
    while($row = mysqli_fetch_array($rac_query)){ 
     if($current_post_id == $row['id']){ 
      continue; 
     } 
     echo '<li>' . $purifier->purify(strip_tags($row['title'])) .'</li>'; 
    } 
}

Это последний бит кода, который вы в курсе, кстати. «Продолжить» означает переход к следующему прогону цикла while.

Конечно, вы также можете сделать это простым способом и сказать, что если $ current_post_id! = $ Row ['id'], то выделите строку. Это сделало бы то же самое.

+0

Есть ли способ проверить, был ли '$ current_post_id' единственным результатом в цикле? – slick

+0

Простым способом было бы установить переменную сразу после вывода тега li. Как только цикл будет выполнен, вы можете проверить, установлена ​​ли эта переменная. Если это не так, вы знаете, что других результатов не было. –

Смежные вопросы