WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Låta användaren spara favoriter (https://www.wn.se/forum/showthread.php?t=22713)

Anders Larsson 2007-08-08 13:39

Hej

Jag sitter och kodar en sida där medlemmar ska kunna spara favoriter bland inlägg. Än så länge har jag en databastabell (mysql) som ser ut ungefär såhär:

Kod:

id          inlägg
I den enklaste av världar tänkte jag skapa en tabell som innehåller inläggets id och användarens id.

Kod:

id          användarId

Inga problem att lista inlägg som en specifik användare har gjort som favorit. Mitt problem kommer när jag vill lista alla inlägg och visa för användaren vilka inlägg h*n har sparat som favorit. Det närmaste jag kommer är att köra en LEFT OUTER JOIN, men då kan jag inte ta hänsyn till vilken användare det är som sparat inlägget som favorit.

Antingen hjälp med att lösa det såhär, eller hjälp att hitta en ny infallsvinkel.

Miljö Mysql/PHP båda i version 5.

fors 2007-08-08 15:04

Jag förstår inte riktigt vad du vill göra.

Du kanske menar inlägg som jag har skrivit som någon annan användare har gjort som favorit?

Anders Larsson 2007-08-08 15:08

Citat:

Originally posted by fors@Aug 8 2007, 15:04
Jag förstår inte riktigt vad du vill göra.
Du kanske menar inlägg som jag har skrivit som någon annan användare har gjort som favorit?

Inläggen visas för alla användare. Det jag vill göra är att i listan där inläggen visas visa vilka inlägg (om några) som den aktiva användaren har valt som favorit.

Listningen ska alltså se ut ungefär såhär:


2007-04-05 rubrik
här står det lite text

2007-04-08 rubrik - du har valt denna som favorit
här står det lite text

2007-04-08 rubrik
här står det lite text

2007-04-11 rubrik - du har valt denna som favorit
här står det lite text

2007-04-15 rubrik
här står det lite text

SumoSilent 2007-08-08 15:14

Kanske itne den bästa lösningen men du hämtar ut allt ur databasen och sedan i while loopen så gör du en enkel if sats

If(användarId == session["användarId"])
echo 'Den här har du redan i favoriter';
else
echo 'Lägg till i favoriter';

fors 2007-08-08 15:51

Citat:

Ursprungligen postat av Anders Larsson
Citat:

Ursprungligen postat av fors
Jag förstår inte riktigt vad du vill göra.
Du kanske menar inlägg som jag har skrivit som någon annan användare har gjort som favorit?

Inläggen visas för alla användare. Det jag vill göra är att i listan där inläggen visas visa vilka inlägg (om några) som den aktiva användaren har valt som favorit.
Listningen ska alltså se ut ungefär såhär:

2007-04-05 rubrik
här står det lite text
2007-04-08 rubrik - du har valt denna som favorit
här står det lite text
2007-04-08 rubrik
här står det lite text
2007-04-11 rubrik - du har valt denna som favorit
här står det lite text
2007-04-15 rubrik
här står det lite text


Något liknande enligt nedan borde fungera.
Kod:

SELECT p.id, p.post, f.post AS favorite_post
FROM posts AS p
LEFT JOIN favorites AS f ON p.id = f.post
WHERE f.user = $user
ORDER BY p.id ASC

Sedan vid utskrift
Kod:

if(isset($result['favorite_post'])) {
  echo 'redan tillagd';
} else {
  echo 'lägg till';
}


Magnus_A 2007-08-08 16:38

Om inläggen representeras av till exempel ett inläggsnummer är det enklast att ha ett textfält i användardatabasen och där lägga in inläggsnumren kommaseparerade. Den kommaseparerade strängen är lätt att göra om till en matris. Har man oförutsägbara kombinationer av data så är det alltid den enklaste vägen.

fors 2007-08-08 16:55

Citat:

Originally posted by elprisguiden@Aug 8 2007, 15:38
Om inläggen representeras av till exempel ett inläggsnummer är det enklast att ha ett textfält i användardatabasen och där lägga in inläggsnumren kommaseparerade. Den kommaseparerade strängen är lätt att göra om till en matris. Har man oförutsägbara kombinationer av data så är det alltid den enklaste vägen.

Jag vet inte om jag tycker det är så mycket lättare att göra på det viset. Dessutom blir det linjärsökning när man söker igenom om användaren har det aktuella inlägget som sin favorit. Det blir mycket om det rör sig om flera tusen användare som har samma inlägg som favorit. En annan sak är om man skall lista en användares favoritinlägg. Då måste man löpa igenom alla rader och all data, vilket är otroligt tidskrävande. Framförallt om man kommer upp i en stor volym av data.

digiArt 2007-08-08 17:02

Citat:

Originally posted by elprisguiden@Aug 8 2007, 16:38
Om inläggen representeras av till exempel ett inläggsnummer är det enklast att ha ett textfält i användardatabasen och där lägga in inläggsnumren kommaseparerade. Den kommaseparerade strängen är lätt att göra om till en matris. Har man oförutsägbara kombinationer av data så är det alltid den enklaste vägen.
Nej, nej, nej, nej. Helt och totalt galet fel databastänk. Bättre att satsa på joins som fungerar.

Hur hade du tänkt att lösa det på ett smidigt sätt om någon vill ta bort en favorit?

Vad är enklast:

1. DELETE FROM tabell WHERE id = xx
2. Hämta kolumninnehåll, splitta, loopa och ta bort, spara tillbaka

Anders Larsson 2007-08-08 17:54

Citat:

Originally posted by fors@Aug 8 2007, 15:51
Kod:

SELECT p.id, p.post, f.post AS favorite_post
FROM posts AS p
LEFT JOIN favorites AS f ON p.id = f.post
WHERE f.user = $user
ORDER BY p.id ASC


Ja, det var så jag tänkte också. Problemet med den frågan är att jag bara kommer att få de inlägg som användaren har valt att ha som favorit:

Kod:

2007-04-08 rubrik - du har valt denna som favorit
här står det lite text

2007-04-08 rubrik
här står det lite text

2007-04-11 rubrik - du har valt denna som favorit
här står det lite text

Skippar jag WHERE f.user = $user så fungerar det som jag vill, bortsett från att hänsyn inte tas till vilken användare det är som har gjort inlägget som favorit. Hmm.

fors 2007-08-08 18:50

Citat:

Originally posted by Anders Larsson@Aug 8 2007, 16:54
Ja, det var så jag tänkte också. Problemet med den frågan är att jag bara kommer att få de inlägg som användaren har valt att ha som favorit:
Skippar jag WHERE f.user = user så fungerar det som jag vill, bortsett från att hänsyn inte tas till vilken användare det är som har gjort inlägget som favorit. Hmm.

Testa då
Kod:

SELECT p.id, p.post, f.post AS favorite_post
FROM posts AS p
LEFT JOIN favorites AS f ON p.id = f.post AND f.user = $user
ORDER BY p.id ASC



Alla tider är GMT +2. Klockan är nu 12:26.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson