Vinnaren i pepparkakshustävlingen!
2008-11-11, 23:10
  #1
Medlem
Hej, har nu börjat ta mig tiden att försöka skapa kategorier för varje medlem på min "blogg-skapar-sida", dom ska alltså kunna skapa kategorier, och när dom lägger upp ett post(nytt inlägg) så ska en kategori vara vald. Meningen är att man ska kunna klicka på kategorien sen så ska allting sorteras, ja ni förstår nog.

Fick tips om att det var JOIN som skulle användas, men jag vet inte riktigt hur jag ska göra det på rätt sätt.

Om man börjar med att skapa typ 3st kategorier, kategori1,2,3. Användar_id=1 (personen som skapat de 3 kategorierna)
tabell: _cat
id | user_id | name(vad kategorin är döpt till)
1 1 kategori1
2 1 kategori2
3 1 kategori3

sen tabellen för inläggen.
_post
id | user_id | text
1 1 tralala
2 1 tralala2
3 1 tralala3

Sedan en tabell till, _postcat. Det är väll här man ska joina ihop allting?
Men då måste man väll göra en insert i denhär tabellen också, eller nått..

_postcat
post_id | post_cat (båda är nyckeltal)
1 1

Sen har jag inte kommit så mycket längre, Det är här jag behöver hjälpen att förstå hur det fungerar. När jag skapar en kategori så insertar jag alltså användarens ID, samt vad kategorin ska heta.

eller?


EDIT

Nu har jag gjort ett skript som för in rätt värden (hoppas jag) i alla 3 tabellerna.

När man postar ett post till tabellen _post =
Kod:
if(isset($_POST['submitpost']))
   {
   $sql = "INSERT INTO _post (user_id, cat_id, text) VALUES('1','".$_POST['kategorier']."','".$_POST['postmeddelande']."')";
   mysql_query($sql) or die(mysql_error());   
   
   $query = mysql_query("SELECT * FROM _post WHERE user_id='1'");
   
      $rad = mysql_fetch_assoc($query);
   
   $cat_id = $rad['cat_id'];
   $post_id = $rad['id'];
   
   mysql_query("INSERT INTO _postcat (post_id, cat_id) VALUES('$post_id','$cat_id')");
   
   }

Nu vet jag inte riktigt hur jag ska få fram rätt inlägg när man 'går in på kategorin'.

Det är väll här jag tror jag ska använda Join. Förhoppningsvis.

Men jag får fram lite för mycke träffar..

"SELECT * FROM _post, _cat WHERE _post.user_id = _cat.user_id AND _post.user_id = '1'"

Tips på hur jag ska göra? Samt vad kan jag ha tabellen _postcat till?

MVH
Citera
2008-11-12, 11:25
  #2
Medlem
Tapas-Valspecks avatar
_postcat behæver du inte om du inte vill ha möjligheten att lägga samma inlägg i flera olika kategorier.

Enklast är att du lägger till cat_id på din _post-tabell precis som du redan gjort.

När du sedan väljer ut inläggen behöver du ju bara veta vilket cat_id som ska filtrera. Det borde du ju kunna plocka från en QueryString eller liknande?

Kod:
SELECT * FROM _post WHERE _post.user_id = $userid AND _post.cat_id = $cat_id

Jag är inte så haj på php men sql:en i detta stycke ser lite galen ut
Kod:
if(isset($_POST['submitpost']))
   {
   $sql = "INSERT INTO _post (user_id, cat_id, text) VALUES('1','".$_POST['kategorier']."','".$_POST['postmeddelande']."')";
   mysql_query($sql) or die(mysql_error());   
   
   $query = mysql_query("SELECT * FROM _post WHERE user_id='1'");
   
      $rad = mysql_fetch_assoc($query);
   
   $cat_id = $rad['cat_id'];
   $post_id = $rad['id'];
   
   mysql_query("INSERT INTO _postcat (post_id, cat_id) VALUES('$post_id','$cat_id')");
   
   }

Du sätter in siffror som om de vore strängar. Det är lite onödigt då databasen får dubbelkonvertera varje gång.


Sen "SELECT * FROM _post WHERE user_id='1'" väljer ju ut ALLA poster som användaren gjort. Sen tar du första raden du får tillbaka och sätter in värdet från kategori och användare i _postcat. Problemet med detta är att om du inte har någon sorterare på Queryn ovan borde du få den rad som fysiskt ligger först i databasen varje gång, och inte den precis insatta. Alltså sätter du rimligen in exakt samma värden i _postcat varje gång som någon gör en ny post. Du bör använda
Kod:
SELECT TOP 1 * FROM _post WHERE user_id = $userid ORDER BY post_id DESC


Som sagt. Ska du inte ha samma inlägg i flera olika kategorier så skippa _postcat helt. JOIN behöver du inte göra om du inte vill välja ut kategorinamnet i samma query som en post.

Vill du ändå använda _postcat så borde queryn se ut så här. (JOIN-syntax går att skriva på flera olika sett)
Kod:
SELECT * FROM _post
JOIN _postcat ON _postcat.post_id = _post.post_id 
WHERE _post.user_id = $userid AND _postcat.cat_id = $cat_id

Ber om ursäkt för eventuellt svammel och obegripligheter
Citera
2008-11-12, 23:27
  #3
Moderator
Protons avatar
För övrigt avråder jag dig kraftigt från att skicka in godtycklig data du inte har en aning om vad den kommer ifrån direkt in i din databas. Fullständigt förkastligt och totalt livsfarligt för din stackars databas.

Använd åtminstånde mysql_real_escape_string() på den data du tänkt att stoppa i din databas så blir det genast betydligt svårare att injicera SQL till din databas.
Citera
2008-11-13, 13:31
  #4
Medlem
Tack för svaren, löste det genom att ta bort _postcat såklart, sen gjorde jag lite likheter i sql frågan när jag kallade på tabellen, iom att jag satte in namnet på kategorin i post, så kunde jag lätt få fram rätt resultat =)

Ang. säkerheten så ska jag tillämpa säkerhet på hela sidan när jag börjar närma mig ett färdigt resultat.

MVH
Citera
2008-11-14, 12:58
  #5
Medlem
Tapas-Valspecks avatar
Citat:
Ursprungligen postat av steklof
sen gjorde jag lite likheter i sql frågan när jag kallade på tabellen, iom att jag satte in namnet på kategorin i post, så kunde jag lätt få fram rätt resultat =)

Jo, det är klart det funkar. Men det är riktig fulkod. Redundans, dvs dubbellagring av data, ska undvikas i det längsta. Är du intresserad kan du läsa på lite om normaliseringsgrader.
Du kan se problemen bäst om du börjar fundera på att byta namn på kategorier mm.

EDIT: Här har är en länk som förklarar det hela bra. http://www.databasteknik.se/webbkursen/normalisering/
__________________
Senast redigerad av Tapas-Valspeck 2008-11-14 kl. 13:01.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback