2010-08-30 8 views
0

Mon script est supposé trouver tous les articles liés aux catégories actuelles de messages qui peuvent être une ou plusieurs catégories, mais je veux empêcher le script d'afficher le post actuel comme un article connexe. Comment puis-je faire ceci? Et où puis-je l'ajouter à mon script?Problème d'affichage de PHP et MySQL

Voici ma table 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) 
); 

Voici mon script pardonner le désordre.

$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>'; 
    } 
} 

Répondre

0

La meilleure façon est de tenir l'identifiant de poste actuel dans une variable (nous l'appellerons $ current_post_id) puis juste:


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>'; 
    } 
}

C'est le dernier morceau de code affiché, BTW. Le "continuer" signifie passer à l'étape suivante de la boucle while.

Bien sûr, vous pouvez aussi le faire en toute simplicité et dire si $ current_post_id! = $ Row ['id'] puis renvoyer la ligne. Ça ferait la même chose.

+0

Existe-t-il un moyen de vérifier si le $ $ current_post_id était le seul résultat de la boucle? – slick

+0

Un moyen simple serait de définir une variable juste après la sortie de la balise li. Une fois la boucle terminée, vous pouvez vérifier si cette variable est définie. Si ce n'est pas le cas, vous savez qu'il n'y a pas eu d'autres résultats. –