webForumDet fria alternativet

Läsa tomma fält

Databaser & SQLur Databashanterare & SQL

14 svar · 299 visningar · startad av Fireh

FirehMedlem sedan jan. 2003173 inlägg
#1

Om jag försöker läsa data ur ett fält som råkar vara tomt, så skiter sig allt. Ska det vara så?

Om jag t.ex. kör följande:

Text = rs("Text")

Så får jag följande:

Microsoft OLE DB Provider for ODBC Drivers (0x80040E21)
En OLE DB-åtgärd i flera steg genererade fel. Kontrollera alla OLE DB-statusvärden som finns tillgängliga. Inget arbete utfördes.

Om jag istället kör följande:

If rs("Text") = "First" Then

Så får jag följande:

(0x80020009)
Undantag inträffade.

Detta händer bara om Text-fältet är helt tomt. Står det något i det, så fungerar det bra.

@ndersMedlem sedan juni 200032 969 inlägg
#2

Det brukar fungera lite knasigt när det är null (inte riktigt tomt alltså ;) ). Prova om detta fungerar:

Text = "" & rs("Text")

Mvh

FirehMedlem sedan jan. 2003173 inlägg
#3

Det framgick inte av första, men när jag inte fick det att funka med bara If-satsen, så testade jag att först plocka in värdet i en variabel för att sedan köra If-satsen.

När jag bara körde If-satsen, så blev det undantagsfelet. När jag först läste in i variabel, så fick jag det andra felet.

Nu verkar det gå att läsa in i variabeln när jag testar med det du skrev, däremot kommer samma fel när den kör "If Text = "First" Then" som tidigare, dvs undantag....

@ndersMedlem sedan juni 200032 969 inlägg
#4

Menar du alltså att följande ger ett felmeddelande på raden med if-satsen :q

Text = "" & rs("Text")
If Text = "First" Then

Ytterst märkligt.

Mvh

FirehMedlem sedan jan. 2003173 inlägg
#5
If rs("Text") = "First" Then

Resulterade i "Undantag inträffade"

Text = rs("Text")
If Text = "First" Then

Resulterade i "En OLE DB-åtgärd i flera steg genererade fel..."

Text = "" & rs("Text")
If Text = "First" Then

Resulterade i "Undantag inträffade". Dvs samma som när jag bara körde med IF-sats. Därför gissade jag att det If-satsen som genererade felet.

@ndersMedlem sedan juni 200032 969 inlägg
#6

Har du lust att visa lite mer kod?

FirehMedlem sedan jan. 2003173 inlägg
#7
Admin_text = "" & rs("Admin_text")
If Admin_text = "First" Then
  Response.Redirect("crew/first.asp")
Else
  Response.Redirect("crew/")
End if

Den säger dessutom kontroll.asp, line 28, som är raden med If-satsen.

Fältets info i tabellen:
-------------------------------
Namn: Admin_text
Typ: Text
Längd/Värden:
Attribut:
Null: Not null (har testat med null också)
Standard:
Extra:

FirehMedlem sedan jan. 2003173 inlägg
#8
@ndersMedlem sedan juni 200032 969 inlägg
#9

Sa du not null?
Senast jag kollade betyder det att fältet i tabellen inte tillåter null, och då borde inte problemet vara nullrelaterat...

Kan du visa koden innan rad 28 också?

FirehMedlem sedan jan. 2003173 inlägg
#10

Jag har som sagt testat med Null = Null också, men det gav ingen skillnad.

Set db = Server.CreateObject("ADODB.Connection")
db.Open "DSN=mysql_crew"

User = Request.Form("User")
Pass = Request.Form("Pass")
IP = Request.ServerVariables("REMOTE_ADDR")

SET rs=db.Execute("SELECT * FROM Users WHERE Nick LIKE '" & User & "'")

If not rs.eof and rs("Pass") = Pass Then
    Uppdate= "UPDATE Users SET 'zzzzzz' WHERE ID=" & ID
    db.Execute Uppdate

    Add = "INSERT INTO Login (User, UserID, IP, Datum, Tid, Lyckat) VALUES ('"&User&"',"&ID&",'"&IP&"','"&Date&"','"&Time&"','Ja')"
    db.Execute Add

    Admin_text = "" & rs("Admin_text")
    If Admin_text = "First" Then
      Response.Redirect("crew/first.asp")
    Else
      Response.Redirect("crew/")
    End if
End if

Har tagit bort några saker, som Session samt vilken data som uppdateras. Uppdateringen i Users samt tillägget i Login fungerar dock.Och om jag plockar bort hela If-satsen, så går allt jättebra. Samt även om det råkar stå något i Admin_text-fältet.

@ndersMedlem sedan juni 200032 969 inlägg
#11
  1. Varför använder du LIKE utan wildcards? Använd = om du inte ska göra en sökning.
  2. Lägg in lösenord i WHERE-satsen i SQL-frågan, det är dumt att ha det utanför.
  3. Replace:a en apostrof till två i den data som du ska använda i SQL-frågan.
Set db = Server.CreateObject("ADODB.Connection")
db.Open "DSN=mysql_crew"

User = Replace(Request.Form("User"), "'", "''")
Pass = Replace(Request.Form("Pass"), "'", "''")
IP = Request.ServerVariables("REMOTE_ADDR")

SET rs=db.Execute("SELECT * FROM Users WHERE Nick = '" & User & "' AND Pass = '" & Pass & "'")

If not rs.eof Then
    Uppdate= "UPDATE Users SET 'zzzzzz' WHERE ID=" & ID
    db.Execute Uppdate

    Add = "INSERT INTO Login (User, UserID, IP, Datum, Tid, Lyckat) VALUES ('"&User&"',"&ID&",'"&IP&"','"&Date&"','"&Time&"','Ja')"
    db.Execute Add

    Admin_text = "" & rs("Admin_text")
    If Admin_text = "First" Then
      Response.Redirect("crew/first.asp")
    Else
      Response.Redirect("crew/")
    End if
End if

Nu kanske inte dessa kodförbättringar hjälper dig med just detta problem, men...

Det bör fungera. Jag kan inte förstå hur det kan paja på den if-satsen.

Mvh

FirehMedlem sedan jan. 2003173 inlägg
#12
  1. Bara blev så ;)

  2. Mjo... men... när det är så att man försöker logga in med rätt användarnamn, dock fel lösenord, så ska det skrivas användarens ID i Login-tabellen (om man nu byter Nick). Som det är i din WHERE-sats så hamnar man direkt i Else även om användarnamnet var rätt, men då får jag inget ID på användaren. Därför har jag valt att först lokalisera användaren och sedan kontrollera lösenordet. Det finns alltså mer saker efter i koden, det är egentligen Else där som koden slutar.

  3. Nu förekommer det dock inga apostrofer i vare sig användarnamn eller lösenord, så det borde inte ställa till något. Kan ju lägga in det ändå.

  4. Jag vet, det borde inte paja... men det gör det... Nu har jag dock ändrat Null = Null igen och sett till att lägga in ett standardvärde (NULL) så att det aldrig är tomt. Då fungerar det ju...

@ndersMedlem sedan juni 200032 969 inlägg
#13
  1. OK, men då får du inte kolla både eof och lösenordet i samma if-sats. Det är dömt att gå åt pipan.

  2. Om man fyller i en apostrof i endera fältet i inloggningsformuläret så kommer det gå åt pipan.

  3. Vad menar du med tomt egentligen?
    Det som brukar vara problemet är null, inte tom sträng. Jag är inte helt med när det är problem.

FirehMedlem sedan jan. 2003173 inlägg
#14
  1. Sorry, jag råkade fixa för mycked i koden jag la in.... eof och pass kontrolleras inte i samma if-sats... var bara mest smidigt att sätta ihop dom när ja skulle få in det här...

  2. Det vet jag...

  3. Ja du.... jag har jobbat med access-databaser tidigare. Där gick det alldeles utmärkt att läsa ur ett fält, även om det inte stod något där. Men när jag nu kör samma sak mot en SQL-databas så blir det fel. Det felet kom i mina Session-inställningar också, men där löste jag det så att det fältet alltid hade standardvärde 0 när det inte var uppdaterat. Jag vet inte vad Null = Null och Null = Not null för för skillnad i en SQL-databas.

FirehMedlem sedan jan. 2003173 inlägg
#15

Här har du hela koden med två av dina ändringar.
Blir dock fortfarande "Undantag inträffade, line 27:

<%
Set db = Server.CreateObject("ADODB.Connection")
db.Open "DSN=mysql_crew"

User = Replace(Request.Form("User"), "'", "''")
Pass = Replace(Request.Form("Pass"), "'", "''")
IP = Request.ServerVariables("REMOTE_ADDR")

SET rs=db.Execute("SELECT * FROM Users WHERE Nick = '" & User & "'")

If not rs.eof Then
  ID = rs("ID")
  If rs("Pass") = Pass Then
    Session("Antal") = rs("Antal") + 1
    Session("Go") = 1
    Session("Namn") = rs("Fnamn") & " " & rs("Enamn")
    Session("Senast") = rs("Senast")
    Session("ID") = rs("ID")
    Senast = Date & " kl " & Time

    Uppdate= "UPDATE Users SET Antal='" & Session("Antal") & "', Senast='" & Senast & "' WHERE ID=" & ID
    db.Execute Uppdate

    Add = "INSERT INTO Login (User, UserID, IP, Datum, Tid, Lyckat) VALUES ('"&User&"',"&ID&",'"&IP&"','"&Date&"','"&Time&"','Ja')"
    db.Execute Add

    If rs("Admin_text") = "First" Then
      Response.Redirect("crew/first.asp")
    Else
      Response.Redirect("crew/")
    End if
  Else
    Add = "INSERT INTO Login (User, UserID, IP, Datum, Tid, Lyckat) VALUES ('"&User&"',"&ID&",'"&IP&"','"&Date&"','"&Time&"','Nej')"
    db.Execute Add

    Session("Meddelande") = "<b>Fel användarnamn<br>och/eller lösenord!</b>"
    Response.Redirect("start.asp")
  End if
Else
  If User <> "" Then
    Add = "INSERT INTO Login (User, UserID, IP, Datum, Tid, Lyckat) VALUES ('"&User&"',0,'"&IP&"','"&Date&"','"&Time&"','Nej')"
    db.Execute Add
  End if
  
  Session("Meddelande") = "<b>Fel användarnamn<br>och/eller lösenord!</b>"
  Response.Redirect("start.asp")
End if
%>
136 ms totalt · 3 externa anrop · v20260731065814-full.a2ca460b
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)