Elektronický obchod v ASP – správa databáze

10. října 2002

Při cestě za vlastním elektronickým obchodem se tentokrát zastavíme u správy databáze. Přitom nezapomeneme také na zabezpečení administrace.

Zákazníci již mohou z našeho elektronického obchodu úspěšně objednávat. Databázi produktů i kategorií lze upravovat buď ručně (pomocí aplikace MS Access v případě databáze Access nebo pomocí SQL dotazovacího nástroje v případě, že máme databázi umístěnou na MS-SQL Serveru), anebo můžeme databázi produktů a kategorií upravovat pomocí webových stránek s formuláři a skriptů ASP.

Zabezpečení administrace

Aby nebylo administrační rozhraní našeho elektronického obchodu přístupné všem návštěvníkům, je nutné tento systém chránit před neautorizovaným vstupem. O autorizaci vstupu uživatele se bude starat stránka prihlasit.asp. Pro zabezpečení vstupu na vybrané stránky lze použít databázi uživatelů na nějakém databázovém serveru nebo integrované ověřování Windows.

V databázi e-shopu vytvoříme další tabulku Admin (buď na SQL Serveru nebo v databázi Access) – Admin. Struktura tabulky bude vypadat takto:

Název pole Typ MS-SQL Typ Access
ID int aut. číslo
Jmeno char (50) text
Heslo char (50) text

Pro vygenerování tabulky na SQL Serveru můžete použít následující příkaz:

  CREATE TABLE [dbo].[Admin]   (
    [ID] [int] IDENTITY (1,1) NOT NULL ,
    [Jmeno] [char] (50) NOT NULL ,
    [Heslo] [char] (50) NULL ,
  ) ON [PRIMARY]

Nyní již zbývá pouze vytvořit soubor prihlasit.asp, který se postará o samotné přihlášení. Stránka nejdříve zobrazí přihlašovací formulář (formulář bude obsahovat pole přihlašovací jméno a heslo), po odeslání formuláře bude přihlašovací jméno a heslo ověřeno. Po úspěšném přihlášení se změní proměnná Admin v objektu Session, do které se zapíše, že přihlášení bylo úspěšné a načte se stránka admin.asp.

  <!– #include file=“includes/connect.asp“ –>

  <%
    Dim intI, strPrihlasovaciJmeno, strHeslo, intOK, intChyba, strText
    ‚deklarace proměnných

    intChyba = 0

    If Len(Request.Form(„submit“)) > 0 Then
    ‚v případě, že formulář byl odeslán, zkontroluj údaje

      strPrihlasovaciJmeno = LCase(Request.Form(„jmeno“))
      ‚načti přihlašovací jméno (změna na malá písmena)
      strHeslo = LCase(Request.Form(„heslo“))
      ‚načti heslo (změna na malá písmena)

      intOK = 0
      ‚inicializace proměnné

      PripojDatabazi
      ‚připoj zdroj dat

      Set objData = objDatabaze.Execute(„SELECT id FROM Admin WHERE jmeno='“ & strPrihlasovaciJmeno & „‚ AND heslo='“ & strHeslo & „‚“)
      ‚najdi v databázi příslušný záznam

      If not objData.EOF Then intOK = 1
      ‚byl záznam nalezen?

      OdpojDatabazi

      If intOK = 1 Then

        intChyba = 0
        Session(„Admin“) = 1
        Session(„AdminName“) = strPrihlasovaciJmeno

        Response.Redirect(„admin.asp“)

      Else

        intChyba = 1
        ‚při přihlašování nastala chyba

      End If

    End If

    ‚Zobraz formulář

    If intChyba = 1 Then

      Response.Write(„<b>Chybné přihlašovací údaje!</b>“)

    End If

    strText = „<form action=’prihlasit.asp‘ method=’post‘>“
    strText = strText & „<b>Přihlašovací jméno:</b> <input type=’text‘ name=’jmeno‘><br>“
    strText = strText & „<b>Heslo:</b> <input type=’password‘ name=’heslo‘><br>“
    strText = strText & „<input type=’submit‘ name=’submit‘ value=’Přihlásit‘>“
    strText = strText & „</form>“
    Response.Write(strText)
  %>

Správa databází – admin.asp

Nyní přejdeme k samotné správě produktů a kategorií. O veškerou správu se bude starat jediná stránka admin.asp. Činnost, kterou bude stránka provádět, budeme rozlišovat pomocí proměnné intExec, kterou budeme vždy předávat při dalším zobrazení. Hodnoty proměnné intExec:

Hodnota Akce
0 Zobrazení možností
1 Odhlášení
2 Přehled kategorií
3 Přidat kategorii
4 Upravit kategorii
5 Vymazat kategorii
6 Přehled produktů
7 Přidat produkt
8 Upravit produkt
9 Vymazat produkt

Na začátek stránky vložíme soubor connect.asp:

<!-- #include file="includes/connect.asp" -->

Poté bude následovat kód stránky. Na začátku kódu je kontrola, jestli je uživatel přihlášen. V případě, že není, je přesměrován na přihlašovací stránku.

  <%
    Dim intExec, objData, intId, intNadrazena, strNazev, strPopis, strVyrobce, intKategorie, intCena, intDPH, intSleva, intProdavat, strText
    ‚deklarace proměnných

    If not Session(„Admin“) = 1 and Len(Session(„AdminName“)) > 0 Then Response.Redirect(„prihlasit.asp“)
    ‚kontrola přihlášení uživatele

    intExec = Request.QueryString(„exec“)
    ‚načtení akce z adresy

    Select Case intExec
    Case 1
    ‚odhlášení

      Session(„Admin“) = 0
      Session(„AdminName“) = „“

      Response.Redirect(„default.html“)

    Case 2
    ‚přehled kategorií

      PripojDatabazi
      ‚připojit databázi

      Set objData = objDatabaze.Execute(„SELECT id, nazev FROM Kategorie“)
      ‚získej data z databáze

      strText = „“

      do while not objData.EOF
      ‚pro všechny záznamy

        strText = strText & „<a href=’admin.asp?exec=4&id=“ & objData(„id“) & „‚>Upravit</a>   <a href=’admin.asp?exec=5&id=“ & objData(„id“) & „‚>Vymazat</a>   “ & Trim(objData(„nazev“)) & „<br>“
        ‚vypiš

        objData.MoveNext
        ‚posuň se o záznam dál

      loop

      objData.Close
      Set objData = nothing
      ‚uzavření zdroje dat

      strText = strText & „<br><br><a href=’admin.asp?exec=3′>Přidat kategorii</a>“

      strText = strText & „<br><br><a href=’admin.asp‘>Zpět</a>“

      OdpojDatabazi
      ‚odpojení databáze

      Response.Write(strText)

    Case 3
    ‚přidat kategorii

    If Len(Request.Form(„submit“)) > 0 Then
    ‚v případě, že formulář byl odeslán

      intNadrazena = CInt(Request.Form(„id“))
      strNazev = Request.Form(„nazev“)
      strPopis = Request.Form(„popis“)
      ‚načti hodnoty z formuláře

      PripojDatabazi

      objDatabaze.Execute(„INSERT INTO Kategorie (nazev, popis, nadrazena) VALUES (‚“ & strNazev & „‚, ‚“ & strPopis & „‚, “ & intNadrazena & „)“)
      ‚vlož do databáze

      OdpojDatabazi

      strText = „Kategorie byla přidána!<br><br><a href=’admin.asp?exec=2′>Zpět</a>“

    Else
    ‚jinak zobraz formulář

      strText = „<form action=’admin.asp?exec=3′ method=’post‘>“
      strText = strText & „<b>Název:</b> <input type=’text‘ name=’nazev‘><br>)
      strText = strText & „<b>ID nadřazené kategorie:</b> <input type=’text‘ name=’id‘><br>“
      strText = strText & „<b>Popis:</b> <input type=’text‘ name=’popis‘><br>“
      strText = strText & „<input type=’submit‘ name=’submit‘ value=’Přidat‘>“
      strText = strText & „</form>“
      ‚zobraz formulář

      PripojDatabazi
      ‚připojit databázi

      Set objData = objDatabaze.Execute(„SELECT id, nazev FROM Kategorie“)
      ‚získej data z databáze

      do while not objData.EOF
      ‚pro všechny záznamy

        strText = strText & Trim(objData(„nazev“)) & “ – ID: “ & objData(„id“) & „<br>“
        ‚vypiš

        objData.MoveNext
        ‚posuň se o záznam dál

      loop

      objData.Close
      Set objData = nothing
      ‚uzavření zdroje dat

      strText = strText & „<br><br><a href=’admin.asp?exec=2′>Zpět</a>“

      OdpojDatabazi
      ‚odpojení databáze

    End If

    Response.Write(strText)

    Case 4
    ‚upravit kategorii

    If Len(Request.Form(„submit“)) > 0 Then
    ‚v případě, že formulář byl odeslán

      intNadrazena = CInt(Request.Form(„nadrazena“))
      strNazev = Request.Form(„nazev“)
      strPopis = Request.Form(„popis“)
      intId = Request.Form(„id“)
      ‚načti hodnoty z formuláře

      PripojDatabazi

      objDatabaze.Execute(„UPDATE Kategorie SET nazev='“ & strNazev & „‚, popis='“ & strPopis & „‚, nadrazena=“ & intNadrazena & “ WHERE id=“ & intId)
      ‚uprav v databáze

      OdpojDatabazi

      strText = „Kategorie byla upravena!<br><br><a href=’admin.asp?exec=2′>Zpět</a>“

    Else
    ‚jinak zobraz formulář

      intId = Request.QueryString(„id“)
      ‚načtení id kategorie

      If CInt(intId) > 0 Then

        PripojDatabazi
        ‚připojit databázi

        Set objData = objDatabaze.Execute(„SELECT nazev, popis, nadrazena FROM Kategorie WHERE id=“ & intId)
        ‚získej data z databáze

        intNadrazena = CInt(objData(„nadrazena“))
        strNazev = Trim(objData(„nazev“))
        strPopis = Trim(objData(„popis“))
        ‚načti hodnoty z databáze

        objData.Close
        Set objData = nothing
        ‚uzavření zdroje dat

        strText = „<form action=’admin.asp?exec=4′ method=’post‘>“
        strText = strText & „<b>Název:</b> <input type=’text‘ name=’nazev‘ value='“ & strNazev & „‚><br>“
        strText = strText & „<b>ID nadřazené kategorie:</b> <input type=’text‘ name=’nadrazena‘ value='“ & intNadrazena & „‚><br>“
        strText = strText & „<b>Popis:</b> <input type=’text‘ name=’popis‘ value='“ & strPopis & „‚><br>“
        strText = strText & „<input type=’hidden‘ name=’id‘ value='“ & intId & „‚>“
        strText = strText & „<input type=’submit‘ name=’submit‘ value=’Upravit‘>“
        strText = strText & „</form>“
        ‚zobraz formulář

        Set objData = objDatabaze.Execute(„SELECT id, nazev FROM Kategorie“)
        ‚získej data z databáze

        do while not objData.EOF
        ‚pro všechny záznamy

          strText = strText & Trim(objData(„nazev“)) & “ – ID: “ & objData(„id“) & „<br>“
          ‚vypiš

          objData.MoveNext
          ‚posuň se o záznam dál

        loop

        objData.Close
        Set objData = nothing
        ‚uzavření zdroje dat

        strText = strText & „<br><br><a href=’admin.asp?exec=2′>Zpět</a>“

        OdpojDatabazi
        ‚odpojení databáze

      End If

    End If

    Response.Write(strText)

    Case 5
    ‚vymazat kategorii

      intId = Request.QueryString(„id“)
      ‚načtení id kategorie, která se má vymazat

      If CInt(intId) > 0 Then

        PripojDatabazi
        ‚připoj zdroj dat

        objDatabaze.Execute(„DELETE FROM Kategorie WHERE id=“ & intId)
        ‚vymaž kategorii

        OdpojDatabazi
        ‚odpoj zdroj dat

        strText = „Kategorie byla vymazána!<br><br><a href=’admin.asp?exec=2′>Zpět</a>“s
      End If

      Response.Write(strText)

    Case 6
    ‚přehled produktů

      PripojDatabazi
      ‚připojit databázi

      Set objData = objDatabaze.Execute(„SELECT id, nazev, vyrobce FROM Produkty“)
      ‚získej data z tabulky Produkty

      do while not objData.EOF
      ‚pro každý záznam

        strText = strText & „<a href=’admin.asp?exec=8&id=“ & objData(„id“) & „‚>Upravit</a>   <a href=’admin.asp?exec=9&id=“ & objData(„id“) & „‚>Vymazat</a>   “ & Trim(objData(„nazev“)) & “ (“ & Trim(objData(„vyrobce“)) & „)<br>“
        ‚vypiš

        objData.MoveNext
        ‚další záznam

      loop

      objData.Close
      Set objData = nothing
      ‚uzavření zdroje dat

      strText = strText & „<br><br><a href=’admin.asp?exec=7′>Přidat produkt</a>“

      strText = strText & „<br><br><a href=’admin.asp‘>Zpět</a>“

      OdpojDatabazi
      ‚odpojení databaze

      Response.Write(strText)

    Case 7
    ‚přidat produkt

      If Len(Request.Form(„submit“)) > 0 Then
      ‚v případě, že formulář byl odeslán

        strNazev = Request.Form(„nazev“)
        strVyrobce = Request.Form(„vyrobce“)
        intKategorie = CInt(Request.Form(„kategorie“))
        strPopis = Request.Form(„popis“)
        intCena = CInt(Request.Form(„cena“))
        intDPH = CInt(Request.Form(„dph“))
        intSleva = CInt(Request.Form(„sleva“))
        intProdavat = CInt(Request.Form(„prodavat“))
        ‚načti hodnoty z formuláře

        PripojDatabazi

        objDatabaze.Execute(„INSERT INTO Produkty (nazev, vyrobce, kategorie, popis, cena, dph, sleva, prodavat) VALUES (‚“ & strNazev & „‚, ‚“ & strVyrobce & „‚, “ & intKategorie & „, ‚“ & strPopis & „‚, “ & intCena & „, “ & intDPH & „, “ & intSleva & „, “ & intProdavat & „)“)
        ‚vlož do databáze

        OdpojDatabazi

        strText = „Produkt byl přidán!<br><br><a href=’admin.asp?exec=6′>Zpět</a>“

      Else
      ‚jinak zobraz formulář

        strText = „<form action=’admin.asp?exec=7′ method=’post‘>“
        strText = strText & „<b>Název:</b> <input type=’text‘ name=’nazev‘><br>“
        strText = strText & „<b>Výrobce:</b> <input type=’text‘ name=’vyrobce‘><br>“
        strText = strText & „<b>Kategorie:</b> <input type=’text‘ name=’kategorie‘><br>“
        strText = strText & „<b>Popis:</b> <input type=’text‘ name=’popis‘><br>“
        strText = strText & „<b>Cena:</b> <input type=’text‘ name=’cena‘> Kč<br>“
        strText = strText & „<b>DPH:</b> <input type=’text‘ name=’dph‘> %<br>“
        strText = strText & „<b>Sleva:</b> <input type=’text‘ name=’sleva‘> %<br>“
        strText = strText & „<b>Prodavat:</b> <input type=’checkbox‘ name=’prodavat‘ value=’1′><br>“
        strText = strText & „<input type=’submit‘ name=’submit‘ value=’Přidat‘>“
        strText = strText & „</form>“
        ‚zobraz formulář

        PripojDatabazi
        ‚připojit databázi

        Set objData = objDatabaze.Execute(„SELECT id, nazev FROM Kategorie“)
        ‚získej data z databáze

        do while not objData.EOF
        ‚pro všechny záznamy

          strText = strText & Trim(objData(„nazev“)) & “ – ID: “ & objData(„id“) & „<br>“
          ‚vypiš

          objData.MoveNext
          ‚posuň se o záznam dál

        loop

        objData.Close
        Set objData = nothing
        ‚uzavření zdroje dat

        strText = strText & „<br><br><a href=’admin.asp?exec=6′>Zpět</a>“

        OdpojDatabazi
        ‚odpojení databáze

      End If

      Response.Write(strText)

    Case 8
    ‚upravit produkt

    If Len(Request.Form(„submit“)) > 0 Then
    ‚v případě, že formulář byl odeslán

      strNazev = Request.Form(„nazev“)
      strVyrobce = Request.Form(„vyrobce“)
      intKategorie = CInt(Request.Form(„kategorie“))
      strPopis = Request.Form(„popis“)
      intCena = CInt(Request.Form(„cena“))
      intDPH = CInt(Request.Form(„dph“))
      intSleva = CInt(Request.Form(„sleva“))
      intProdavat = CInt(Request.Form(„prodavat“))
      intId = CInt(Request.Form(„id“))
      ‚načti hodnoty z formuláře

      PripojDatabazi

      objDatabaze.Execute(„UPDATE Produkty SET nazev='“ & strNazev & „‚, vyrobce='“ & strVyrobce & „‚, kategorie=“ & intKategorie & „, popis='“ & strPopis & „‚, cena=“ & intCena & „, dph=“ & intDPH & „, sleva=“ & intSleva & „, prodavat=“ & intProdavat & “ WHERE id=“ & intId)
      ‚uprav v databázi

      OdpojDatabazi

      strText = „Produkt byl upraven!<br><br><a href=’admin.asp?exec=6′>Zpět</a>“

    Else
    ‚jinak zobraz formulář

      intId = Request.QueryString(„id“)
      ‚načtení id produktu

      If CInt(intId) > 0 Then

        PripojDatabazi
        ‚připojit databázi

        Set objData = objDatabaze.Execute(„SELECT nazev, vyrobce, kategorie, popis, cena, dph, sleva, prodavat FROM Produkty WHERE id=“ & intId)
        ‚získej data z databáze

        strNazev = Trim(objData(„nazev“))
        strVyrobce = Trim(objData(„vyrobce“))
        intKategorie = CInt(objData(„kategorie“))
        strPopis = Trim(objData(„popis“))
        intCena = CInt(objData(„cena“))
        intDPH = CInt(objData(„dph“))
        intSleva = CInt(objData(„sleva“))
        intProdavat = CInt(objData(„prodavat“))
        ‚načti hodnoty z formuláře

        objData.Close
        Set objData = nothing
        ‚uzavření zdroje dat

        strText = „<form action=’admin.asp?exec=8′ method=’post‘>“
        strText = strText & „<b>Název:</b> <input type=’text‘ name=’nazev‘ value='“ & strNazev & „‚><br>“
        strText = strText & „<b>Výrobce:</b> <input type=’text‘ name=’vyrobce‘ value='“ & strVyrobce & „‚><br>“
        strText = strText & „<b>Kategorie:</b> <input type=’text‘ name=’kategorie‘ value='“ & intKategorie & „‚><br>“
        strText = strText & „<b>Popis:</b> <input type=’text‘ name=’popis‘ value='“ & strPopis & „‚><br>“
        strText = strText & „<b>Cena:</b> <input type=’text‘ name=’cena‘ value='“ & intCena & „‚> Kč<br>“
        strText = strText & „<b>DPH:</b> <input type=’text‘ name=’dph‘ value='“ & intDPH & „‚> %<br>“
        strText = strText & „<b>Sleva:</b> <input type=’text‘ name=’sleva‘ value='“ & intSleva & „‚> %<br>“
        If intProdavat = true Then
          strText = strText & „<b>Prodavat:</b> <input type=’checkbox‘ name=’prodavat‘ value=’1′ checked><br>“
        Else
          strText = strText & „<b>Prodavat:</b> <input type=’checkbox‘ name=’prodavat‘ value=’1′><br>“
        End If
        strText = strText & „<input type=’hidden‘ name=’id‘ value='“ & intId & „‚>“
        strText = strText & „<input type=’submit‘ name=’submit‘ value=’Upravit‘>“
        strText = strText & „</form>“
        ‚zobraz formulář

        Set objData = objDatabaze.Execute(„SELECT id, nazev FROM Kategorie“)
        ‚získej data z databáze

        do while not objData.EOF
        ‚pro všechny záznamy

          strText = strText & Trim(objData(„nazev“)) & “ – ID: “ & objData(„id“) & „<br>“
          ‚vypiš

          objData.MoveNext
          ‚posuň se o záznam dál

        loop

        objData.Close
        Set objData = nothing
        ‚uzavření zdroje dat

        strText = strText & „<br><br><a href=’admin.asp?exec=6′>Zpět</a>“

        OdpojDatabazi
        ‚odpojení databáze

      End If

    End If

      Response.Write(strText)

    Case 9
    ‚vymazat produkt

      intId = Request.QueryString(„id“)
      ‚načtení id produktu

      If CInt(intId) > 0 Then

        PripojDatabazi

        objDatabaze.Execute(„DELETE FROM Produkty WHERE id=“ & intId)
        ‚vymaž produkt

        OdpojDatabazi

        strText = „Produkt byl vymazán!<br><br><a href=’admin.asp?exec=6′>Zpět</a>“

      End If

      Response.Write(strText)

    Case Else
    ‚přehled možností

      strText = „<a href=’admin.asp?exec=2′>Přehled kategorií</a><br>“
      strText = strText & „<a href=’admin.asp?exec=6′>Přehled produktů</a><br><br>“
      strText = strText & „<a href=’admin.asp?exec=1′>Odhlásit</a><br>“

      Response.Write(strText)

    End Select
%>

Nakonec si můžete stáhnout zdrojové kódy a ukázkový e-shop.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Další článek Toulky po webu 10.
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *