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

Kryssa i flera checkboxar, fungerar ej!


hanzi

Rekommendera Poster

Hej, har ett litet problem som tagit min tankekraft hela dagen och fortfarande ingen lösning. Den här tråden (//eforum.idg.se/topic/198688-vilken-datatyp/page__p__198688__fromsearch__1#entry198688) avhandlar mitt problem, men det finns ingen lösning upplagd...

 

Jag vill hämta uppgifter från en databas och där välja ut några av raderna med checkboxar. De ska då få värdet 1 allihop så man vet att de är markerade. Eftersom databasen är levande och uppdateras hela tiden kan antalet och vilka rader skilja sig åt. Ett alternativ är att man efter varje rad lägger en submit-knapp, men det bli omständigt när det är närmare hundra rader och man ska välja ut säg, tio. Har börjat förstå att man måste använda javascript, vilket javascript då?

Länk till kommentar
Dela på andra webbplatser

Men det känns inte logiskt - "att de ska få värdet 1 för att man ska veta att de är markerade".

 

Vad handlar det om för val egentligen? Vad är det man väljer om man kryssar i?

 

Enklast att hålla reda på om varje checkbox har en egen rad i databasen.

Länk till kommentar
Dela på andra webbplatser

Jag kan beskriva det på det här sättet:

 

Vilka tre av nedanstående bildmodeller är dina favoriter:

 

-SAAB

-VOLVO

-AUDI

-BMW

-VOLKSWAGEN

-SKODA

-CITROEN

-RENAULT

-FERRARI

 

Jag förstår hur du menar Jonas, nu kan man ju enkelt skapa en rad för varje bilmodell och cell som räknar antalet val som den bilmodellen får. Men min databas är uppbyggd med komplicerade relationer och alternativen kommer vara flera hundra totalt, fast det kanske är 50 åt gången som man kan välja bland. Dessutom kommer alternativ läggas till och plockas bort hela tiden. Därför har jag en cell i raden som heter bilmodell och i samma rad sitter cellen som räknar antalet val. Enda lösningen jag fått fram just nu är att uppdatera sidan efter varje val, vilket känns jobbigt då man kommer göra mellan fem och tio val åt gången. Jag vill alltså kunna välja tre billmodeller samtidigt och inte en och en.

 

Vet inte om pedagogik är mitt starkaste kort, men jag har i alla fall försökt uttrycka mig så utförligt som möjligt, hoppas någon förstår mitt problem och har en lösning på det.

Länk till kommentar
Dela på andra webbplatser

Ok, just att välja flera är inga problem, men de måste ha en gemensam nämnare, t ex en cssclass, typ class="favoriteCar".

 

Har du klart för dig hur du populerar vilka som är sparade för användaren?

Det måste du göra först, se till att checked="checked" är på de som användaren sparat vid tidigare tillfälle.

 

sedan är det kanske för mycket att använda jquery enbart för detta men om du redan använder det behöver man bara göra så här:

 

<script type="text/javascript">
$(document).ready(function(){
 $("input.favoriteCar").bind("click",function(e){
   if($("input.favoriteCar:checked").length>3)
   {
     e.preventDefault();
     alert("Du får välja max 3 bilar");
   }
 });

});

</script>

Länk till kommentar
Dela på andra webbplatser

Tack, jag tror vi är en bit på väg. Det jag vill göra är att räkna hur många som väljer exempelvis saab när de får välja tre, och hur många som väljer volvo. Jag har även tänkt att utav de tre som de väljer ska de markera vilken som är den yttersta favoriten med "Input radio" och även där räkna hur många som väljer saab som det yttersta favoriten och hur många som väljer volvo. Den senare funktionen har jag dock kläm på. Sen ska allt sparas ned i en databas. Så när fönstret laddas är det ointressant vad tidigare besökare valt, då ska inga checkboxar vara CHECKED.

Länk till kommentar
Dela på andra webbplatser

Fast nu är du inne på helt andra saker som inte har med javascript att göra.

Du vill egentligen göra en sökning i databasen som räknar förekomster av varje enskild bil och vikta detta. Sedan spelar det knappt roll hur det presenteras.

 

Hur Radio-knapp kommer in i det hela fattar jag inte alls.

Kan du inte rita ett flödesschema och visa hur det ska gå till?!

Länk till kommentar
Dela på andra webbplatser

Nej, jag vill inte räkna förekomsten, jag vill lägga till information till databasen.

 

Det jag ska göra kan liknas vid en enkät där flera användare får möjlighet att svara på ett påstående. Påståendet har, låt säga, tio svarsalternativ och användaren, som bara får svara en gång, får välja tre alternativ och dessutom vikta ett av alternativen genom att markera det som favorit/förstahandsalternativ.

 

Påståendet, liksom svarsalternativen, kommer att se olika ut för olika användare. Därför har jag byggt upp en databas som kan beskrivas med en tabell som hanterar påståendet. Den tabellen har en relation till tabellen som hanterar svarsalternativen. Sistnämnda tabellen har därför följande kolumner: ID, PåståendeID, svarsalternativ, antalsvar.

 

Först hämtar jag ett påstående i påståendetabellen. Sen hämtar jag de svarsalternativen som har en relation till det specifika påståendet (genom påståendeID). Svarsalternativen kan variera i antal, men gemensamt är att användaren ska kryssa i tre alternativ och ange ett av dem som favorit. Så långt fungerar allt. Men hur får jag nu med mig användarens svarsalternativ så att jag kan uppdatera "antalsvar"?

 

Personligen tycker jag min beskrivning är väldigt rörig just nu, men jag vet inte hur jag ska uttrycka mig tydligare. Tacksam för all hjälp i ärendet.

Länk till kommentar
Dela på andra webbplatser

Det jag vill göra är att räkna hur många som väljer exempelvis saab när de får välja tre, och hur många som väljer volvo.
Nej, jag vill inte räkna förekomsten, jag vill lägga till information till databasen.

Det är rätt tvetydligt det du skrivit, men det förstår du kanske själv.

 

För att gå till grunden med det här så är detta ingen javascriptfråga utan mera en strukturell.

 

Jag anser att du delar upp detta i flera steg (att användare får olika frågor med tillhörande svarsalternativ spelar ingen roll).

 

Först presenteras frågan med dess svarsalternativ och användaren får välja 3 av dessa (eller ett maxtal som regleras av ett fält i frågetabellen).

 

När användaren valt de tre (eller satta antalet) alternativ så presenteras viktningen, där användaren får välja vilket av alternativen som är viktigast.

 

 

Man skulle kunna ha en lista där man väljer alternativen, drar till sin val-lista där man sedan kan göra viktningen;

http://demo.allstarsmedia.se/sortables.asp - exempel på hur man kan vikta

 

 

I databasen behöver du utöka svarstabellen.

Du behöver ytterligare en tabell med svarsalternativen och en relation till svarsalternativID. Sedan blir det lätt att räkna.

ID, answerAlternativeID, sortorder

Länk till kommentar
Dela på andra webbplatser

Tack Jonas för ditt engagemang för att hjälpa mig att lösa detta. När jag uttrycker att "jag vill räkna hur många som väljer Saab" kunde jag uttryckt mig att "jag vill veta hur många som väljer Saab".

 

Jag skulle gärna ge dig en länk och konkret visa vad det är som är mitt problem, men av olika skäl har jag ingen möjlighet att göra det. Redan i första inlägget jag skriver så är det tydligt att jag har problem med uppdateringen av databasen, och det har det varit hela tiden.

 

Min programmering ser ut så här:

 

Jag loopar alla svarsalternativ som hör till ett visst påstående. Det kan då se ut så här när det är klart:

<INPUT TYPE=checkbox NAME="vald" VALUE="1">Saab
<INPUT TYPE=checkbox NAME="vald" VALUE="1">Volvo
<INPUT TYPE=checkbox NAME="vald" VALUE="1">Audi
<INPUT TYPE=checkbox NAME="vald" VALUE="1">BMW
<INPUT TYPE=checkbox NAME="vald" VALUE="1">Volkswagen
<INPUT TYPE=checkbox NAME="vald" VALUE="1">Skoda
<INPUT TYPE=checkbox NAME="vald" VALUE="1">Ferrari

<INPUT TYPE=submit>

Alla Checkboxar heter då "vald", och det är det här som är mitt problem när jag sen i nästa steg ska uppdatera databasen. Hade svarsalternativen varit statiska hade det inte varit några problem för då hade man gett dem en egen kolumn i databasen. Nu kommer de ändras hela tiden, så det går inte att lösa på det sättet, hur då göra?

Länk till kommentar
Dela på andra webbplatser

Om man kryssar i en ruta, hur ska man veta att det är Audi och ingen annan då alla ser likadana ut?

 

<INPUT TYPE=checkbox NAME="favoriteCar" VALUE="1">Saab
<INPUT TYPE=checkbox NAME="favoriteCar" VALUE="2">Volvo
<INPUT TYPE=checkbox NAME="favoriteCar" VALUE="3">Audi
<INPUT TYPE=checkbox NAME="favoriteCar" VALUE="4">BMW
<INPUT TYPE=checkbox NAME="favoriteCar" VALUE="5">Volkswagen
<INPUT TYPE=checkbox NAME="favoriteCar" VALUE="6">Skoda
<INPUT TYPE=checkbox NAME="favoriteCar" VALUE="7">Ferrari

<INPUT TYPE=submit>

Värdet ska representera svarsalternativID och bilmodellen svarsalternativvärdet, som ligger i en egen databastabell. Där finns också koppling till frågeID samt eventuellt en sortindex för sortering av alternativen när du presenterar alternativen.

 

Om någon ska vara vald ska checked="checked" till, men det har du tidigare sagt att det inte ska vara.

Länk till kommentar
Dela på andra webbplatser

När sidan laddas ska inget alternativ vara markerat. Användaren ska markera ett X antal alternativ, och därefter välja favoriten av de markerade alternativen, en hel vanlig enkätundersökning helt enkelt där jag tittar på resultatet på en annan sida. Sen när nästa användare laddar sidan ska inget alternativ vara markerat då heller. Och sen upprepar det sig. Det kan förekomma olika alternativ och olika antal alternativ för olika användare. Det är det som krånglar till det för mig eftersom annars hade man ju kunnat skriva koden så här

 

<INPUT TYPE=checkbox NAME="saab" VALUE=1>-Saab

 

Jag vet inte om det blir tydligare om jag beskriver mitt problem som att jag behöver uppdatera flera rader samtidigt i en tabell. Hur ska koden formuleras så att de alternativen som blir ikryssade ska vara de som också uppdateras? Kodar i ASP så det kanske är där den här tråden ska ligga om man inte behöver hjälp av ett Javascript. Fick för mig att det är Javascript som kan hjälpa till.

Länk till kommentar
Dela på andra webbplatser

Alla checkboxar ska ha samma namn, så att det blir en array när det postas, annars vet man inte vad som ska tas emot (man kan skriva kod för det man det blir en omständig sådan).

 

Jag har förstått det gällande att det inte ska vara ikryssat, det skrev jag också i mitt förra inlägg, det var bara en sidnot.

 

Du ska inte uppdatera flera rader, du ska lägga in nya rader för varje kryssruta som användaren väljer.

 

Jag flyttar denna tråd till Webbutveckling - övrigt då huvudfrågan inte har med javascript att göra, utan är mer konceptuell.

Länk till kommentar
Dela på andra webbplatser

Tack för flytten!

 

Det är en ganska komplex sida jag håller på att utforma och för närvarande är det sju tabeller som har olika relationer med varandra. Så om det går att lösa så att tabellen med svarsalternativ inte behöver utökas för varje enskilt kryss hade det underlättat en del, jag tänker mig:

 

Sida 1

<INPUT TYPE=checkbox NAME="vald" VALUE="<% =rs("ID")%>" >-Saab

<INPUT TYPE=checkbox NAME="vald" VALUE="<% =rs("ID")%>" >-Volvo

osv.

 

Sida 2

 

<%

DO UNTIL rs.EOF

IF Request.Form("vald") = rs("ID") THEN

svarsantal = svarsantal + 1

UPPDATERA

Else

Loop

END IF

%>

 

Något förenklat, men hur ska jag få scriptet att förstå att det är flera rader som ska uppdateras utan att behöva köra genom alla raderna igen? Det borde väl på något sätt att få scriptet att förstå att det bara är de markerade raderna som ska uppdateras?

Länk till kommentar
Dela på andra webbplatser

<INPUT TYPE=checkbox NAME="vald" VALUE="<% =rs("ID")%>" >-Saab
<INPUT TYPE=checkbox NAME="vald" VALUE="<% =rs("ID")%>" >-Volvo

Det finns fortfarande inget som särskiljer checkboxarna, dvs det är omöjligt att veta vad som är Saab resp Volvo-svar.

 

<%
DO UNTIL rs.EOF
IF Request.Form("vald") = rs("ID") THEN
svarsantal = svarsantal + 1
UPPDATERA
Else
Loop
END IF
%>

Jag förstår inte ens vad dessa rader ska göra. För att räkna förekomster av vissa svarsalternativ skulle jag göra detta till EN fråga mot databasen istället för att loopa.

Länk till kommentar
Dela på andra webbplatser

Jag tror du hängt upp dig för mycket ordet räkna. Jag vill lägga till data i databasen genom att uppdatera flera rader i samma tabell samtdiigt! Att ta fram resultatet gör jag givetvis genom en fråga vid ett senare tillfälle.

 

Jag tänker så här:

 

Tabellen "svarsalternativ" innehåller kolumnerna:

"ID" (eftersom det är unikt för varje rad)

"antalsvar" (som uppdateras med +1 vid varje tillfälle svarsalternativet blivit valt)

"antalfavorit" (som uppdateras med +1 vid varje tillfälle svarsalternativet valts som yttersta favorit)

"svarsalternativ" (Exemepelvis Saab, nästa kan vara Volvo och tredje AUDI)

"påståendeID" (eftersom svarsalternativet ska köras mot tabellen påstående)

 

När ett Påstående ställts levererar tabellen "svarsalternativ" samtliga svarsalternativ som för tillfället finns kopplade till det påståendet genom en loop, exempel:

 

<%

Do until rs.EOF

%>

<INPUT TYPE="checkbox" NAME="antalsvar" VALUE="<% rs("ID") %>"><% =rs("svarsalternativ")<BR>

<%

rs.MoveNext

Loop

%>

 

Detta generar, låt säga, tio rader och användare ska välja tre.

 

Som du mycket riktigt påpekar i det senaste inlägget blir det ju problem med att hålla isär svarsalternativen, och det är det som är orsaken till att jag startade tråden. Jag vet att det går att uppdatera flera rader samtidigt. De sidor som har sådana funktioner har jag kollat i källkoden och sett att det är Javascript inblandat.

Länk till kommentar
Dela på andra webbplatser

Nu blev det så mycket text i tråden att jag blir snurrig.

 

det börjar bli omständigt när det är närmare hundra rader och man ska välja ut säg, tio. Har börjat förstå att man måste använda javascript, vilket javascript då?

Vad handlar det om egentligen?

 

Om det handlar om att du vill ha ut 10 olika frågor för varje användare så är det en databasfråga och inte javascript (för det är onödigt att hämta hundra alternativ om bara tio ska visas).

 

Om det handlar om hur du sparar användarens svar så är det en programmeringsfråga (och lite databas).

Det känns som att det är det senare du är ute efter, egentligen.

Utefter det du uppvisat senast i programkod så kommer de checkboxar man valt skickas som en array. Denna arrayn loopar man igenom och kan göra en uppdatering i databasen för varje svarsalternativ.

for ($i=0; $i<count($_post['antalsvar']); $i++){ 
 $chk = addslashes($_post['antalsvar'][$i]); 
 $sql = "Update tabell antalsvar = antalsvar + 1 WHERE ID=".$chk;
}

Länk till kommentar
Dela på andra webbplatser

Kört fast.

 

Det är ju att spara användarens val jag vill göra, och nu har jag problem att få in Javascriptkoden i den vanliga koden. Programmerar i ASP mot en MySql-databas. Sidan som det ligger på ger mig bara felmeddelande 500 så fort jag har Javascripten i koden. Mina kunskaper om Javascript är inte så goda, men mina erfarenheter är att det är ett väldigt känsligt språk.

 

Jonas, om det är du som är hjälpsam igen vänligen bortse från de tidigare inläggen där jag försökt förklara vad det är som varit mitt problem eftersom det blir snurrigt för dig då.

 

Jag tänker mig allt i tre steg.

Första steget så får användaren första påståendet och då välja sina tre favoriter.

 

Andra steget bekräfta att det är de tre som är favoriter, och dessutom välja sin yttersta favorit (med detta har jag inga problem eftersom jag då kö input radio). Har man valt fel alternativ så får man gå tillbaka till första steget.

 

Tredje steget uppdateras databasen och användaren får nästa påstående med nya valmöjligheter, processen börjar alltså om ända till dess alla påståenden är besvarade.

 

Hur ska då Javascripten se ut?

Länk till kommentar
Dela på andra webbplatser

Vänta nu, vad ska javascriptet göra då? Du fick en kodsnutt som hindrade att användaren inte kunde klicka i fler checkboxar än tre, vad behöver du mer?

Länk till kommentar
Dela på andra webbplatser

Arkiverat

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

×
×
  • Skapa nytt...