Trenger litt tanker om hvordan og kode denne?

En tråd i 'PHP, SQL og databaser' startet av Mr Vest, 12 Sep 2009.

  1. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Jeg sitter her og skal kode sammen en liten vennefunksjon som lar innloggede medlemmer bli venner med hverandre. Dette skal foregå ved at medlem1 sender en venneforespørsel til medlem2, og medlem2 skal da godta denne, evt avslå den. Nå er jeg litt usikker og lurer på om noen kanskje kan tenke litt høyt for meg på hvordan dette burde være.

    I databasen har jeg "friendone" , "friendtwo" og "activefriends". Jeg ser for meg at når medlem1 sender venneforespørsel til medlem2 så kan jeg kjøre opp disse to medlemmen til databasen i "friendone" og "friendtwo" og samtidig sette "activefriends" til 0 helt frem til medlemskapet blir godkjent fra medlemmet som har mottatt venneforespørselen.

    Men jeg er litt usikker her.

    Når jeg skal lage en oversikt for den innloggede brukeren med ventende venneforespørsler forstår jeg ikke helt hva og gjøre. Slik som det er nå bruker jeg:

    mysql_query("select * from friends where friendone='$username' OR friendtwo='$username' AND activefriends=0",$c);

    Den henter jo ut en oversikt over alle venneforespørsler som inkluderer brukeren som er innlogget, men den henter jo da også ut venneforespørslene som medlemmet selv har sendt til andre medlemmer..

    Noen tips om en alternativ løsning jeg kan bruke her?

    Jeg tenkte det var greit og tenke litt høyt her. Pleier og hjelpe litt på ideene i topplokket. :)
     
  2. Keanu

    Keanu Geek

    Innlegg:
    498
    Jeg antar du alt har en tabell med medlemmer, og da vil jeg tro det letteste er å lage en relasjonstabell mellom medlem-medlem. Etter hva jeg kan de ser det slik du har tenkt.

    Enkel løsning på problemet ditt tror jeg kan være:
    Da får man kun requests man ikke selv har satt i gang.

    En annen kan være å ikke ha noe activefriends-felt, men istedet kalle den første tabellen friendrequests, for så å flytte over informasjonen i ny tabell "friends" når de er godtatt. Dette gjør at du kun får to nye tabeller, begge en enkel relasjon mellom "medlem_id" og "medlem_id".
     
    Mr Vest liker dette.
  3. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Mhm, stemmer ja. Jeg har en tabell med medlemmene i som er "relatert" til tabellen hvor jeg har venner.

    Det som er saken er at dersom jeg bruker koden du foreslår:

    mysql_query("select * from friends where friendtwo='$username' AND activefriends=0",$c);

    Da vil jo absolutt alle venneforespørslene som er sendt fra alle medlemmene komme frem. Dvs, at medlem1 vil jo ikke bare få venneforespørslene som er sendt til ham i listen, men også venneforespørslene som medflem5 har sendt til medlem4... Eller er det noe jeg har oversett her? Nja, mens jeg skriver her så merker jeg jo at "friendtwo" er satt til mottaker av venneforespørsel så da var det jo ikke så vanskelig allikevel. Egentlig tror jeg at jeg startet denne tråden fordi det er litt mye oppå hverandre her og da hjelper det og skrive litt slik som dette.

    Nja, men med et felt i friends-tabellen som heter activefriends vil det jo bare være 1 ekstra tabell i databasen som da heter Friends.. Dersom en venneforespørsel blir avslått sletter jeg jo venneforespørselen WHERE friendone='blabla' AND friendtwo='blabla' slik at alle som er blitt venner på en måte har den tabellen for seg selv. Er ikke det en bedre løsning enn og opprette en tabell for forespørsler og en for godkjente forespørsler?
     
  4. skogtrollet

    skogtrollet Medlem

    Innlegg:
    208
    Ja slikt er vanskelig å tenke seg fram til syns jeg. Hadde en medlems tabell, der hvor de skulle få lov til å opprette egne album og laste opp filer der. Jeg begynte å lage en egen column med albumid, men det ble bare tull. Man må jo ha en måte å lage unike ID verdier på. Så etter 1 time tenkte jeg, faen, hvorfor ikke bare lage en ny tabell.
     
  5. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Hehe, ja, det er ikke alt som er like enkelt. Har laget meg litt forkjellige "note-to-self" mens jeg holder på her, slik at jeg pluselig ikke lager til akkurat det samme under forkjellige navn. Får øve litt på dette med flere baller i lufta samtidig.

    Jeg begynner og nærme meg noe bra her nå, og sitter kun igjen med ett siste spørsmål som jeg virkelig ikke finner ut av selv med mine kunnskaper. Kanskje noen her vet hvordan jeg kan løse dette.

    La meg forklare:

    Når medlem1 sender en forespørsel til medlem2 vil medlem 2 motta en venneforespørsel. Venneforespørselen bli sendt ved at jeg kjører opp slik som dette i databasen:

    mysql_query("insert into friends values('','$MOTTAKER','$SENDER','0','$date')",$c);

    Her fyller vi da altså inn ID, friendone, friendtwo, activefriends og date. Når disse to nå blir venner så endrer jeg det 0-tallet i activefriends fra 0 til 1.

    MEN!
    Hva gjør jeg nå dersom medlem1 og medlem2 ikke lenger vil være venner, og en av partene igjen vil avslutte vennskapet?

    mysql_query("delete from friends where friendone='username' AND friendtwo='username'",$c);

    Det er jo denne jeg må bruke, men friendone & friendtwo vil jo være forkjellig avhengig av hvem som sendte venneforespørselen i utgangspunktet? Noen tanker om hva jeg kan bruke for og få dette her helt korrekt? Tenker dette vil være den siste biten før jeg egentlig kan si meg ferdig her...

    Funker det med noe slikt som?:


    mysql_query("delete from friends where friendone='username' OR 'username1' AND friendtwo='username' OR 'username1'",$c);

    Noen tanker om hva jeg burde gjøre? Takk. :)
     
  6. Pong

    Pong Jeg selger sʇɥƃıluʍop :)

    Innlegg:
    3.459
    Bare en liten tips med delete-queries: legg til en LIMIT 1
    Hvis et eller annet blir feil så er det i verste fall 1 post som forsvinner.
    En tips med AND og ORs: bruk () - da vet alle som leser hva som skjer.

    DELETE FROM friends WHERE (friendone='$username' AND friendtwo='$buddy') OR (friendone='$buddy' AND friendtwo='$username') LIMIT 2
    tror jeg.
     
    Mr Vest liker dette.
  7. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Takk for løsning og godt tips Pong! :)
     
  8. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Urk, det var da som bare. Den koden funker faktisk ikke. Jeg har forsøkt 3 forkjellige nå... Noen som vet eksakt hvordan den skal være?

    DELETE FROM friends WHERE (friendone='$username' AND friendtwo='$buddy' OR friendone='$buddy' AND friendtwo='$username') LIMIT 2

    DELETE FROM friends WHERE (friendone='$username' AND friendtwo='$buddy') OR (friendone='$buddy' AND friendtwo='$username') LIMIT 2

    DELETE FROM friends WHERE (friendone='$username' AND friendtwo='$buddy' OR friendone='$buddy' AND friendtwo='$username')

    Jeg forstår ikke helt hva det går i, men det skjer altså null og niks i databasen. Nei, æsj, dette her får jeg se på etter noen timer med søvn tenker jeg. :)
     
  9. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Når jeg heller åpnet øynene samtidig som jeg testet her da fungerte den nederste av disse 3 over.:

    mysql_query("DELETE FROM friends WHERE friendone='$buddy' AND friendtwo='$username' OR friendone='$username' AND friendtwo='$buddy'",$c);

    Men hvoran bruker jeg LIMIT på denne? Gjør jeg bare slik:?

    mysql_query("DELETE FROM friends WHERE friendone='$buddy' AND friendtwo='$username' OR friendone='$username' AND friendtwo='$buddy'",$c)LIMIT 2;
     
  10. Pong

    Pong Jeg selger sʇɥƃıluʍop :)

    Innlegg:
    3.459
    limit er en del av sql-setningen, så den må sendes til sql-serveren, så:

    mysql_query("DELETE FROM friends WHERE friendone='$buddy' AND friendtwo='$username' OR friendone='$username' AND friendtwo='$buddy' LIMIT 2",$c)
     
  11. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Takk Pong. Funker LIMIT ved at kun en rad fra tabellen kan slettes eller funker den ved at kun en verdi fra en rad kan slettes?
     
  12. Pong

    Pong Jeg selger sʇɥƃıluʍop :)

    Innlegg:
    3.459
    Du kan ikke slette verdier (columns) med DELETE, kun rader (rows).

    LIMIT begrenser det som skjer - i tilfelle en DELETE så er det greit å ha med for å begrense evt. problemer hvis kommandoen blir feil for en eller annen grunn. LIMIT 1 er da det du bruker oftest, men i ditt tilfelle hvor venne-lenken faktisk kan bli satt opp 2 veier, så blir det da LIMIT 2

    LIMIT kan også brukes sammen med SELECT - for å ikke få tilbake alle milliarder av poster som ligger i en log-tabell f.eks.
     
  13. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Oia, det er slik den funker ja. Det var svar på det jeg lurte på hvertfall, selv om jeg formulerte spørsmålet mitt feil. :)

    Mhm, LIMIT har jeg brukt på SELECT litt faktisk, så det var jo moro og få med seg at den også kunne brukes på DELETE. Fy flate så moro dette her var og knote med. :D
     
  14. Mr Vest

    Mr Vest Sjefen over alle sjefer!

    Innlegg:
    2.079
    Jeg opplever noe underlig med SELECT her nå. Jeg bruker da altså:

    $getnewmessages=mysql_query("select * from messages where recipient='innloggetbruker' AND read=0",$c);
    if (mysql_num_rows($getnewmessages)!==0)
    {
    print"
    HEEEYYY..! Dritkult. Du har nye meldinger!
    ";
    }
    else
    {
    print"
    Tss, det er jo liksom ingen som gidder og sende deg meldinger vet du.
    ";
    }



    Det snodige er at "HEEEYYY..! Dritkult. Du har nye meldinger!" blir faktisk printet ut, men rett før kommer altså: "mysql_num_rows(): supplied argument is not a valid MySQL result resource in XXX"

    Den printer altså ut riktig. Er det nye meldinger skriver den ut riktig, og også dersom det ikke er nye meldinger. Hva kan være galt tror dere?

    EDIT: Ser nå at den printer det samme melding uavhengig om det er noen nye meldinger eller ikke... Den printer ut den første av de to der oppe.
     
    Sist redigert: 14 Sep 2009
  15. Pong

    Pong Jeg selger sʇɥƃıluʍop :)

    Innlegg:
    3.459
    I og med at $getnewmessages ikke er en skikkelig handle som mysql_num_rows kan gjøre noe med (nemlig, telle antall poster), så tenker jeg at mysql_num_rows returnerer en null (= vet ikke hva jeg skal svare). Og null !== 0, så...
     

Del denne siden