sql = "SELECT * FROM refrencer WHERE r_id="&rid set rs = Conn.Execute(sql)
set pic = upload.files("pic") if pic is nothing then pic1 = rs("pic") else pic1 = pic.ExtractFileName if rs("pic") <> "" then 'starter slettefunktion af det fysiske billede set fso = Server.CreateObject("Scripting.FileSystemObject") sti = Server.MapPath("./upload/thumbnail"&rs("pafh")&"") 'response.Write sti 'response.End() set f1 = fso.GetFile(sti) f1.Delete end if
Mød TrackMan og Veo på Computerworld Cloud & AI Festival og hør, hvordan tech ændrer måden, vi træner og udvikler talent – fra skolebold til The Masters.
umiddelbart lyder det som om Upload.Files(1) fejler, men det kan jeg ikke få til at passe med linie 8-9...
Prøv umiddelbart at indeksere 0 i stedet for 1, altså
Upload.Files(0)
kontrollér evt. om der er nogen files inden du indekseere. Jeg vil tro der finde en Count på Upload.Files, så du kan gøre således inden du begynder at aflæse filer
if Upload.Files.Count > 0 then set file = Upload.Files(0)
Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A01A8) Et objekt er obligatorisk: 'File' /portfolio/cases.asp, line 643
Det skal lige siges at det her er bare en del af koden af et stort projekt og derfor passer liner ikke men vil tror at den fejl som briskrives her er denner linier her.
if File.Ext <> ".jpg" then response.write"Forkert fil format" response.End() end if
Jeg synes ikke umiddelbart det ville være logisk hvis nogen af de linjer du viser, gav den fejl. Jeg synes mere det lyder som om en tildeling af et objekt ikke benytter "set" foran (jeg er dog ikke helt sikker på dette)...
Bruger du også den konstruktion med at tjekke på upload.files.count?
I så fald, har du så lagt alt den kode som er afhængig af, at der er noget i upload.files, ind i den if-sætning som tjekkede om der var nogle filer (for det nytter jo ikke noget bare at lægge den omkring upload.files(0) og så lade resten af koden blive udfør uanset om der er filer eller ej... det vil give nogle problemer med at File ikke er sat til noget).
sql = "SELECT * FROM refrencer WHERE r_id="&rid set rs = Conn.Execute(sql)
set pic = upload.files("pic") if pic is nothing then pic1 = rs("pic") else pic1 = pic.ExtractFileName if rs("pic") <> "" then 'starter slettefunktion af det fysiske billede set fso = Server.CreateObject("Scripting.FileSystemObject") sti = Server.MapPath("./images"&rs("pic")&"") 'response.Write sti 'response.End() set f1 = fso.GetFile(sti) f1.Delete end if
Så er det nok det der er problemet, for du skal jo ikke gøre alt det du gør med File-objektet, hvis der ikke er nogle filer i det aktuelle POST til serveren.
Prøv i stedet med denne kode:
<% case "cms_ret"
if request.ServerVariables("CONTENT_LENGTH") > 0 then 'Opret objekt Set Upload = Server.CreateObject("Persits.Upload")
Upload.OverwriteFiles = False
Path = Server.MapPath("./upload/original")
'Fang filen til upload if Upload.Files.Count > 0 then set file = Upload.Files(0)
'Tjek filformat if File.Ext <> ".jpg" then response.write"Forkert fil format" response.End() end if
'Er det en gyldig billede fil? If File.ImageType <> "UNKNOWN" then Set Jpeg = Server.CreateObject("Persits.Jpeg")
'Åben den uploadede fil Jpeg.Open(File.Path)
'Resize i henhold til scale muligheden Jpeg.Width = Jpeg.OriginalWidth * Upload.form("scale") / 100 Jpeg.Height =Jpeg.OriginalHeight * Upload.form("scale") / 100
PathT = Server.MapPath("./upload/thumbnail") 'angiv hvor filen skal gemmes SavePath = PathT & "\small_" & File.ExtractFileName
'find absolute sti til uplaod mappe dbpath =replace (Server.MapPath("./upload"),"\","\\")
sql = "SELECT * FROM refrencer WHERE r_id="&rid set rs = Conn.Execute(sql)
set pic = upload.files("pic") if pic is nothing then pic1 = rs("pic") else pic1 = pic.ExtractFileName if rs("pic") <> "" then 'starter slettefunktion af det fysiske billede set fso = Server.CreateObject("Scripting.FileSystemObject") sti = Server.MapPath("./images"&rs("pic")&"") 'response.Write sti 'response.End() set f1 = fso.GetFile(sti) f1.Delete end if end if end if
Fejltype: Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 /portfolio/cases.asp, line 672
line 672 ser sådan her ud
line 671 sql = "SELECT * FROM refrencer WHERE r_id="&rid line 672 set rs = Conn.Execute(sql)
OK, så lader det i det mindste til at fejlen med upload er løst... :-)
Nu skal du så bare sikre dig at rid indeholder en numerisk værdi inden du kaster den efter din database. Det kan du f.eks. gøre ved at tjekke variablen med funktionen isnumeric. Således:
' tjek om rid er numerisk og ikke indeholder komma eller punktum if isnumeric(rid) and instr(rid,",")=0 and instr(rid,".")=0 then sql = "SELECT * FROM refrencer WHERE r_id=" & rid
' ...OG RESTEN AF DIN DATABASEKODE HER
else Response.write("Der er ikke angivet noget id, eller en anden fejl er opstået i forbindelse med opslag i databasen.") end if
ALTERNATIVT er det tabelnavnet der er stavet forkert... ;-)
Så kommer denne fejl Fejltype: Der opstod en Microsoft VBScript-kørselsfejl (0x800A000D) Typer stemmer ikke overens: 'rs' /portfolio/cases.asp, line 686
line 686 ser sådan ud
line 681 set pic = upload.files("pic") line 682 if pic is nothing then line 683 pic1 = rs("pic") line 684 else line 685 pic1 = pic.ExtractFileName line 686 if rs("pic") <> "" then
Jamen, du har da en kaskade af fejl i din kode der... ;-)
Hvilken type er feltet "pic" i databasen? Det lader i det mindste ikke til at det er en streng. Du kan evt. sammensætte med en tom streng, så vil feltet blive konverteret til en streng. Således:
Underligt!? Benytter du On Error Resume Next nogen steder? Man kunne næsten have rs mistænkt for ikke at være initieret (fordi conn.execute fejler og ikke får sat variablen rs til noget og den derfor indeholder "værdien" Empty).
Kan du ikke prøve at indsætte nogle debug-linier i koden, som tester nogle forhold omkring variablen og dens typen... bare så vi har noget at forholde os til?
Du kan forsøge at indsætte disse linjer umiddelbart inden linje 681 (og umiddelbart efter linjen med conn.execute):
' tjek om rid er numerisk og ikke indeholder komma eller punktum if isnumeric(rid) and instr(rid,",")=0 and instr(rid,".")=0 then sql = "SELECT * FROM refrencer WHERE r_id=" & rid set rs = Conn.Execute(sql)
else Response.write("Der er ikke angivet noget id, eller en anden fejl er opstået i forbindelse med opslag i databasen.") end if
set pic = upload.files("pic") if pic is nothing then pic1 = rs("pic") else pic1 = pic.ExtractFileName if rs("pic") & "" <> "" then 'starter slettefunktion af det fysiske billede set fso = Server.CreateObject("Scripting.FileSystemObject") sti = Server.MapPath("./images"&rs("pic")&"") 'response.Write sti 'response.End() set f1 = fso.GetFile(sti) f1.Delete end if end if end if
Hmm... du laver godt nok det check på om rid er numerisk, men desværre lader du bare koden, der forventer et objekt i rs, køre videre selvom den ikke når at blive sat (i det tilfælde at rid rent faktisk ikke er numerisk) - det SKAL give problemer. Du er nød til at lægge den kode, som er afhængig af at rs er et RecordSet-objekt, ind i sammen if-blok som den kode der laver opslaget i databasen. Nogenlunde således:
if isnumeric(rid) and instr(rid,",")=0 and instr(rid,".")=0 then sql = "SELECT * FROM refrencer WHERE r_id=" & rid set rs = Conn.Execute(sql)
response.write "Empty: " & isEmpty(rs) & "<br>" response.write "Null: " & isNull(rs) & "<br>" response.write "Objekt: " & isObject(rs) & "<br>" if isObject(rs) then response.write "Nothing: " & (rs is nothing) & "<br>" end if response.write "Type: " & typeName(rs) & "<br>" response.flush
set pic = upload.files("pic") if pic is nothing then pic1 = rs("pic") else pic1 = pic.ExtractFileName if rs("pic") & "" <> "" then 'starter slettefunktion af det fysiske billede set fso = Server.CreateObject("Scripting.FileSystemObject") sti = Server.MapPath("./images"&rs("pic")&"") 'response.Write sti 'response.End() set f1 = fso.GetFile(sti) f1.Delete end if end if end if
else Response.write("Der er ikke angivet noget id, eller en anden fejl er opstået i forbindelse med opslag i databasen.") end if
DERNÆST skal du, når du kopierer kode, jo sørge for at ændre variabelnavne så de passer til den kontekst de benyttes i. Idet du slår op for at læse data (ved første visning), kalder du din RecordSet-variabel for rsref, så det skal den også hedde i efterfølgende kode. Jeg er klar over at det kun er DEBUG-kode, men ikke desto mindre kan det jo fejle som alt andet kode, derfor skal du rette det således:
id= request.QueryString("id")
sqlref= "SELECT * FROM refrencer WHERE r_id="& id &" " set rsref = Conn.Execute(sqlref)
response.write "Empty: " & isEmpty(rsref) & "<br>" response.write "Null: " & isNull(rsref) & "<br>" response.write "Objekt: " & isObject(rsref) & "<br>" if isObject(rsref) then response.write "Nothing: " & (rsref is nothing) & "<br>" end if response.write "Type: " & typeName(rsref) & "<br>" response.flush
NB: Fejlhåndtering er en STOR del af at programmere, så det kan du ligeså godt vænne dig til, ellers kommer du til at fejl stort som programmør :-)
Jeg er ret interesseret i at høre hvad din browser skriver mht. de værdier jeg har fået dig til at skrive ud - det er jo ligesom det der er grundlaget for at bedømme hvor det giver mest mening at lede efter fejlen...
if isnumeric(rid) and instr(rid,",")=0 and instr(rid,".")=0 then sql = "SELECT * FROM refrencer WHERE r_id=" & rid set rs = Conn.Execute(sql)
response.write "Empty: " & isEmpty(rs) & "<br>" response.write "Null: " & isNull(rs) & "<br>" response.write "Objekt: " & isObject(rs) & "<br>" if isObject(rs) then response.write "Nothing: " & (rs is nothing) & "<br>" end if response.write "Type: " & typeName(rs) & "<br>" response.flush
set pic = upload.files("pic") if pic is nothing then pic1 = rs("pic") else pic1 = pic.ExtractFileName if rs("pic") & "" <> "" then 'starter slettefunktion af det fysiske billede set fso = Server.CreateObject("Scripting.FileSystemObject") sti = Server.MapPath("./images"&rs("pic")&"") 'response.Write sti 'response.End() set f1 = fso.GetFile(sti) f1.Delete end if end if end if
De skulle meget gerne komme af sig selv (i og med jeg allerede har kald response.write som udskriver tekst til din browser)... :-)
Det der måske går galt er, at din side når at redirect'e og du derfor ikke får værdierne at se. Du kan evt. prøve at indsætte flg. linie umiddelbart inden Response.Redirect:
Response.End
Så vil der ikke ske mere efter det punkt hvor response.end bliver kaldt, da den stopper al udskrivning til browseren (i en forsimplet udlægning).
Der er noget andet som slører resultatet, noget som du ikke har med her...
Jeg har desværre ikke tid til at hjælpe længere idag, da jeg har en aftale om lidt, men mit råd er: skaf dig af med alt det overflødige på siden og hav kun det kode der er nødvendigt for at udføre din handling. Du kan evt. POST'e din form til en anden side med dette kode i, og så redirect'e tilbage til formularsiden når det går godt... men jeg fornemmer det vil tilføre en kompleksitet du ikke er klar til at håndtere endnu...(?)
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.