Avatar billede maddog_em Nybegynder
09. juni 2011 - 15:28 Der er 21 kommentarer og
1 løsning

Ønsker at se seneste tidspunkt en bruger har logget på hjemmesiden

Hej

Jeg har en hjemmeside hvor brugerne skal logge på med password og bruger ID. Det logger jeg i en database, men jeg vil gerne have det vist på en admin side på webben.

De oplysninger jeg har i databasen er:

Id UserID larst_login

Id= fortløbende nummer
UserID = brugernavn
larst_login = dato og klokkeslet

bruger A kan have logget på 5 gange i løbet af en dag, men den er den seneste tidsstempling jeg vil se
samt bruger B kan have været logget på de sidste 3 dage, men her er det også den seneste tidsstempling  fra databasen jeg vil se

jeg har prøvet flere forskellige ting, men tror det må være GROUP BY UserID der skal bruges på en eller anden måde!

Er der mon en der kan se det???
Avatar billede softspot Forsker
09. juni 2011 - 15:38 #1
Noget i stil med dette (SQL Server og muligvis også Access):

SELECT UserId, MAX(larst_login)
FROM UserLogin
GROUP BY UserId
Avatar billede maddog_em Nybegynder
09. juni 2011 - 15:47 #2
Hej Softspot

tæt på - tror jeg

nu får jeg kun en linje pr navn <%= rs("UserID")%>
MEN jeg kan ikke skrive tiden <%= rs("larst_login") %>

Den viser ingenting ved larst_login
Avatar billede maddog_em Nybegynder
09. juni 2011 - 15:54 #3
det jeg gerne vil ende ud med er:

Bruger    sidte login
A        09-06-2011 11:44:01
B        05-04-2011 13:22:55
C        06-06-2011 22:10:33
osv
Avatar billede jokkejensen Novice
09. juni 2011 - 15:54 #4
du bemærkede hans tastefejl, i last_login i ovenstående ?
Avatar billede jokkejensen Novice
09. juni 2011 - 15:56 #5
nå fk, glem det ;), så ikke kolonnen også var stavet forkert :)
Avatar billede maddog_em Nybegynder
09. juni 2011 - 15:58 #6
Øhh - hvor henne, jeg kan kun se min egen i "Sidste login" :-)
Avatar billede softspot Forsker
09. juni 2011 - 17:49 #7
Jokke refererer til at "sidste" på engelsk staves "last" og ikke "larst", som du har gjort i databasekolonnen.

Prøv med denne SQL-sætning:

SELECT UserId, MAX(larst_login) AS larst_login
FROM UserLogin
GROUP BY UserId
Avatar billede tfswebguy Nybegynder
09. juni 2011 - 21:35 #8
softspot: Du gjorde det skam også?

SELECT UserId, MAX(larst_login) AS larst_login    <--- Tjek lige ;)
FROM UserLogin
GROUP BY UserId
Avatar billede softspot Forsker
09. juni 2011 - 22:23 #9
tfswebguy >> hvis det foreslag jeg giver skal kunne bruges direkte, er jeg jo nød til at replikere den samme fejl som spørgeren, så det var skam med fuldt overlæg! Ellers godt forsøg - Jantelovsrytter! :D
Avatar billede tfswebguy Nybegynder
09. juni 2011 - 22:27 #10
Tænkte også lige på om han havde skrevet det sådan i hans DB udtræk, og ja sørme så :)
Så officiel undskyldning herfra :D
Avatar billede softspot Forsker
09. juni 2011 - 22:33 #11
tfswebguy >> ;-)
Avatar billede maddog_em Nybegynder
10. juni 2011 - 07:31 #12
Hej

stavefejl eller ej - så dur:
SELECT UserId, MAX(larst_login) AS larst_login
FROM UserLogin
GROUP BY UserId

denne desværre heller ikke, kan det være noget med at larst_login :) skal være i både SELECT og i MAX delen?
Avatar billede maddog_em Nybegynder
10. juni 2011 - 07:38 #13
Kunne man tænke sig at:
SELECT TOP 1 kunne bruges?
Avatar billede softspot Forsker
10. juni 2011 - 08:38 #14
SELECT TOP 1 tager kun den første række i udtrækket og returnerer den, så det er nok ikke vejen frem.

Når jeg skriver "AS larst_login", så er det for at navngive den kolonne i resultatet som MAX genererer, dvs. give kolonnen et alias. Hvis man ikke gør det, får kolonnen ikke et navn og kan derfor ikke refereres via navn.

Den metode jeg har illustreret burde efter min bedste overbevisning fungere, så jeg må lige have lidt mere info om konteksten...

Er der indhold i larst_login for brugerne i den tabel du gemmer loginhistorikken?

Hvilken database (sql server, access, mysql, andet) er der helt konkret tale om?

Hvad hedder tabellen med loginhistorikken helt konkret?
Avatar billede maddog_em Nybegynder
10. juni 2011 - 09:11 #15
Hej Softspot

Allerførst mange tak fordi du hjælper her... :-)

Det er en access database og tabellen hedder UserLog
I tabellen er følgende kolonner:
Navn: Id - Type: Autonummerering
Navn: UserID - Type: Tekst
Navn: Last_login - Type: Dato og klokkeslæt(Standarddatoformat)
Navn: Number_login - Type: Tal

Der er pt. over 120 poster i tabellen og der er indhold i alle felterne.

Når jeg bruger "AS last_login" bliver siden ved med at loaded og der kommer ingen resultater frem, den står som en blank side, og man kan se at der loaded konstant.
Hvis jeg ikke bruger "AS last_login" kommer kun de forskellige brugernavne frem.

PS: Larst er rettet allesteder til Last - beklager fejlen
Avatar billede softspot Forsker
10. juni 2011 - 09:32 #16
Ingen årsag og ingen grund til at beklage en stavefejl - det er jo dit system, så du må kalde tinge hvad du måtte have lyst til :-)

Anyway! Jeg har lige testet om syntaksen fungerer i Access og det gør den, så der må være noget andet galt...

Kan du ikke lige prøve at vise den kode, hvor du rent faktisk udskriver data (dvs. efter du har udført kaldet til databsaen)?

Jeg har en mistanke om at du har glemt at kalde movenext på recordsettet, eller har lavet et eller andet der får koden til at gå i uendelig løkke (i modsætning til uendelig lykke, så er uendelig løkke typisk ikke optimalt!)...
Avatar billede maddog_em Nybegynder
10. juni 2011 - 11:06 #17
Hej


Hermed hele asp koden, som så inkluderes ind på en anden side.
eg har prøvet at gå direkte ind på siden, bare for at konstatere at det ikke er i "include" delen der sker fejl.

men jeg tror faktisk at det er noget med en uendelig løkke..

<%
set conn = server.createobject("ADODB.connection")
conn.Open "DBQ=" & server.mappath("/db/JHUser.mdb") & ";Driver={Microsoft Access Driver (*.mdb)}"

sql = "SELECT UserID, MAX(last_login) AS Last_login FROM UserLog GROUP BY UserID)"

'response.write("<p>" & SQL & "</p>" & vbcrlf)

set RS = conn.execute( SQL )
%>


<%
On Error Resume Next
rs.MoveFirst
do while Not rs.eof
%>


<table style="width: 300px">
    <tr>
        <td><%= rs("UserID")%><br></td>
        <td><%= rs("Last_login")%><br></td>
    </tr>
</table>



<%
rs.MoveNext
loop%>

<%
rs.Close
Set rs = Nothing

conn.Close

Set conn = Nothing
%>
Avatar billede softspot Forsker
10. juni 2011 - 11:48 #18
Du skal lige have fjernet den sidste parantes i din SQL-sætning (makeret med fed nedenfor):

sql = "SELECT UserID, MAX(last_login) AS Last_login FROM UserLog GROUP BY UserID)"

Prøv desuden at fjerne disse to linjer:

On Error Resume Next
rs.MoveFirst

Den fejl der (givetvis) opstår, skjuler du ved at slå fejlmeddelelser fra, så det er i det mindste en god idé at deaktivere dem mens du udvikler og tester...

MoveFirst på et forward only resultat giver ikke nogen mening og bør derfor undlades. Connection.Execute returnerer, i den form du har benyttet den, et forward only resultat.
Avatar billede maddog_em Nybegynder
10. juni 2011 - 12:30 #19
Hej Igen

nu kommer følgende fejl:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC Microsoft Access Driver] Circular reference caused by alias 'Last_login' in query definition's SELECT list.
/administration-site/users-last.asp, line 10

------

dette er linjen der fejler:
set RS = conn.execute( SQL )
Avatar billede softspot Forsker
10. juni 2011 - 12:41 #20
OK, men så prøv at ændre det alias jeg tildelte MAX til f.eks.:

sql = "SELECT UserID, MAX(last_login) AS Max_Last_login FROM UserLog GROUP BY UserID"

Så skal du naturligvis aflæse Max_Last_Login i din løkke:

do while Not rs.eof
%>
    <table style="width: 300px">
        <tr>
            <td><%= rs("UserID")%><br></td>
            <td><%= rs("Max_Last_login")%><br></td>
        </tr>
    </table>
<%
  rs.MoveNext
loop%>
Avatar billede maddog_em Nybegynder
10. juni 2011 - 12:47 #21
Yes sir.... Det virker

1000 tak for hjælpen - vil du smide et svar, du har fuld ud fortjent point
Avatar billede softspot Forsker
10. juni 2011 - 12:57 #22
Velbekomme :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester