Geschrieben von: Alexander Zeitler
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
Umfragen sind ein einfaches aber hilfreiches Tool, wenn es darum geht, etwas über die Wünsche und Verhaltensweisen von Besuchern auf einer Webseite zu erfahren. Die möglichen Einsatzgebiete sind vielfältig. Wir wollen uns heute mit der Programmierung einer Umfrage beschäftigen, die uns die fünf am häufigsten besuchten Webseiten liefert.
Außerdem erstellen wir uns eine Administrationsseite, auf der wir mühelos alle Parameter und Einträge steuern können.
Betrachten wir zunächst ein mögliches Ergebnis, wie unsere Umfrage zu Beginn aussehen könnte:
Der Aufbau der Umfrage ist relativ einfach gestaltet. Außer einer frei definierbaren Frage werden die in der Datenbank befindlichen Webseiten sowie der Betreiber gelistet. Weiterhin sieht man ein Diagramm, das die bisherige Stimmenvergabe prozentual darstellt, gefolgt von der absoluten Stimmenzahl je Webseite und deren Prozentsatz. Was natürlich auch nicht fehlen darf ist das Radio-Feld, das uns die Stimmabgabe überhaupt erst ermöglicht.
Unterhalb dieser Werte ist die Anzahl der bisher insgesamt abgegeben Stimmen (optional) sowie das End-Datum der Umfrage angegeben.
Die oben gewählte Darstellungsweise ist zwar sehr auskunftsfreudig, hat allerdings zwei Nachteile. Zum einen wird für diese Darstellung relativ viel Platz benötigt, zum anderen ist es für die Besucher wegen der dargestellten Zwischenergebnisse möglich, das Endergebnis zu beeinflussen. Deshalb sollte es also möglich sein, die Umfrage den individuellen Sicherheits- und Platzanforderungen anzupassen - und dies in allen drei Phasen (Umfrage vor der Wahl, Benutzer hat gewählt, Ende der Umfrage) der Umfrage.
In der obigen Grafik nicht zu sehen, aber dennoch variabel konfigurierbar soll auch die Anzahl der dargestellten Webseiten sein, die ab dem Ende der Umfrage angezeigt werden. In unserem Fall wären das also 5.
Aus unseren soeben gewonnenen Anforderungen ergibt sich somit, daß wir zwei Tabellen in der Datenbank benötigen: vote und vote_parameter. Beide Tabellen sind in der MS Access Datenbank vote.mdb gespeichert, die auch dem heutigen Download beiliegt.
Die Struktur der Tabelle vote
Die Struktur der Tabelle vote_parameter
Kommen wir nun zur Umsetzung unserer Vorstellungen. Zunächst müssen wir überprüfen, ob sich in der Tabelle vote_parameter überhaupt Werte befinden. Ist diese Tabelle leer, würden wir die Umfrage anstelle einer Frage mit einer für den Benutzer undefinierbaren Fehlermeldung beginnen. Wir benötigen diese Prüfung - wie fast den gesamten Code - für jeweils alle drei Zustände der Umfrage, die ich hier noch einmal genau definieren möchte:
Aus dieser Tatsache heraus ergibt es sich, daß wir sinnvoller Weise einen Großteil des Codes in Prozeduren und Funktionen auslagern und diese dann mit dem jeweiligen Zustand (Status) aufrufen.
Wenden wir uns nun der Überprüfung, ob überhaupt Parameter vorhanden sind, zu. Um das Ergebnis der Überprüfung abfragen zu können, erstellen wir diese als Funktion mit dem Namen Check_Parameter:
Function Check_Parameter
strSQL = "SELECT * FROM Vote_Parameter"
Set rs = Conn.Execute(strSQL)
If rs.Eof Then
Check_Parameter = False
Else
Check_Parameter = True
End If
rs.Close
Set rs = Nothing
End Function
Die Funktionsweise ist schnell erklärt. Wir erstellen ein RecordSet und überprüfen, ob dieses leer ist - ist dies der Fall, liefert die Funktion das Ergebnis False zurück, sonst logischerweise True. Aufgerufen wird diese Funktion mit einer If-Abfrage, worauf wir aber später noch gezielt eingehen werden.
Es folgt nun eine weitere Überprüfung der Parameter: ist die Umfrage beendet? Hierzu verwenden wir wiederum eine Funktion: Check_Ende, welche zu gegebener Zeit auch durch eine If-Abfrage aktiviert wird.
Function Check_Ende
strSQL = "SELECT Ende FROM Vote_Parameter"
Set rs = Conn.Execute(strSQL)
If rs.Fields("Ende").Value <= ServerNow() Then
Check_Ende = True
Else
Check_Ende = False
End If
rs.Close
Set rs = Nothing
End Function
Nach einer Prüfung des Enddatums in der Tabelle vote_parameter gegen das Datum aus der Funktion ServerNow werden der Funktion entsprechend die Werte True (Umfrage ist beendet) oder False (Umfrage läuft noch) zugewiesen.
Die Funktion ServerNow dient dazu, um eventuell vorhandene Zeitunterschiede bei amerikanischen (oder allg. ausländischen) Servern auszugleichen. Hierzu ist anstelle der 0 der entsprechende Zeitunterschied in Stunden einzutragen.
Function ServerNow()
ServerNow = DateAdd("h", 0, Now())
End Function
Kommen wir jetzt zur Darstellung der Kopfzeile. Auch diese variiert in Abhängigkeit vom Status, weswegen wir sie als Prozedur Zeige_Header implementieren. Beim Aufruf dieser Prozedur wird der aktuelle Status übergeben, welcher sich in der Variable strStatus befindet.
Sub Zeige_Header(strStatus)
rsHeader = strStatus & "_Header"
strSQL = "SELECT "
strSQL = strSQL & rsHeader
strSQL = strSQL & " FROM Vote_Parameter"
Set rs = Conn.Execute(strSQL)
Response.Write "<td>"
Response.Write rs(0)
Response.Write "</td>" & vbCrLf
rs.close
Set rs = Nothing
End Sub
In das Recordset greife ich mit dem Index des Feldes, das ich auslesen will. Da nur eine Spalte durch die SELECT Abfrage retourniert wird, ist das der Index 0. Der Vorteil ist, daß Zugriffe mittels Index schneller sind als mit Name.
Die in strStatus befindlichen Werte bzw. Strings sind bei näherer Betrachtung identisch mit den Präfixen (standard etc.) der Parameter in der Tabelle Vote_Parameter - der Grund hierfür wird gleich ersichtlich, wenn wir uns die Prozedur Erzeuge_Eintraege ansehen:
Sub Erzeuge_Eintraege (strStatus)
rsDiagramm = strStatus & "_Diagramm"
rsAnzahl = strStatus & "_Anzahl"
rsProzent = strStatus & "_Prozent"
rsVote = strStatus & "_Vote"
strSQL = "SELECT " & rsDiagramm & "," & rsAnzahl & "," & rsProzent & ","
strSQL = strSQL & rsVote & " FROM Vote_Parameter"
Set rs = Conn.Execute(strSQL)
brsDiagramm = rs(0)
brsAnzahl = rs(1)
brsProzent = rs(2)
brsVote = rs(3)
rs.Close
Set rs = Nothing
Zeige_Eintraege brsDiagramm, brsAnzahl, brsProzent, brsVote, strStatus
End Sub
Der an die Prozedur übergebene String strStatus wird vor der Erzeugung eines Recordsets mit den jeweiligen Suffixen ("_Diagramm" etc.) der Spaltennamen verknüpft. Hieraus wird der den SQL-String erzeugt und ausgeführt. Die Ergebnisse dieser Abfrage werden dann lokalen Variablen zugeordnet, sodaß wir das Recordset bereits vor Aufruf der Prozedur Zeige_Eintraege schließen können. Danach wird die Prozedur Zeige_Eintraege mit den jetzt lokalen True- und False-Werten (aus der Tabelle Vote_Parameter) und dem aktuellen Status (strStatus) aufgerufen:
Sub Zeige_Eintraege(bDiagramm, bAnzahl, bProzent, bVote,strStatus)
Response.Write "<table border=""0"" width=""100%"" cellpadding=""0"" cellspacing=""0"">" & vbCrLf
Response.Write "<form action=""vote.asp"" method=""post"">" & vbCrLf
Response.Write "<tr>" & vbCrLf
Response.Write "<td bgcolor=""#808080"">Homepage</td>" & vbCrLf
Response.Write "<td bgcolor=""#808080""> Betreiber</td>" & vbCrLf
If bDiagramm=True Then
Response.Write "<td bgcolor=""#808080""> Diagramm</td>" & vbCrLf
End If
If bAnzahl = True Then
Response.Write "<td bgcolor=""#808080""> Anzahl</td>" & vbCrLf
End If
If bProzent=True Then
Response.Write "<td bgcolor=""#808080""> Prozent</td>" & vbCrLf
End If
If bVote=True Then
Response.Write "<td bgcolor=""#808080""> Ihre Stimme</td>" & vbCrLf
End If
If strStatus <> "ende" Then
strSQL = "SELECT * FROM Vote ORDER BY Homepage"
Else
strSQLEnde = "SELECT * FROM Vote_Parameter"
Set rsende = Conn.Execute(strSQLEnde)
strSQL = "SELECT TOP "
strSQL = strSQL & rsende("Ende_Eintraege")
strSQL = strSQL & " * FROM Vote ORDER BY Anzahl DESC"
End If
Set rs = Conn.Execute(strSQL)
Do While Not rs.Eof
Response.Write "<tr>" & vbCrLf
Response.Write "<td>" & rs("Homepage") & "</td>" & vbCrLf
Response.Write "<td> " & rs("Betreiber") & "</td>" & vbCrLf
If bDiagramm=True Then
Response.Write "<td> "
intProzente=Zeige_Prozent(rs("Anzahl"))
Zeige_Diagramm(intProzente)
Response.Write "</td>" & vbCrLf
End If
If bAnzahl=True Then
Response.Write "<td align=""right""> " & rs("Anzahl") & "</td>" & vbCrLf
End If
If bProzent=True Then
Response.Write "<td align=""right""> " & Zeige_Prozent(rs("Anzahl"))
Response.Write "%</td>" & vbCrLf
End If
If bVote=True Then
Response.Write "<td align=""center"">"
Response.Write "<input type=""radio"" name=""id"" value=""" & rs("Id")
Response.Write """></td>" & vbCrLf
End If
Response.Write "</tr>" & vbCrLf
rs.MoveNext
Loop
Response.Write "</table>" & vbCrLf
rs.Close
Set rs = Nothing
End Sub
Zunächst wird die Kopfzeile der Tabelle generiert. Für die Felder Homepage und Betreiber gibt es keine Einschränkungen, sehr wohl aber für die restlichen Felder. Hier kommen die übergebenen Booleschen Werte bDiagramm, bAnzahl, bProzent, bVote zum tragen. Durch Auswertungen mit If-Abfragen wird festgelegt, ob die Spalten angezeigt werden sollen oder nicht.
Direkt im Anschluß wird der String strStatus ausgewertet - enthält dieser nicht den Eintrag ende, so wird der SQL-String zur Anzeige aller Einträge sortiert nach der Homepage generiert. Ist der Eintrag jedoch ende, so wird zunächst aus der Tabelle Vote_Parameter die Anzahl der anzuzeigenden Datensätze (Ende_Eintraege) ermittelt. Danach wird eine TOP-Abfrage mit eben dieser Anzahl erstellt. In der Folge werden alle der Abfrage entsprechenden Datensätze angezeigt und natürlich werden auch hier nochmals die Booleschen Werte ausgewertet, um die anzuzeigenden Spalten festzulegen.
Bei den Abfragen für die Spalten Diagramm und Prozent werden wiederum Prozeduren bzw. Funktionen mit Parametern aufgerufen, die die entsprechenden Arbeiten erledigen.
Betrachten wir zuerst die Funktion Zeige_Prozent, da diese auch die Grundlage für die Prozedur Zeige_Diagramm bildet:
Function Zeige_Prozent(intAnzahl)
strSQL = "SELECT Sum(Anzahl) AS SumOfAnzahl FROM vote"
Set rs = Conn.Execute(strSQL)
intGesamt = rs("SumOfAnzahl")
intProzent = Round(intAnzahl/intGesamt*100,1)
Zeige_Prozent = intProzent
rs.close
Set rs = Nothing
End Function
Zunächst wird die Anzahl aller bisher abgegebenen Stimmen ermittelt. Diese wird dann mit der übergebenen Stimmenzahl (intAnzahl) zu einem Prozentsatz verrechnet, der als Ergebnis der Funktion zurückgegeben wird.
Wie bereits erwähnt, wird aus den nun ermittelten Prozentsätzen das Diagramm mit Hilfe der Funktion Zeige_Diagramm erzeugt:
Sub Zeige_Diagramm(intProzente)
Balken = Prozentsatz Pixel breit
sBalkenBreite = intProzente
wBalkenBreite = (100 - sBalkenBreite)
Response.Write "<img src=""diagramm_s.gif"" width=""" & sBalkenBreite
& """ height=""6"" border=""0"" alt=""" & Round(intProzente,1) & "%"">"
Response.Write "<img src=""diagramm_w.gif"" width=""" & wBalkenBreite
& """ height=""6"" border=""0"" alt=""" & Round(intProzente,1) & "%"">"
End Sub
In einer Schleife von 1 bis 100 (für 100%) wird überprüft, ob der übergebene Prozentsatz (intProzente) kleiner oder gleich dem aktuellen Zählerwert ist. Ist dies der Fall, so wird ein schwarzer Strich dargestellt. Alle Werte über dem Prozentsatz ergeben einen weißen Strich, was im Gesamtergebnis zu unserem Balkendiagramm führt.
Was uns jetzt noch fehlt, ist die zum Status passende Fußzeile. Auch das überlassen wir einer Prozedur, der wir den Status übergeben:
Sub Zeige_Footer (strStatus)
strSQL = "SELECT * FROM Vote_Parameter"
Set rs = Conn.Execute(strSQL)
Record_Gesamt = strStatus & "_Gesamt"
If rs(Record_Gesamt) = True Then
strSQL1 = "SELECT Sum(Anzahl) AS SumOfAnzahl FROM vote"
Set rs1 = Conn.Execute(strSQL1)
intGesamt = rs1("SumOfAnzahl")
rs1.Close
Set rs1 = Nothing
If strStatus <> "ende" Then
Response.Write "Bisher abgegebene Stimmen: " & intGesamt & "<br>"
Response.Write "Die Umfrage endet am " & rs("ende")
Else
Response.Write "Insgesamt abgegebene Stimmen: " & intGesamt
End If
Else
Response.Write "Die Umfrage endet am " & rs("Ende")
End If
rs.Close
Set rs = Nothing
End Sub
Nachdem wir aus dem String strStatus und dem Suffix _Gesamt die korrekte Bezeichnung des Recordsets erhalten haben, prüfen wir diesen, ob die Gesamtzahl aller Stimmen angezeigt werden soll oder nicht. Ist die Prüfung positiv, so ermitteln wir wie schon bei den Prozentsätzen die Gesamtzahl der abgegebenen Stimmen aus der Tabelle vote. Danach wird geprüft, ob die Umfrage beendet ist. Ist dies der Fall, so wird der Text "Insgesamt abgegebene Stimmen" ausgegeben, sonst erhalten wir "Bisher abegebene Stimmen" und den Hinweis auf das Enddatum der Umfrage. War die erste Prüfung negativ, so lassen wir nur das Enddatum der Umfrage ausgeben.
Was uns jetzt noch fehlt, ist der Programmteil, der die ganzen Funktionen und Prozeduren aufruft (default.asp):
<!--#include file="strconn.asp"-->
<%
If Check_Parameter = False Then
Response.Write "<tr>" & vbCrLf
Response.Write "<td>"
Response.Write "Keine Parameter vorhanden - überprüfen Sie Ihre Datenbank"
Response.Write "</td>" & vbCrLf
Response.Write "</tr>" & vbCrLf
Else
If Check_Ende = True Then Session("status") = "ende"
strStatus = Session("status")
If strStatus = "" Then strStatus="standard"
Response.Write "<tr>"
Zeige_Header strStatus
Response.Write "</tr>" & vbCrLf
Response.Write "<tr>" & vbCrLf
Response.Write "<td>"
Erzeuge_Eintraege strStatus
Response.Write "</td>" & vbCrLf
Response.Write "</tr>" & vbCrLf
Response.Write "<tr>" & vbCrLf
Response.Write "<td align=""right"">"
If strStatus = "standard" Then
Response.Write "<input type=""submit"" value=""wählen!"">"
Else
Response.Write " "
End If
Response.Write "</td>" & vbCrLf
Response.Write "</form></tr>" & vbCrLf
Response.Write "<tr>" & vbCrLf
Response.Write "<td>"
Zeige_Footer strStatus
Response.Write "</td>" & vbCrLf
Response.Write "</tr>" & vbCrLf
End If
Conn.Close
Set Conn = Nothing
%>
Das Caching wird für diese - wie auch alle anderen Dateien - deaktiviert, um immer aktuelle Werte zu erhalten:
Response.Expires=0 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-control", "no-store"
Die Verbindung zur Datenbank benötigen wir in mehreren Dateien, weswegen sie in eigene Datei (strconn.asp) ausgelagert wird. Das hat den Vorteil, daß eventuelle Änderungen nur einmal für alle ASP-Dateien ausgeführt werden muß. Der Inhalt der Datei strconn.asp:
Set Conn = Server.CreateObject("ADODB.Connection")
strConn = "Driver={Microsoft Access Driver (*.mdb)};DriverID=25;DBQ="
strConn = strConn & Server.MapPath("vote.mdb")
strConn = strConn & ";FIL=MS Access;MaxBufferSize=512;PageTimeout=5;"
Conn.Open strConn
Kommen wir zurück zur Anzeige unserer Umfrage.
Zunächst prüfen wir durch den Aufruf der Funktion Check_Parameter, ob Parameter für die Umfrage in der Datenbank vorhanden sind - ist dies nicht der Fall, brechen wir die Ausgabe mit einer Fehlermeldung ab. Andernfalls fahren wir mit der Prüfung Check_Ende fort und erzeugen entsprechend dem Ergebnis die Sessionvariable status. Deren Inhalt wird dann zum korrekten Status strStatus weiterverarbeitet. Mit eben diesem lassen wir dann die Einträge der Umfrage anzeigen (Erzeuge_Eintraege). Außerdem stellen wir anhand des Status' fest, ob der "wählen"-Button angezeigt werden darf oder nicht. Zu guter letzt lassen wir noch die Fußzeile generieren.
Somit sind wir mit dem Anzeigen der Umfrage fertig und können uns dem zuwenden, was nach einem Klick auf die Radio-Felder und den "wählen"-Button passiert: dem Schreiben der Einträge...
Die vom Benutzer getroffene Auswahl wird an die Seite vote.asp übergeben. Die Auswertung dieser Auswahl geschieht im folgenden:
<%
Response.Expires=0
Response.AddHeader "Pragma","no-cache"
Response.AddHeader "cache-control", "no-store"
Response.Buffer = True
Id = Request.Form("id")
If id = "" Then
Response.Redirect("default.asp")
Response.End
End If
Session("status")="gewaehlt"
%>
<!-- Datenbank-Verbindung herstellen -->
<!--#include file="strconn.asp"-->
<%
SQL = "UPDATE vote SET anzahl = anzahl + 1 WHERE id = " & id & ""
Conn.Execute(SQL)
Response.Redirect("default.asp")
Zunächst wird geprüft, ob überhaupt eine Webseite angeklickt wurde. Falls nicht (Id ist leer) wird der Benutzer umgehend auf die Umfrage-Seite zurückgeleitet. Enthält "Id" jedoch einen Wert, so wird nach dem Abschalten des Cachings die Verbindung zur Datenbank hergestellt und anschließend der Wert in der Spalte "Anzahl" der Tabelle Vote_Parameter um den Wert 1 erhöht. Außerdem wird die Sessionvariable status auf den Inhalt "gewaehlt" gestellt, was nach der Umleitung auf die Datei default.asp zu den entsprechenden Aktionen führt.
Somit ist auch dieser Teil der Umfrage erklärt und die Umfrage bereits voll einsatzfähig. Allerdings ist es sehr mühselig und auch fehlerträchtig, die Parameter und Einträge in der Datenbank händisch zu erstellen. Was liegt also näher, als eine Administrationsoberfläche zu programmieren, die diese Arbeiten erheblich erleicht?
Da wir bereits im zweiten Teil des Artikels Erstellung eines Newstickers in ASP eine komfortable Administrationssseite erstellt haben, greifen wir auf diese zurück und modifizieren sie entsprechend unseren neuen Anforderungen. Hier zunächst der obere Abschnitt der Administration mit den Einträgen:
Im Vergleich zu der bestehenden Administration wurde der Anzeigeteil leicht modifiziert, so daß nur noch die Datenfelder "Homepage" und "Betreiber" angezeigt werden. Der Code hierzu befindet sich in den Zeilen 116 - 144 der Datei admin.asp. Die genaue Beschreibung zur Technik finden Sie in dem besagten Artikel. Der Test, ob ein Eintrag in der Liste gewählt wurde - mittels JavaScript - bleibt bestehen.
Zunächst wieder das Ergebnis der Anzeige:
Die Administration der Umfrage-Parameter weicht (zumindest optisch) erheblich von der Administration der Newsticker-Parameter ab. So wird jetzt eine Funktion zum Einstellen des Enddatums verwendet. Diese ist uns allerdings bereits bekannt - sie befand sich bisher in der Datei logik.asp in den Zeilen 353 - 395 - einzig der Code zur Anzeige der Stunden und Minuten wurde entfernt. Eine Überprüfung des Datums durch ein JavaScript ist nicht notwendig, da die Verwendung der Dropdown-Felder immer ein Datum produziert.
Die Anzahl der am Ende angezeigten Einträge ist technisch zu behandeln wie die Parameter des Newstickers. Auch die Überprüfung mittels JavaScript gestaltet sich identisch.
Absolut neu hingegen sind die Checkboxen. Diese sind jedoch leicht aus der Datenbank mittels If-Abfragen zu generieren. Ein Beispiel, welches für alle anderen Checkboxen in allen Zuständen gilt, finden Sie in Zeile 229 der Datei admin.asp. Ist der Boolesche Wert in der Datenbank True, wird die Checkbox mit dem Schlüsselwort CHECKED versehen. Falls nicht, bleibt die Checkbox unmarkiert. Eine JavaScript-Prüfung entfällt, da die Entscheidungsfreiheit über markiert oder nicht markiert bei Ihnen liegt.
Ebenfalls neu sind die mehrzeiligen Eingabefelder (Textareas) zur Eingabe der Kopfzeilen. Doch auch deren Umsetzung bereitet uns keine Kopfschmerzen. Wie einfach sich die technische Umsetzung gestaltet, sehen Sie zum Beispiel in der Zeile 250. Auch die JavaScript-Prüfung in den Zeilen 62 - 65 ist kein Hexenwerk mehr.
Somit ist die Anzeige der Einträge sowie Parameter der Umfrage in der Administration bereits abgeschlossen und wir können uns dem Erstellen, Ändern und Löschen der Einträge sowie der Parameter-Änderung widmen.
Das Formular für die Erfassung neuer Homepages für die Umfrage ist auf zwei Felder geschrumpft:
Entsprechend einfach ist der Code geworden, der zur Speicherung der neuen Einträge notwendig ist (Zeilen 99 - 182 in logik.asp) und bei fehlerfreier Eingabe zu folgendem Ergebnis führt:
Ebenso wurden die Befehle für das Ändern und Löschen von Einträgen angepasst. Sie befinden sich in den Zeilen 183 - 324 (ändern und Änderungen speichern) und in den Zeilen 326 - 346 (Löschen von Einträgen).
Der Code (Zeilen 369 - 769) für das Speichern der geänderten Parameter wurde durch die größere Anzahl an Formularfelder etwas umfangreicher - keinesfalls aber schwieriger. Nach dem Einlesen aller Parameter in den Zeilen 6 - 28, werden in den Zeilen 374 - 388 die Checkboxen ausgewertet. Danach werden sämtliche Parameter in der Datenbank upgedatet. Der übrige Code ist nur noch für die Ausgabe der Bestätigung, daß die Daten korrekt gespeichert wurden, zuständig.
Somit sind wir am Ende des Artikels angekommen. Natürlich ist die hier vorgestellte Umfrage beliebig erweiterbar. So könnten Sie daraus zum Beispiel leicht ein Bewertungssystem für Ihre Homepage programmieren. Eine weitere Möglichkeit wäre auch, daß Sie die Umfrage dahingehend erweitern, daß nur eine Wahl je Benutzer getroffen werden kann, sei es durch eine Benutzerverwaltung oder den Einsatz von Cookies.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010417.zip
Caching bei Browser und Proxy - Woher Seiten wirklich kommen
http:/www.aspheute.com/artikel/19990808.htm
Erstellung eines Newstickers in ASP
http:/www.aspheute.com/artikel/20001205.htm
Erstellung eines Newstickers in ASP - Teil 2
http:/www.aspheute.com/artikel/20010209.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.