02. august 2005 - 06:55Der er
25 kommentarer og 1 løsning
Ala autobud på auktion
Jeg sidder og fifler lidt med et lille auktionsscript, og er løbet ind i et problem...hvordan laver jeg fast budforøgelse på fx 50 kr pr bud... hvis der fx er budt 400 kr skal den der byder næste gang bude 450... hvordan får jeg scriptet til automatisk at ligge 50 kr på hvert bud? bud.asp: <form action="form_ac.asp" method="post"> <div align="center"> <center> <table border="0" cellpadding="0" cellspacing="0" width="381"> <tr> <td width="80">Navn:</td> <td width="381"><input type="text" name="navn" size="20" maxlength="255"></td> </tr> <tr> <td width="80">Adresse:</td> <td> <input type="text" name="adresse" size="20"></td> </tr> <tr> <td width="80">Postnr:</td> <td> <input type="text" name="postnummer" size="4"></td> </tr> <tr> <td width="80">By:</td> <td> <input type="text" name="town" size="20"></td> </tr> <tr> <td width="80">Telefon:</td> <td> <input type="text" name="telefon" size="20"></td> </tr> <tr> <td width="80">Email:</td> <td> <input type="text" name="email" size="20"></td> </tr> <tr> <td width="80">Næste bud</td> <td> <input type="text" name="bud" size="6"> Dkr.</td> </tr> </table> </center> </div> <p align="center"><input type="submit" value="Send bud" name="Send" class="button"></p> </form> <p>
' A Function to check if some field entered by user is empty Function ChkString(string) If string = "" Then string = " " ChkString = Replace(string, "'", "''") End Function
sql = "SELECT * from users where Id = " & ChkString(Request.Form("id")) & "" If ChkString(Request.Form("users")) > bud Then Response.Write "Du har budt under det foregående bud. Det kan du ikke." Else rs.Close Set rs = Nothing
' Receiving values from Form navn = ChkString(Request.Form("navn")) adresse = ChkString(Request.Form("adresse")) postnummer = ChkString(Request.Form("postnummer")) town = ChkString(Request.Form("town")) telefon = ChkString(Request.Form("telefon")) email = ChkString(Request.Form("email")) bud = ChkString(Request.Form("bud")) Id = ChkString(Request.Form("Id"))
' Creating Connection Object and opening the database Set con = Server.CreateObject("ADODB.Connection") con.Open data_source con.Execute sql_insert ' Done. Close the connection con.Close Set con = Nothing Response.Write "<FONT FACE='VERDANA' SIZE='2'>Tak for dit bud.</FONT><br>" ' ============================================= Set JMail = Server.CreateObject("JMail.SMTPMail") JMail.ContentType = "text/html" JMail.ServerAddress = "mail3.cliche.dk" JMail.Priority = 1 JMail.Sender = "test@test.dk" JMail.AddRecipientEx "test@test.dk", "" Jmail.AddRecipientCC "test@test.dk" Jmail.AddRecipientBCC "test@test.dk" JMail.Subject = "Der er givet et bud.." JMail.Body = "Der er givet et bud." JMail.Execute Set JMail = Nothing
Du trækker bare det sidste bud ud af databasen og ligger 50 kr oven i.
<% Naestebub = rs("bud") + 50 %>
Synes godt om
Slettet bruger
03. august 2005 - 00:22#2
Jeg har fået det virke som det skal og dog... når jeg forsøger at byde, så kommer den med denne fejl: "Du har budt under det foregående bud. Det kan du ikke." i form_ac.asp er der "lås på så der ikke kan bydes under det beløb der der er budt...så jeg rettede min form_ac.asp til dette: <% ' Declaring variables Dim navn, adresse, postnummer, town, telefon, email, bud, data_source, con, sql_insert
' A Function to check if some field entered by user is empty Function ChkString(string) If string = "" Then string = " " ChkString = Replace(string, "'", "''") End Function
sql = "SELECT * from users where Id = " & ChkString(Request.Form("id")) & "" If ChkString(Request.Form("users")) <= bud Then Response.Write "Du har budt under det foregående bud. Det kan du ikke." Else rs.Close Set rs = Nothing
' Receiving values from Form navn = ChkString(Request.Form("navn")) adresse = ChkString(Request.Form("adresse")) postnummer = ChkString(Request.Form("postnummer")) town = ChkString(Request.Form("town")) telefon = ChkString(Request.Form("telefon")) email = ChkString(Request.Form("email")) bud = ChkString(Request.Form("bud")) Id = ChkString(Request.Form("Id"))
' Creating Connection Object and opening the database Set con = Server.CreateObject("ADODB.Connection") con.Open data_source con.Execute sql_insert ' Done. Close the connection con.Close Set con = Nothing Response.Write "<FONT FACE='VERDANA' SIZE='2'>Tak for dit bud.</FONT><br>" ' ============================================= Set JMail = Server.CreateObject("JMail.SMTPMail") JMail.ContentType = "text/html" JMail.ServerAddress = "mail3.cliche.dk" JMail.Priority = 1 JMail.Sender = " test@test.dk" JMail.AddRecipientEx " test@test.dk", "" Jmail.AddRecipientCC " test@test.dk" Jmail.AddRecipientBCC " test@test.dk" JMail.Subject = "Der er givet et bud.." JMail.Body = "Der er givet et bud." JMail.Execute Set JMail = Nothing
End if %> men får denne fejl: Microsoft VBScript runtime error '800a01a8'
Hvad står der i de foregående linier? Har du erklæret rs og er den åben?
Det ser umiddelbart spøjst ud at du starter en else-del med at lukke et recordset (formoder jeg det er pga. navngivning), det vil jeg da anbefale at du gør i forbindelse med at du aflæser data fra dette recordset...
Synes godt om
Slettet bruger
03. august 2005 - 00:33#4
der står: sql = "SELECT * from users where Id = " & ChkString(Request.Form("id")) & "" If ChkString(Request.Form("users")) <= bud Then Response.Write "Du har budt under det foregående bud. Det kan du ikke." Else rs.Close Set rs = Nothing
Jeg forstår ikke helt sammenhænget, for det ser ud til at du har indlæst nogle data inden dette kode bliver udført og jeg kan heller ikke se hvor din kode rent faktisk lægger 50 kr. til det eksisterende bud (hvorfor skal den egentlig det, hvis brugeren har angivet et bud der er højere end det eksisterende, er det vel det der skal gælde...? Hvis ikke så ville jeg nok vælge at skrive de 50 kr. som en fast tekst og så lave en knap der forøgede buddet - Nå, det skal jeg ikke blande mig i). Ej heller kan jeg se hvor det eksisterende bud bliver hentet - jeg kan bare se at den variabel der hedder bud bliver sammenlignet med en non-eksistent formværdi (users)...
Er bud en streng i databasen, jeg ville tro det skulle have været et tal (det gør i det mindste addition af værdier lidt lettere).
Som du kan fornemme mangler jeg lidt information inden jeg kan hjælpe dig videre... håber du har mod på at føre mig ind i sagerne :)
Synes godt om
Slettet bruger
03. august 2005 - 01:11#8
siden hvor budet skrives ser således ud: <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "PROVIDER=MSDASQL;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("form.mdb") & ";UID=admin;PWD=;" Set rs = Server.CreateObject("ADODB.RecordSet") sql = "SELECT * FROM users" set rs = conn.execute(sql)
Jeg synes din forspørgsel på hvad bud skal være er lidt vidtfavnende (iblandt alle brugere tager du den første og bedstes bud som du så bruger som det næste... eller hvad?). Jeg ville forvente en lidt mere specifik forspørgsel, f.eks. hvilken effekt er man ved at byde på og hvornår er buddet givet, men det er der måske ikke noget af i dit system...?
Nå, men med udgangspunkt i den form du lige har postet og den kode du tidligere har postet vil jeg foreslå denne kode i stedet:
<% ' Declaring variables Dim navn, adresse, postnummer, town, telefon, email, bud, gammelBud Dim data_source, con, sql_insert
' A Function to check if some field entered by user is empty Function ChkString(string) If string = "" Then string = " " ChkString = Replace(string, "'", "''") End Function
' skulle give nogenlunde samme vidtfavnende resulatat som formularen... sql = "SELECT * FROM users" ' Creating Connection Object and opening the database Set con = Server.CreateObject("ADODB.Connection") con.Open data_source set rs = con.Execute(sql) gammelBud = rs("bud") rs.Close
If CDbl(ChkString(Request.Form("bud"))) <= CDbl(gammelBud) Then Response.Write "Du har budt under det foregående bud. Det kan du ikke." Else
' Receiving values from Form navn = ChkString(Request.Form("navn")) adresse = ChkString(Request.Form("adresse")) postnummer = ChkString(Request.Form("postnummer")) town = ChkString(Request.Form("town")) telefon = ChkString(Request.Form("telefon")) email = ChkString(Request.Form("email")) bud = ChkString(Request.Form("bud")) Id = ChkString(Request.Form("Id"))
con.Execute sql_insert ' Done. Close the connection con.Close Set con = Nothing
Response.Write "<FONT FACE='VERDANA' SIZE='2'>Tak for dit bud.</FONT><br>" ' ============================================= Set JMail = Server.CreateObject("JMail.SMTPMail") JMail.ContentType = "text/html" JMail.ServerAddress = "mail3.cliche.dk" JMail.Priority = 1 JMail.Sender = " test@test.dk" JMail.AddRecipientEx " test@test.dk", "" Jmail.AddRecipientCC " test@test.dk" Jmail.AddRecipientBCC " test@test.dk" JMail.Subject = "Der er givet et bud.." JMail.Body = "Der er givet et bud." JMail.Execute Set JMail = Nothing End if %>
Synes godt om
Slettet bruger
03. august 2005 - 01:43#10
jeg får denne fejl: Microsoft VBScript compilation error '800a03f4'
ok, jeg synes nok jeg kunne spore en vis usikkerhed ifht. hvad koden rent faktisk gør...
Fik du noget ud af at flytte opsætningen af forbindelsen op før forbindelsesobjektet bliver oprettet?
Synes godt om
Slettet bruger
03. august 2005 - 02:16#16
tænker du på sådan: data_source = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _ Server.MapPath("form.mdb") ' skulle give nogenlunde samme vidtfavnende resulatat som formularen... sql = "SELECT * FROM users" ' Creating Connection Object and opening the database Set con = Server.CreateObject("ADODB.Connection") con.Open data_source set rs = con.Execute(sql) gammelBud = rs("bud") rs.Close
Hvad har du så indtastet i bud-feltet på formularen? Ikke et tal vel?
Hvis det er pga. formatet af data vil jeg anbefale at du får lavet et javascript der kan checke formatet inden formularen sendes til serveren (for at spare en tur omkring serveren hvis data ikke er valide). Ud over det skal du have lagt et check ind i form_ac.asp som sikrer sig at der er tale om et tal inden operationen går igang.
Er det korrekt forstået at den side som formularen vises på hedder vis.asp?
I så fald vil jeg bede dig lægge flg. kode ind på form_ac.asp lige efter funktionen ChkString:
if not isNumeric(Request.Form("bud")) then Response.Redirect "vis.asp" end if
Jeg ved det ikke er en særlig pæn forklaring brugeren får i denne situation, men det kan du udbygge senere. Lige nu skal vi bare have den til at reagere på dit bud...
Synes godt om
Slettet bruger
03. august 2005 - 02:49#20
mener du sådan: Function ChkString(string) If string = "" Then string = " " End If ChkString = Replace(string, "'", "''") End Function if not isNumeric(Request.Form("bud")) then Response.Redirect "vis.asp" end if
Jeps. Så vil der ligge en kontrol af at buddet er numerisk inden der forsøges opdatering af databasen. Hvis det ikke er numerisk, så vil formularen (vis.asp) blot blive vist igen...
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.