Byte av inriktning

Tog mig tid att fräscha upp bloggen idag med ny installation av WordPress och rensa lite spretande innehåll. Den har sett bättre dagar, men den har förmodligen även sett sämre.

Har på senare tid bytt inriktning och börjat skriva texter, artiklar, bloggposter – content – via Svenska texter. Det har inte pågått speciellt länge, men runt 15 000 ord har levererats och ungefär lika mycket ligger väntandes. Det är en helt okej sysselsättning, sommartid exceptionellt trevlig för en nomad-wannabe, men en bra beläggning med god framförhållning är A och O för att det ska vara värt det.

Sammantaget för de fyra kunder jag haft hittills är att de uttryckligen varit väldigt nöjda med de texter som har levererats, inte minst leveranstiden som ibland varit så kort som en timme. Det förutsätter givetvis att beläggningen är låg och det är förståeligt nog inte vad jag eftersträvar i långa loppet. Därför kommer jag även erbjuda möjligheten att köpa färdigskrivna artiklar, d. v. s. texter som skrivits utan att någon beställning lagts. Texterna är ofta inriktade på affiliatenischer och kommer länkas i högerkant här på bloggen från Svenska texter. Syns de, är de fortfarande till salu.

Underkläder på nätet

Jag blev häromdagen varse om att jag i ett, vad jag förmodar, svagt ögonblick lagt in ett önskemål om att registrera två domännamn på temat kvinnliga underkläder när dessa släpptes fria. Det verkade inte bättre än att registreringarna även gick igenom och genast satte tankeverksamheten igång för att försöka dra nytta av domännamnen.

Efter att ha kollat igenom utbudet av webbutiker som erbjuder underkläder på nätet fastnade jag framförallt för svenska Adrecord och deras lösning YourAd, som låter mig välja vilka produkter jag vill fronta med bild och pris från annonsören.

Ett mycket slagkraftigt annonselement där man kan välja produkter fritt efter eget tycke. Nu visade det sig att Adrecord hade avtal med en mycket passande annonsör i form av Underkläder.se, som jag valt att använda på nya affiliatesidor.

Allt blir så mycket enklare när det finns så hårt nischade annonsörer. Testa du också! ;-)

Kays domännamn

I am Kay skulle jag kanske presentera mig med, om jag bodde i St. Tropez eller Sunny Beach. I [såld] skulle det nog uppfattas som namnet på något [såld]-[såld]. Här från min [såld] i hemmet märks inte mycket av det stadsliv som pulserar utanför.  [såld] från Spotify överröstar sorlet. Nån självutnämnd talang försöker covra Hallelujahfagott och hade jag haft chansen skulle jag tipsa om att byta genre till Nirvana, Coldplay eller rent av Lily Allen (lily låter som att det skulle kunna betyda gredelin på engelska).  Istället tvingas jag leta igenom all [såld] för närmsta [såld]. [såld], står det med stora bokstäver. Jag skulle tippa på att de bakat in det i produktpriset i slutändan, så jag tar upp min iPhone 3GS.

Till helgen planerar jag utgång. Jag har kollat med alla hotell ifall de har något [såld], men icke. Tanken slog mig att det kanske finns nån bytesplats för mat, precis som det finns för [såld] i form av second-hand. Det låter dock inte tillräckligt top notch med [såld] av gammal mat. Jag får istället inrikta mig på att försöka hamna på lite kändisbilder – kort och gott pictures som de säger utomlands – men nu bodde jag varesig i [såld] eller [såld], så vi fortsätter att hålla oss till svenska.

Nya vinyl- & LP-skivor i Göteborg

Har lite sporadiskt börjat samla på LP-/vinylskivor och då främst limiterade, signerade eller på annat vis utstickande utgåvor. Inledningsvis har jag enbart kikat på svenska nysläpp, men när man lär sig vad som är eftertraktat kommer man säkert att vidga vyerna. Tänkte nu utan förbehåll bjuda på lite länkkärlek, bl.a. till två ytterst trevliga butiker i Göteborg.

Bengans – Stigbergstorget, Göteborg. Ofta artistbesök i butiken, vilket gör att utbudet av signerade alster ofta är vidsträckt.

Rockhouse – Kungsgatan, Göteborg med lagerstatus i realtid, vilket gör att man lätt kan kila dit för impulshandel. Dessutom trevlig, serviceinriktad personal.

Hot Stuff – Mycket angenäm nätbutik med ett gigantiskt utbud av både svenska och utländska släpp.

Dolores Recordings – Göteborgsbaserat skivbolag som även inhyser en singelklubb där vinylskivor skickas hem i brevlådan några gånger per år. Är medlem, men har inte fått min första försändelse ännu.

Drella.com – Merchandise i form av t-shirts och skivor. Har haft en del limiterade släpp i sin webbshop, så att hålla ett öga där lönar sig garanterat.

Förmodligen har man till en början mer att hämta på begagnatmarknaden, men det kräver förstås bra mycket mer research för att skilja dussinskivorna från godbitarna – och där är jag som sagt inte riktigt ännu.

Hur man gör en webbshop i ASP (del 3)

Detta är tredje delen i artikelserien om hur man bygger en webbshop i ASP från grunden. Har du missat de tidigare delarna finns de här: Hur man gör en webbshop i ASP (del 1) och Hur man gör en webbshop i ASP (del 2). Vår webbshop hämtar nu kategorierna från databasen och länkar dem enligt default.asp?kategori=[ID]. Vi vill självklart visa produkterna under kategorisidorna och det är vad denna del kommer avhandla.

Vi har nu unika länkar som alla skiljer sig åt på en punkt – ID-numret i länken. Logiskt sätt måste vi använda oss av denna siffra för att kunna ta fram produkter som i databasen har samma siffra i fältet “intKategoriID” eftersom de tillhör den aktuella kategorin. Siffran i länken kan man skriva ut på sidan genom:

<% Response.Write Server.HTMLEncode(Request.QueryString("kategori")) %>

Oj, tänker ni kanske. Det var omständigt. Måste allt det där finnas med? Svaret är både ja och nej. Till en början använder vi oss av Response.Write, funktionen för att skriva ut något med hjälp av ASP-kod. Request.QueryString("kategori") innehåller värdet av “kategori=[ID]” i länken, dvs 1 eller 2 etc. Ett sista steg är att kapsla in QueryString-värdet med funktionen Server.HTMLEncode() som som sagt gör att eventuell  HTML-kod skrivs ut i klartext. Det är nödvändigt eftersom det annars är lätt för elakartade besökare att knappra in exempelvis denna länk: default.asp?kategori=<script src="elakt-script.js"> som vid utskrift då skriver ut och kör javascriptet “elakt-script.js”, och det är aldrig att rekommendera. Det kan ge fel personer kontroll över er webbshop.

Vi vill dock inte skriva ut värdet just nu. Vi vill bara använda oss av det i vår SQL-sträng för att sålla ut så enbart rader där intKategoriID = Request.QueryString("kategori") finns med. Vi förflyttar oss således till main-sektionen i default.asp och skriver följande:

<% Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={MySQL ODBC 3.51 Driver};Server=" & strMySQLServer & ";port=" & strMySQLPort & ";Database=" & strMySQLDatabase & ";User=" & strMySQLUsername & ";Password=" & strMySQLPassword & ";"

Vår SQL-sträng måste vi skriva om enligt innan nämnda frågeutformning – vi vill ta fram alla rader från tabellen produkter där intKategoriID är samma som Request.QueryString(“kategori”)

SQL = "SELECT ID, intKategoriID, strProdukt, strProduktBeskrivning, intPris FROM produkter WHERE intKategoriID = " & strip(Request.QueryString("kategori")) & " ORDER BY strProdukt"

Vad är då funktionen strip() för något? När man använder sig av variabler i sina SQL-strängar är det väldigt viktigt att man först säkerställer att inte vad som helst skickas med. I detta fallet vill vi enbart ha en siffra, men om man är elakartad besökare kan man genom att manipulera Request.QueryString(“kategori”) i värsta fall rasera hela databasen. strip() är en egenutvecklad funktion som helt sonika förmildrar riskerna med att drabbas av ondsinta inputs i SQL-strängen. Detta genom att ersätta alla enkelfnuttar ‘ med ” (två enkelfnuttar). Kopiera funktionen nedanför och klistra in näst längst upp i default.asp, under inkluderingen av settings.asp:

<% Function strip(input)
retVal = replace(input, "'", "''")
strip = retVal
End Function %>

Åter till databaskopplingen. Vi fortsätter med att exekvera vår SQL-sträng.

Set RS = Conn.Execute(SQL)

Sen följer samma tillvägagångssätt som för kategorierna. Vi kollar ifall det hittas några produkter. Ifall så inte är fallet skrivs det ut att “Inga produkter hittas”. I annat fall skrivs produkterna ut, nu sorterade efter produktnamn (strProdukt, se SQL-strängen ovan)

If RS.EOF Then
Response.Write "Inga produkter hittades"
Else
Do Until RS.EOF %>
<a href="default.asp?produkt=<%=Server.HTMLEncode(RS("ID"))%>"><%=Server.HTMLEncode(RS("strProdukt"))%></a>, <%=Server.HTMLEncode(RS("intPris"))%> kr<br>
<% RS.MoveNext
Loop
End if
Set RS = Nothing
Set Conn = Nothing %>

Varje produkt länkas nu till default.asp?produkt=[ID] och då vill vi självklart visa produktinformationen när man klickar på länken. Detta har gjort att vi vill visa olika information på samma yta (main-sektionen) och vi behöver således kolla med en IF-sats vilken sida det är som visar för stunden. Detta görs genom att lägga in en enklare IF-sats i main-sektionen.

<% If Request.QueryString("kategori") <> "" Then
kod för visning av kategori

ElseIf Request.QueryString("produkt") <> "" Then
kod för visning av produkt

Else
kod som visas när ingen kategori eller produkt är vald

End if %>

Vi går igenom hur det funkar. Först kollas ifall Request.QueryString(“kategori”) har ett värde som är annat än “” (tom). Ifall det finns ett värde på kategori i länken (dvs. om vi har klickat på en kategorilänk) så skall koden nedanför skrivas ut. Det samma gäller för nästa steg, men här kollas ifall Request.QueryString(“produkt”) har ett värde som är annat än “” (tom). Slutligen, ifall båda dessa värden var tomma visas det som finns under Else, som är sista anhalten om inget annat villkor uppfyllts. Vad vi alltså gjort är att vi delat upp ett litet segment på sidan till att visa olika information beroende på vilken variabel i länken som har ett värde. Detta gör att det dynamiskt skapas nya sidor efter hur länkadressen ser ut, istället för att man manuellt ska sitta och skapa produkt1.html, produkt2.html och så vidare.

Denna IF-sats skall ligga precis under <div id=”main”> och bör sluta precis innan </div> för samma maindiv-tagg. Klistra sedan in den kod som vi skrivit hittills under rätt villkor för att rätt information skall visas på rätt ställe. Den kodsnutt med databashämtning för produkter under kategorisidan skall alltså ersätta “kod för visning av kategori”. Var noga med att <% och %> är rätt till antalet. <% signalerar början på ASP-kod och %> påvisar att ett block med ASP-kod avslutas. Man kan inte ha två öppna <%, utan måste alltid avsluta de öppna taggarna med %>. Låter det knepigt? Ladda hem filerna, så klarnar det säkert!

Vi går nu vidare och skapar produktinformationssidan som man kommer till när man har klickat på en produktlänk, ex. default.asp?produkt=1. Det är precis samma sätt som innan. Skapa en databaskoppling, fundera över vilken relation vi har mellan den siffra vi får med oss i länken och vad som finns angivet i databasen, skriv SQL-strängen, exekvera, kolla antal resultat och skriv ut resultat beroende på antal och stäng slutligen databasanslutningen. Så här:

<% Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={MySQL ODBC 3.51 Driver};Server=" & strMySQLServer & ";port=" & strMySQLPort & ";Database=" & strMySQLDatabase & ";User=" & strMySQLUsername & ";Password=" & strMySQLPassword & ";"

SQL = "SELECT ID, intKategoriID, strProdukt, strProduktBeskrivning, intPris FROM butik_produkter WHERE ID = " & strip(Request.QueryString("produkt"))

Vi väljer att ta fram den information som finns i databasen om produkten som har det ID-nummer som återfinns i länken (default.asp?produkt=1). Eftersom ID var av typen auto_increment, automatiskt ökande värde för varje rad som läggs in, riskerar vi inte att få fler svar än en (1) rad från databasen. Eller noll (0) – ifall vi exempelvis manuellt skrivit in ID 1452 i länken och produkten inte existerar. Vi kommer således nu undan med mindre kod, eftersom det inte finns någon anledning att vilja loopa ut något. Antingen är det en rad eller så är det ingen, så att begära att gå till nästa rad och skriva ut denna är en situation som inte uppstår. Vi fortsätter hur som helst med att exekvera SQL-strängen och sen bör resten vara rätt självförklarande.

Set RS = Conn.Execute(SQL)
If RS.EOF Then
Response.Write "Produkten hittades inte"
Else %>
<h1><%=Server.HTMLEncode(RS("strProdukt"))%></h1>
<p><%=Server.HTMLEncode(RS("strProduktBeskrivning"))%></p>
<h2><%=Server.HTMLEncode(RS("intPris"))%> kr</h2>
<a href="default.asp?kop=<%=Server.HTMLEncode(RS("ID"))%>">Lägg i varukorgen</a>
<% End if
Set RS = Nothing
Set Conn = Nothing %>

Vi har nu skrivit ut produktnamn med <h1>-tagg, produktbeskrivning som textstycke, pris som <h2>-tagg och slutligen lagt in en länk som i framtiden är ämnad att lägga till varan i varukorgen. Och det är just precis vad som avhandlas i nästa steg av denna guide, så ladda hem filerna (1 kb) och dubbelkolla innan du skyndar dig vidare till nästa del.

Hur man gör en webbshop i ASP (del 2)

Detta är en artikelserie om hur man själv skapar en webbshop i ASP från grunden. I förra delen av denna artikelserie gick vi igenom vad som krävs av webbhotellet, hur man sätter upp databas- och tabellstrukturen för webbshopen och vi avslutade med att lägga till två kategorier; Kategori 1 och Kategori 2 ihop med två produkter; Produkt 1 och Produkt 2 som båda placerades i Kategori 1 (ID: 1).

Missade ni första delen finns den att tillgå här: Hur man gör en webbshop i ASP (del 1)

Nästa steg är att lägga upp en enklare designstruktur för sidan.


<html>
<head>
<title></title>
<style type="text/css">

#logotype {
float: left;
height: 100px;
width: 760px;
}

#menu {
float: left;
width: 150px;
}

#main {
float: left;
width: 610px;
}

.long {
float: left;
width: 760px;
}

.wrap {
clear: both;
float: left;
}

</style>
</head>
<body>
<div class="wrap long">
<div id="logotype"></div>
<div id="menu"></div>
<div id="main"></div>
</div>
</body>
</html>

Kopiera koden ovanför och spara som default.asp. Detta webbshopsskript kommer utgå ifrån denna fil och det mesta kommer ligga i den, så när som på inställningar för databaskopplingar och funktioner för att validera data etc

Inställningar för databaskoppling

Skriptet behöver veta adressen och portnummer till databasservern, vilket användarnamn och lösenord som har behörighet att ansluta till databasen samt namnet på databasen som innehåller våra tabeller. För att slippa ange denna kritiska information i varje databaskoppling väljer vi att skapa en inställningsfil med variabler för denna information. Skapa en ny fil med följande innehåll och fyll i informationen mellan citationstecknen. Denna information fås av webbhotellet.

<% strMySQLServer = ""
strMySQLPort = ""
strMySQLDatabase = "webXXXXX_webshop"
strMySQLUsername = "webXXXXX"
strMySQLPassword = "**********" %>

Spara den nya filen som settings.asp och lägg till följande rad överst i default.asp för att inkludera filen med inställningarna:

<!--#Include File="settings.asp"-->

Lista kategorier från databasen

För att ta fram kategorierna som vi lagt till i databasen behöver vi göra en databaskoppling. Detta är i regel ingen kod man behöver lägga på minnet, utan man kan kopiera och klistra in från tidigare användningsområden. Det vitala i databaskopplingen är den så kallade SQL-strängen, som anger vilken tabell och vilka fält som skall hämtas. Vi vet att vi vill ansluta till databasen webXXXXX_webshop med användarnamn webXXXXX och lösenord *********, men vi måste även tala om vilken tabell vi vill ansluta till – i detta fall “kategorier” som vi döpte tabellen till. Fälten vi vill hämta ut till en början är ID (det unika ID-numret för varje kategori) och strKategori (namnet på kategorin). Vi lämnar Parent ID (PID) orörd för stunden, men återkommer till det framöver, då det är en onödigt krånglig funktion så här tidigt i detta stadie.

Låt oss börja med inledande databaskopplingen:

<% Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Driver={MySQL ODBC 3.51 Driver};Server=" & strMySQLServer & ";port=" & strMySQLPort & ";Database=" & strMySQLDatabase & ";User=" & strMySQLUsername & ";Password=" & strMySQLPassword & ";"

Det ser krångligt ut och som sagt är det inget som man behöver lägga på minnet. Som synes använder vi de variabler som vi har angett i settings.asp för att slippa skriva informationen i klartext ifall vi av någon anledning råkar skriva fel i skriptet och ASP-koden inklusive lösenord till databasen skrivs ut i klartext. Detta är initierandet av databaskopplingen. Nu kommer vi till SQL-strängen, som ska se ut enligt följande för att lista kategorierna:

SQL = "SELECT ID, strKategori FROM kategorier ORDER BY strKategori"

Här lägger vi SQL-strängen som en variabel. Det är egentligen inte nödvändigt, men det kan vara överskådligare ifall det rör sig om mycket kod runt omkring, då man direkt ser var och vad man kan ändra. Vad gör då denna SQL-sträng? Jo, vi säger åt databasen att ta fram ID och strKategori från tabellen “kategorier” och avslutar med att bestämma vilken ordning vi vill att de skrivs ut i. Anger man inte ordning kommer den sortera efter ID, dvs. den ordning som man lagt in kategorierna i databasen. Vi väljer dock att sortera efter strKategori, vilket gör att när vi nedanför skriver ut de rader vi tagit fram kommer de komma i bokstavsordning.

Nästa steg är att köra SQL-frågan. Innan hade vi enbart deklarerat den. Detta görs genom nedanstående rad, där vi helt sonika ber om att få exekvera SQL-strängen (variabeln SQL nedan) med det databaskopplingsobjekt (Conn) som vi innan skapat:

Set RS = Conn.Execute(SQL)

Anropet är klart. Det är dags att kolla ifall den hittat några rader med fält i tabellen som matchar vår förfrågan. Det finns två möjliga resultat – antingen hittades rader eller så hittades det inga. Vi vill beroende på resultat visa olika saker, ex. “Inga kategorier hittades” eller som i vårt fall, eftersom vi vet med oss att vi lagt in kategorier, skriva ut dem. Med en enkel koll kan vi styra vad som händer för varje tänkbart resultat:

If RS.EOF Then
Response.Write "Inga kategorier hittades"
Else
Do Until RS.EOF %>
<a href="default.asp?kategori=<%=Server.HTMLEncode(RS("ID"))%>"><%=Server.HTMLEncode(RS("strKategori"))%></a><br>
<% RS.MoveNext
Loop
End if
Set RS = Nothing
Set Conn = Nothing %>

Rad 1: Om resultatet av databashämtningen är tomt (EOF – End of File) då (Then)
Rad 2: Skriv ut “Inga kategorier hittades”. Detta görs med ASP-funktionen Response.Write för att skriva ut vanlig text.
Rad 3: Annars (ifall resultatet av databashämtningen inte är tom, dvs att det finns rader som matchade vår SQL-slagning)
Rad 4: “Gör nedanstående tills alla rader är utskrivna”
Rad 5: Här skriver vi ut en länk till kategorin enligt följande mönster: default.asp?kategori=1 och där länktexten blir det som finns i fältet strKategori, dvs. “Kategori 1″ då “Kategori 1″ kommer före “Kategori 2″ när man sorterar efter strKategori-fältet – som vi har gjort i detta exempel. Funktionen Server.HTMLEncode() gör att eventuell HTML-kod som finns i databasfältet inte exekveras, utan istället visas som klartext.
Rad 6: RS.MoveNext säger till att vi nu är klara med denna tabellrad och vill ha nästa rad.
Rad 7: Loop hoppar upp till senaste Do-rad, vilket gör att vi har en ny rad från databasen i pipelinen och att vi genom upphoppet med loopen är redo att behandla den på samma sätt som förra raden, dvs skriva ut en länk baserad på den nya informationen från rad 2
Rad 8: End if avslutar kontrollen om vad som skall göras ifall det finns rader i databasen eller ifall hämtningen var tom. Denna rad nås först efter att alla rader är hämtade från databasen. Var hämtningen tom nås den direkt.
Rad 9 & 10: Vi stänger databaskopplingen

Kopiera in alla fyra kodblock ovanför på det ställe i default.asp där ni vill att kategorierna skall visas, till exempel mellan <div id="menu"> och </div> för att få dem i vänsterkant. Får ni det inte att fungera? Ladda hem filerna (856 bytes) och dubbelkolla så att ni har gjort rätt.

I nästa avsnitt visas hur man med hjälp av kategorilänkarna visar de produkter som är kopplade till de olika kategorierna.

Lägg gärna till feeden för denna blogg i er RSS-läsare, så minimerar ni risken att missa kommande delar i artikelserien. Har ni frågor, funderingar eller tips på förbättringar är ni självklart välkomna att lämna kommentarer på inlägget.

Adwords gav efter lång väntan utdelning

Adwords gav utdelning

Jag har nu tjänat mina första slantar med hjälp av Adwords. Genom att köpa sökord på Google för ett specifikt ämnesområde och vid klick skicka besökaren till min landningssida med säljande text och ett reklamerbjudande har jag nu dragit in mina första – *trumvirvel* – 23 kr. Ingen big business än, men jag är rätt säker på att kampanjen som sådan ligger på plus.

Det gör definitivt inte min andra kampanj, men det har varit stor klickbenägenhet både på Google-annonserna och på min landningssida, så problemet kanske ligger hos butiken ifråga. Efter att ha läst ett antal “666 Killer Strategies to Get the Big Bucks with Adwords” är det även kul att se hur annonser med en viss gnutta psykologi involverad är mer frekvent klickade. I slutändan vet jag inte ifall det är de som sedan klickat på annonsen på landningssidan, men går det att spåra vilken annons de kommer från tar jag tacksamt emot tips!

Hur man gör en webbshop i ASP (del 1)

Inledning

I takt med att fler och fler vågar sig på handel på nätet – både att handla i butiker och viljan att starta egen webbshop – följer här en guide till hur man skapar sin egen webbshop från grunden. Den slutgiltiga produkten kommer bygga på ASP, MySQL, HTML och CSS och finns för nedladdning för varje steg i denna artikelserie.

Välja ett webbhotell

Detta skript kommer köras hos webbhotellet Binero. Privat- eller företagskonto på deras Windows-server fungerar lika bra, och det kan upp- eller nedgraderas när som helst.

När webbhotellet är beställt och ett domännamn är kopplat till kontot är ni redo att ansluta till FTP-servern för att ladda upp filerna. Eftersom det inte finns några filer att ladda upp ännu börjar vi istället med att sätta upp databasstrukturen.

Sätta upp MySQL-databasen

1. Skapa en databas vid namn “webshop”.

2. Gå till www.kontrollpanelen.se och logga in i det nedre formuläret med användarnamn webXXXXX och ert lösenord för anslutning till databasen. Dessa uppgifter finns i det e-postmeddelande som skickats ut av Binero till er när ni beställde webbhotellet. I phpMyAdmin, som är ett visuellt presentationsskal till de databaser som finns under ert konto, väljer ni nu till vänster under rubriken “webXXXXX” att klicka på “_webshop”.

Tabellstruktur

Vi kommer skapa en rad olika tabeller för skriptet, eftersom det är mycket information av varierande sort som ska sparas i databasen när skriptet är fullfjädrat. Man kan alltid gå tillbaks och fylla på med fler tabeller eller ta bort i efterhand. Man kan skapa hur många tabeller som helst och beror i stor grad på hur många funktioner man avser utveckla till skriptet. Vi börjar dock enkelt med två tabeller; kategorier och produkter.

I den högra delen av sidan scrollar ni nu till slutet “Skapa ny tabell i databas webXXXXX_databasnamn“. Skriv i tabellnamnet “kategorier” och välj att tabellen skall ha tre (3) fält.

På sidan som följer finns nu tre kolumner. Vi ska nu specificera vad de olika fälten ska heta och vilken typ av information som avses sparas i fältet.

I första kolumnen under “Fält” skriver ni namnet “ID”. Detta blir namnet på fältet. Varje kategori kommer således få ett eget unikt ID-nummer som enbart identifierar just precis en specifik kategori. Under “Typ” väljer ni i rullistan / drop down-boxen “INT“, vilket betyder integer och avser datatypen heltal. Slutligen måste valet “auto_increment” (automatisk ökning) göras under “Extra” och därefter kryssar ni i den radio button / runda knapp precis under “Extra” som avser “Primary” eller “Primär”. Detta har nu gjort att för varje ny kategori som läggs in i denna tabell, ökar ID-fältet upp sitt värde automatiskt, vilket gör att två kategorier aldrig kan få samma ID-nummer.

Vidare till nästa fält. Ge det namnet “intPID”. Vi kommer i denna guide använda oss av denna form av namngivning av tabellfälten för att lätt kunna avgöra vilken datatyp som lagras i fältet. I detta fall står “int” som innan för integer/heltal, men vad står då PID för? ID känner vi igen sedan innan, så vi kan gissa att det kan vara en återkoppling till föregående fält (“ID”). “P” i “PID” är tänkt att stå för “parent”, dvs. förälder eller tidigare. När man känner till vad en kategori har för Parent ID ges möjligheten att skapa en trädliknande menystruktur med underkategorier till huvudkategorierna. Vi minns att varje kategori automatiskt får ett ID-nummer och kan således i fältet PID ange detta nummer för att berätta att denna kategori är en underkategori till huvudkategorin med ID-numret PID. Det är mycket detta handlar om när man pratar om relationsdatabaser och vi har just naggat lite i kanten på detta vidsträckta område. Var dock lugn, vi kommer inte gå så mycket djupare på det. Vad är då anledningen till att första fältet döptes till ID och inte intID tänker ni då? Det är helt och hållet en smaksak. Prefixen på fältnamnen är till för att hjälpa dig och spelar inte in på funktionaliteten. I regel vet man att det löpnummer som ID utgör är alltid ett heltal och prefixet “int” blir lite overkill.

Fortsätt med att välja datatyp för fältet PID. Även här väljer vi INT i rullisten, då det rör sig om samma datatyp som i ID-fältet innan. Inga fler val skall göras, eftersom detta fält inte ska räkna upp sig självt.

Sista fältet döper vi till “strKategori”, där “str” är kort för “string”. En string är motsatsen till “int” kan man säga, även om MySQL och andra databastyper bjuder på många fler datatyper än så här. Vi kommer dock inte komma i kontakt med andra typer än “int” och strängar i denna guide. Det finns dock ingen datatyp som heter “str”, utan det syftar bara på ett samlingsnamn som förkunnar att fältet innehåller vanlig text. Som datatyp väljer vi istället “VARCHAR”, som troligtvis är förvalt alternativ. I rutan för “Längd/Värden” skall vi ange maxlängd för innehållet i fältet. Ett kategorinamn i en webbshopsmeny är oftast inte så långt, men ta till lite i överkant ändå och välj 250.

Välj nu “Spara”, så skapas tabellen och första steget är klart. Just “Kategorier” är en angenäm tabell att skapa eftersom det inte finns så mycket information att spara ihop med kategorinamnet. Man kan alltid lägga till ett fält för kategoribeskrivning eller kanske ett fält med sökvägen till en kategoriikon, men när denna guide är till ända kommer ni troligtvis kunna lista ut hur ni kan utöka skriptet med fler funktioner på egen hand.

Nästa steg är att göra om proceduren. Klicka på “webXXXXX_webshop (1)” i vänsterkanten och scrolla ner till botten. Döp tabellen till “produkter” och välj att skapa fem (5) fält. Gör om proceduren från ovan genom att lägga till följande fält i tur och ordning med nämnda egenskaper:

  • ID [typ: INT | extra: auto_increment | primär: kryssa i radioknappen ]
  • intKategoriID [typ: INT]
  • strProdukt [typ: VARCHAR | längd: 500 ]
  • strProduktBeskrivning [typ: VARCHAR | längd: 8000 ]
  • intPrice [typ: INT]

Inmatningsförfarandet kommer troligtvis ske på bredden nu eftersom antalet fält överstiger tre, men fälten är de samma, så håll bara tungan rätt i mun och glöm inte bort att välja auto_increment och kryssa i primär (första radioknappen) på ID-fältet

Tabellerna är nu uppsatta och det har blivit dags att lägga till två kategorier och två produkter. Vi börjar med att lägga till kategorierna, eftersom vi behöver veta ID-nummer som automatiskt tilldelas kategorierna innan vi kan lägga in produkterna, så att produkterna blir kopplade till rätt kategori. Det låter logiskt va? :-)

Klicka till vänster på “kategorier” för att komma till tabellen vi skapade först. Till höger väljer ni nu femte menyknappen “Lägg till” och ni kommer till ett formulär för att lägga till rader i tabellen. Troligtvis finns här möjlighet att lägga till två rader direkt. Vi väljer att göra det enligt följande agerande:

  • Lämna ID-fältet tomt. Det ges automatiskt det lägsta möjliga ID-numret.
  • Skriv 0 i intPID. Eftersom det är en huvudkategori har den inget ovanliggande menyalternativ.
  • I strKategori anger ni i klartext vad ni vill att kategorin skall heta. Det är detta som visas i butiken. Vi gör det enkelt för oss och kallar den för “Kategori 1″

Gör nu samma sak i formuläret nedanför, men döp den till “Kategori 2″. Glöm inte att lämna ID-fältet tomt. Tryck sedan på någon av de två nedre “Kör”-knapparna. Vi har nu skapat “Kategori 1″ och “Kategori 2″. Väljer vi “Visa” i menyn ser vi också att två rader har skapats och att ID-nummer för de två raderna har tilldelats; 1 och 2. Eftersom vi sköter inmatningen av data manuellt i databasen och ännu inte via vårt framtida egenutvecklade administrationssystem för webbshopen får vi hålla dessa siffror i minnet när vi nu väljer att gå över till tabellen “produkter” i vänsterkant. Tryck sedan på “Lägg till” och samma inmatningsprincip råder igen.

Nu ska vi mata in produkterna i databasen. Samtidigt vill vi göra kopplingar mellan de två tabeller som vi skapat och väljer således att lämna ID tomt, i intKategoriID skriva 1 (som avser “Kategori 1″), i strProdukt skriva det namn vi vill ha på produkten som visas för kunderna. Vi gör det enkelt även här och väljer det beskrivande namnet “Produkt 1″. i strProduktBeskrivning har vi nu spelrum att skriva en hel novell på 8000 tecken. Vi väljer dock att fatta oss kort och skriver “Produktbeskrivning 1″. I sista fältet, intPrice, kommer vi till det kittlande – vad ska vi ta i pengaväg för klenoden? Vi minns att datatypen sattes till att handska heltal, så ange 79. I framtiden kommer skriptet ha stöd för ören, men nu i början behöver vi inte krångla till det i onödan.

Fyll nu i nedanstående formulär med samma kategori-ID (1), produktnamn “Produkt 2″ och produktbeskrivning “Produktbeskrivning 2″, sätt priset till “1000″ och tryck på “Kör”-knappen. Två produkter har nu lagts till i kategorin “Kategori 1″ och “Kategori 2″ är fortfarande tom.

I nästa del lägger vi upp en enklare design för sidan och tar fram de menyalternativ vi just lagt in i databasen. Lägg gärna till denna blogg i din RSS-läsare. När ni följer feeden riskerar ni inte att missa någon del av denna artikelserie. Har ni frågor eller funderingar är ni givetvis välkomna att lämna en kommentar till denna artikel!

Vad är coreg?

I och med senaste kunduppdraget kom jag i kontakt med en ny term på området affiliatemarknadsföring och webbreklam som jag inte hade hört talas om innan. Termen det gäller är coreg.

Coreg är kort för co-registrations och syftar till att i samma ögonblick som en medlem eller besökare utför en handling på din webbplats – skriver upp sig på din mailinglista, blir medlem på din webbplats eller på annat sätt utför ett så kallat lead – kan även samma information som medlemmen angett användas till att signa upp denne på andra saker.

Det är vanligt förekommande att användaravtal har klausuler om att man godkänner att sidan ifråga eller dess partners tillåts skicka ut e-postmeddelanden i marknadsföringssyften. Ifall sidorna som tillåts skicka ut e-postmeddelande till besökaren inte är sammankopplade mer än genom att de upprättat ett avtal sinsemellan blir coregen bryggan mellan webbplatserna.

I vanliga fall skulle man kunna spara ner informationen och upprätta en databas, för att senare manuellt skicka över informationen till de partners som har rätt att skicka ut e-postmeddelanden i marknadsföringssyfte. En coreg är dock en webbadress eller länk till ett webbskript på en annan server, som genom ett besök tar emot informationen som skickats med och som beroende på skriptet som besöks även kan skicka en så kallad callback - svar – till ett skript på din server.

Ett exempel på en coreg som man kan få från annonsörer hos de olika affiliatebolagen är:

domännamn.se/coreg.asp?firstname=[value]&lastname=[value]&address=[value]&zip=[value]&city=[value] osv.

Detta är en då en webbadress som kräver att vissa utvalda delas byts ut mot den information som besökaren angett. Detta görs kodmässigt i exempelvis ASP med funktionen Replace() och med PHP genom en likvärdig funktion kallad str_replace()

Genom att byta ut “firstname=[value]” mot “firstname=” & Request.Form(“firstname”) med

<% Replace(strCoreg,"firstname=[value]","firstname=" & Request.Form("firstname")) %>

från i det här exemplet, ett formulär och sedan upprepa för alla fälten skulle slutligen coregen se ut enligt följande:

domännamn.se/coreg.asp?firstname=Anna&lastname=Andersson&address=Andra gatan 22&zip=12345&city=Akalla

När allt är utbytt använder man sig av en enkel funktion för att besöka adressen ifråga. Det kan, med hjälp av ASP i detta exempel, åstadkommas genom att anropa den med nedanstående rader kod, där variabeln strCoreg innehåller webbadressen att besöka:

GotothisURL = strCoreg
Set Conn = CreateObject("Microsoft.XMLHTTP")
Conn.Open "get", GotothisURL, False
Conn.Send
Set Conn = Nothing

Skriptet som besöks bör sedan plocka ut och spara informationen i sin databas. Ifall anledningen av användande av coreg varit att skicka nya leads till den besökta coreg-webbplatsen bör även ett identifierbart värde bifogas i coregen för att mottagande webbskript skall veta varifrån det aktuella leadet härstammar ifrån. Det görs genom att lägga på exempelvis &PublisherID=unikt värde på coregen och att det i det mottagande skriptet som anropas via coregen finns angivet att just detta unika värde tillhör dig.

Tar man det steget längre kan det ihop med detta unika id finnas en callback-adress (adress till skript på din server) angiven hos annonsören som det besökta webbskriptet sedan skickar tillbaks sitt svar till och gör att du som skickat leadet direkt får information om när någon slutfört ett lead åt partnern ifråga.

Besöket av coregen sker oftast i bakgrunden av webbapplikationen, så den besökare som besöker en webbplats med coregs vet i regel inte i vilken omfattning hans eller hennes information används eller sprids. Givetvis krävs alltså besökarens tillåtelse att använda sig av informationen och man bör även använda sig sparsamt av det, då man inte bygger någon tillit hos besökaren ifall denne helt plötsligt finns med på tjugo ovidkommande e-postlistor och på köpet fått en tidningsprenumeration utan att ha godkänt det.

Slutord

Denna artikel tar inte upp den nog så viktiga säkerhetsaspekten. All indata som skickas med skriptet bör således valideras - kontrolleras – så att ingen skadlig kod skickas med. Funktionen som besöker coregen har ingen felsökning. Ifall servern ligger nere där coreg-skriptet anropas dyker inget felmeddelande upp, så en koll bör göras innan så att servern replikerar och är uppe, innan man slutligen skickar iväg förfrågan.