Just nu i M3-nätverket
Gå till innehåll

Hämta ut ID-nummer ur en sträng?


sundrik

Rekommendera Poster

Tjena. Jag har lite problem ^^

 

När jag skapar en nyhet på en sida som skall tillhöra flera olika Menyval. Så tänkte jag ha ett fält för det där menyvalets ID sparas.

Om jag skriver ut ett fält där jag sparat flera menyval kommer det att se ut så här:

3, 5, 7

I det exemplet har jag kopplat nyheten till tre menyval. dvs. menyval 3, 5, och 7.

 

Så när jag trycker på menyval 3, så skall alla nyheter som är kopplade till den visas.

 

Så jag måste på något sätt kunna söka i strängen efter just det ID't för det menyvalet. Hur gör man det?

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Jag är inte riktigt med på vad du menar :)

Om du orkar så förklara en gång till.

 

Jag TROR att du har en meny med olika valmöjligheter; 3, 5 eller 7.

Så när du väljer "sida" 3 så kommer du till en sida som ska hämta ut alla nyheter som tillhör "sida" 3.

Likadant med 5 och 7, alltså hämta nyhter som tillhör 5 resp 7.

 

Länk till kommentar
Dela på andra webbplatser

Om det här handlar om en databasdriven lösning låter som om du i din modelering "brutit mot" första normalformen som säger att en databastabell bara ska innehålla atomära värden.

 

Se http://www.databasteknik.se/webbkursen/normalisering/index.html för en grundläggande och ganska bra förklaring av detta och en hel del annat.

 

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

 

[inlägget ändrat 2007-06-18 20:56:48 av Cluster]

Länk till kommentar
Dela på andra webbplatser

Ja, precis. Och en nyhet skall kunna tillhöra både sida 3, sida 5 och sida 7.

 

Där har jag lite problem. Om en nyhet bara skulle tillhöra en "sida". Så skulle ju SQL-strängen vara något i stil med:

strMeny = "2"

strSQL = "SELECT * FROM tbl_Nyhet WHERE pMenyval ="& strMeny

 

Men nu kan ju fältet pMenyval i databasen vara fylld med flera siffror (ID för menyvalen).

 

Länk till kommentar
Dela på andra webbplatser

Om du struntar i normaliseringen och kör vidare på den (möjligtvis dåliga) modellen du har så kan du ändra till:

strMeny = "2, 3, 5"
strSQL = "SELECT * FROM tbl_Nyhet WHERE pMenyval IN ("& strMeny &")"

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

Länk till kommentar
Dela på andra webbplatser

Jepp, jag är en förbrytare. Helt klart ett brott mot normalformen.

 

Jag ser dock ingen annan lösning till den funktionen jag vill ha. Jag kan ju inte skapa ett fält för varje sida jag vill att nyheten skall tillhöra. Då jag kan skapa och ändra menyer medans tiden går.

 

Länk till kommentar
Dela på andra webbplatser

Om det är Sida 1 som skall visa sina nyheter. Kommer inte då nyheter som är kopplade till Sida 11 också?

Ettan finns ju med där. Eller kollar den bara värdet mellan varje kommatecken?

 

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane

Cluster, jag uppfattar det som att pMenyval kan innehåller 3, 5 resp 7 i en och samma post och inte att han vill lista ut alla poster där pMenyval antingen bara kan vara 3, 5 eller 7, vilket inte är en bra lösning.

Man bör bara spara ett unikt värde i tabellcellen.

 

Har inte direkt någon idé just nu, för sent för att vara kreativ :), men du bör bygga om databasen så att du inte får problem i framtiden.

 

Länk till kommentar
Dela på andra webbplatser

Micke, förstår inte riktigt vad du menar :)

 

Att det inte är en bra lösning håller jag med (se tjat om normalform ovan). Men visst funkar fulhacket för det som efterfrågas? Dvs få träffar på alla rader där menyvals id finns med i (kommaseparerade) listan som sparas i kolumn/attributet pMenyval

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

 

[inlägget ändrat 2007-06-18 22:27:04 av Cluster]

Länk till kommentar
Dela på andra webbplatser

Testade. Det gick bra, den tog inte fel på "1" där det fanns "11".

 

Dock så tar den bara fram en post?

 

Säg att jag har två poster som ser ut så här i fältet pMenyval:

Första posten: 2, 3, 5
Andra posten: 3, 7, 11

 

Om jag har en söksträng som ser ut så här:

SELECT * FROM nyhet WHERE pMenyval IN (3)

Så visar den bara en av posterna. Är det något man skall tillägga för att få med alla poster som träffen finns i?

 

Länk till kommentar
Dela på andra webbplatser

Loopar du igenom det recordset du får som svar på frågan?

[log]<%

strMeny="1, 5, 7"

 

SET objConn = Server.CreateObject("ADODB.Connection")

objConn.open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" &Server.MapPath("select_IN_test.mdb")

 

strSQL = "SELECT * FROM tbl_Nyhet WHERE pMenyval IN ("& strMeny &")"

 

SET objRS = objConn.execute(strSQL)

IF NOT objRS.EOF THEN

DO until objRS.EOF

Response.Write(objRS("pMenyval")&"<br>")

objRS.MoveNext

Loop

END IF

SET objRS = Nothing

 

objConn.close

SET objConn = Nothing

%>[/log]

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

 

[inlägget ändrat 2007-06-18 22:35:56 av Cluster]

Länk till kommentar
Dela på andra webbplatser

Nu har det blivit lite fel.

 

strMeny kan inte/skall inte vara flera siffror. Utan bara en siffra.

strMeny är ID'n på sidan som skall visas.

 

Därför skall jag kolla alla nyhetsposter som kan ha meny ID't i pMenyval.

 

Det blev krångligt ^^

 

SQL strängen skall kolla om en siffra finns i fältet pMenyval.

strMeny = "3"

SELECT * FROM nyhet WHERE pMenyval IN ("& strMeny &")

 

Finns inte trean som första siffra visas inte den posten alls. :/

 

Länk till kommentar
Dela på andra webbplatser

Jag ser dock ingen annan lösning till den funktionen jag vill ha.
vanligt är att man gör två tabeller och en "kopplingstabell".

 

Typ:

 

tblNyheter

id|rubrik|ingress|kropp|etc...

 

tblMenyval

id|menynamn|etc...

 

tblMenyNyheter

fkNyhetsId|fkMenyvalsId

 

Dvs. tblMenyNyheter håller reda på vilka nyheter som tillhör vilka menyval i ett många-till-många-förhållande (se bild).

 

Och då skulle du kunna hämta ut alla nyheter för ett angivet menyval med tex:

strSQL = "SELECT * FROM tblNyheter WHERE id IN (SELECT fkNyhetsId FROM tblMenyNyheter WHERE fkMenyvalsId="&strMeny&")"

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

[bild bifogad 2007-06-18 22:47:58 av Cluster]

 

[inlägget ändrat 2007-06-18 22:53:29 av Cluster]

954691_thumb.jpg

Länk till kommentar
Dela på andra webbplatser

Ok, då tycker jag du ska kolla förslag på hur du "bör" göra nedan (//eforum.idg.se/viewmsg.asp?EntriesId=954637#954689)

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

Länk till kommentar
Dela på andra webbplatser

Ja, det är väl bara för mig att acceptera begränsningarna inom databashanteringen ^^

 

Jag är dock ytterst tacksam för ditt tålamod och hjälp :D

 

Länk till kommentar
Dela på andra webbplatser

Hehe, begränsningarna finns där för att du skall tillåtas alla möjligheter... ;) Var glad att du dyker på detta nu, som jag förstår det tidigt i utvecklingsfasen, och inte senare.

 

Att ta sig en rejäl funderare på (och läsa in sig om) databasmodellering innan man börjar utveckla är alltid mödan lönt!

 

Tack för poäng och lycka till :thumbsup:

 

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

Länk till kommentar
Dela på andra webbplatser

Micke_skane
Micke, förstår inte riktigt vad du menar :)

HeHe, inte jag heller när jag läser det en gång till :)

Men vi hade samma tanke med en samlingstabelll för vilka sidor och nyheter som hörde ihop :)

 

Länk till kommentar
Dela på andra webbplatser

När jag skapar en nyhet, så har jag en rullista med menyvalen man kan koppla nyheten till. Man kan välja flera menyval om man håller ner ctrl-knappen och trycka.

 

Värdet som jag sedan hämtar ur med request.form kommer att se ut förljande, om jag valt t.ex tre st menyer:

3, 5, 7

 

Dessa siffror (meny ID) skall jag sätta in i menyval tabellen som du föreslog.

 

Det måste ju bli med DO WHILE eller så. Men jag får inte riktigt kläm på hur jag skall göra.

Jag har räknat hur många ID det finns i strängen från FORMen.

cntMenyval = 1  'Måste vara ett. Om inget komma finns, så är det iaf minst en siffra.

replace(strMenyval, " ,"," cntMenyval = cntMenyval + 1")

 

Men jag vet inte hur jag skall få ur varje siffra för att sätta in i databasen. Det är riktigt knepigt.

 

Länk till kommentar
Dela på andra webbplatser

Enklast kanske är att lägga in dem i en array och sedan loopa igenom den.

 

Låt säga att formulärfältet (select) heter menyval samt att du i formuläret skickar med Nyhetens id så skulle du kunna göra såhär:

strMenyVal=Trim(Request.Form("menyval"))
arrMenyVal=Split(strMenyVal,",")
FOR i=0 TO uBound(arrMenyVal)
 strSQL="INSERT INTO tblMenyNyheter (fkNyhetsId, fkMenyvalsId) VALUES("&Request("NyhetsId")&","&Trim(arrMenyVal(i))&")"
 Response.Write(strSQL&"<br>")
 'objConn.execute(strSQL)
Next

 

Om det är en uppdatera/ändra-sida så bör du köra en delete-sats innan loopen.

objConn.execute("DELETE FROM tblMenyNyheter WHERE fkNyhetsId="&Request.Form("NyhetsId")&"")

 

/Cluster

------------------------------------------------------------

Ditt vetande är värdelöst om inte andra vet att du vet

-----------> http://eforum.kicks-ass.net <------------

 

 

Länk till kommentar
Dela på andra webbplatser

  • 1 month later...

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...