PDO Newsausgabe fehlerhaft

07/31/2016 12:18 .Barone#1
Hallo, epvpler.
(Mir ist bei dem Titel nichts besseres eingefallen..)
Ich schreibe gerade ein News-System.
Auf der index.php wird eine "vorschau" der News dargestellt, jedoch mit einem Button der die User auf die news.php weiterleitet, wo man die kompletten News sieht. Die News werden in der Mitte ausgegeben, links und rechts will ich jedoch News anzeigen lassen, die halt vorher oder nachher, mit einem ähnlichem Thema gepostet wurden.



Die News haben bis zu 3 Tags, die mit Komma getrennt in der Datenbank stehen.
bsp:
Neu,News,Änderung

Folgendes ist der Code um die News auf der rechten Seite auszugeben:
Code:
$tag1 = $tag[0];
$tag2 = $tag[1];
$tag3 = $tag[2];
$stmt = $cn->prepare("SELECT DISTINCT id,verfasser,time,text,kategorie,bild,titel,tags FROM `news` WHERE tags REGEXP  :tag1 || :tag2 || :tag3");
$stmt->bindParam(':tag1',$tag1,PDO::PARAM_STR);
$stmt->bindParam(':tag2',$tag2,PDO::PARAM_STR);
$stmt->bindParam(':tag3',$tag3,PDO::PARAM_STR);

$stmt->execute();
while ($like = $stmt->fetch(PDO::FETCH_ASSOC)){
print_r($like);
}
Das Problem ist, er zeigt jedoch auch die News an, die der User gerade am lesen ist. (Wie man im Bild sieht).
07/31/2016 15:05 False#2
Kurz vorab: Daten Komma Separiert in einer Datenbank Speichern ist nicht schön (normalformen).

Dann übergebe doch einfach die Id von der Index mit und prüf das diese nicht ausgewählt wird.
07/31/2016 16:15 .Barone#3
Hallo, False.
Danke für deine Rückmeldung. Ich habe es nur kurz getestet mit den kommas, normalerweiße nutze ich _ zum trennen.
Anscheinend ist das falsch:
Code:
$stmt = $cn->prepare("SELECT DISTINCT id,verfasser,time,text,kategorie,bild,titel,tags FROM `news` WHERE tags REGEXP  :tag1 || :tag2 || :tag3 AND id != :id");
Es muss so aussehen:
Code:
$stmt = $cn->prepare("SELECT DISTINCT id,verfasser,time,text,kategorie,bild,titel,tags FROM `news` WHERE id != :id  AND tags REGEXP  :tag1 || :tag2 || :tag3");
07/31/2016 20:40 False#4
Quote:
Originally Posted by .Barone View Post
Hallo, False.
Danke für deine Rückmeldung. Ich habe es nur kurz getestet mit den kommas, normalerweiße nutze ich _ zum trennen.
Anscheinend ist das falsch:
Code:
$stmt = $cn->prepare("SELECT DISTINCT id,verfasser,time,text,kategorie,bild,titel,tags FROM `news` WHERE tags REGEXP  :tag1 || :tag2 || :tag3 AND id != :id");
Es muss so aussehen:
Code:
$stmt = $cn->prepare("SELECT DISTINCT id,verfasser,time,text,kategorie,bild,titel,tags FROM `news` WHERE id != :id  AND tags REGEXP  :tag1 || :tag2 || :tag3");
Auch mit Unterstrichen sollte man keine Daten separieren.
Nutz eine Neue Tabelle dafür (Normalformen).

Id |NewsId | Tag