• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Checkboxes und JSP -> ARRAY INDEX OUT OF BOUNDS!!!

xplox

Member
Hallo. ....
:(

bin total deprimiert.
...

habe folgendes problem und komme nicht weiter ...
ich lese aus einer datenbank (ms sql server 2000) benutzerrechte aus, die ich in einer tabelle mit checkboxes darstelle. im moment sieht es jetzt allerdings leider so aus, dass ich zwar angezeigt bekomme, welche benutzer auf welcher seite welches recht zugewiesen bekommen hat, aber und jetzt kommts:

ich kann bei einer erneuten abfragen (AKTUALISIERUNG der rechte --> zum schreiben auf dem Server) nur die checkboxes auslesen, die auch wirklich gecheckt sind.
hier mal ein bischen code:

ACTION KLASSE
PHP:
if(action.equals("verwalten"))
			{
				String [] ma_kuerzel = request.getParameterValues("ma_kuerzel_hidden");
				String [] rights_login_out = request.getParameterValues("login_out");
				String [] rights_ergaenzen = request.getParameterValues("ergaenzen");
				String [] rights_benutzer = request.getParameterValues("benutzer");
				
				String button_updaten = request.getParameter("updaten");
				Connection cn = null, cnlog = null;
				
				if(request.getParameter("kue") != null && request.getParameter("kue").length() > 0)
				{
					FRM_Benutzer fuser = (FRM_Benutzer) form;
					try
					{
						cn = new DB_Object().getConnection();
						DTO_Benutzer dto = DB_Benutzer.findByKuerzel_PK(cn, request.getParameter("kue"));
						fuser.setUser(dto);
						
					} catch(SQLException e) {
						System.out.println(e.toString());
					}
					
				}
				
				
				if(button_updaten != null)
				{
					//SHIT GEHT NIT
					DB_Benutzer dbuser = new DB_Benutzer();
					try
					{
						cn = new DB_Object().getConnection();
						
						for(int i = 0; i < rights_login_out.length; i++){
							System.out.println(rights_login_out[i]);
						}
						
						System.out.println(ma_kuerzel.length);
						System.out.println(rights_login_out.length);
						System.out.println(rights_ergaenzen.length);
						System.out.println(rights_benutzer.length);
						
						
						for(int i = 0; i < ma_kuerzel.length; i++)
							dbuser.updateUserRights(cn, ma_kuerzel[i], rights_login_out[i], rights_ergaenzen[i], rights_benutzer[i]);
						
						//LOGGING
						
					} catch(SQLException e){
						System.out.println("SQL Fehler: \n" + e.toString());
						
					} finally {
						if(cn != null)
							new DB_Object().closeConnection(cn);
						if(cnlog != null)
							new DB_Object().closeConnection(cnlog);
					}
					
				}
				
				
			
				return mapping.findForward("success");
			}

JSP SEITE
PHP:
<c:forEach items="${FRM_Benutzer.alluser_withrights}" var="user" varStatus="rowCounter">
					<c:choose>
					    <c:when test="${rowCounter.count % 2 == 0}">
							<tr class="hell">
						</c:when>
	          			<c:otherwise>
	            			<tr class="dunkel">
	          			</c:otherwise>
					</c:choose>
						    	<td class="user"><c:out value="${user.name}" /></td>
								<td align="right">
									<a href="./benutzer.do?action=bearbeiten&kue=<c:out value='${user.ma_kuerzel}' />">
										[<c:out value="${user.loginname}" />]
									</a>
								</td>
						    	<td align="center">
									<c:choose>
										<c:when test="${user.login_out=='J' || user.login_out=='F'}">
											<input type="checkbox" id="rights" name="login_out" checked="checked" value="F" onclick="changevalue(this)"/>
										</c:when>
										<c:otherwise>
											<input type="checkbox" id="rights" name="login_out" value="N" onclick="changevalue(this)"/>
										</c:otherwise>
									</c:choose>	
								</td>
								
...
...
...

<td align="center">
									<c:choose>
										<c:when test="${user.benutzer=='J' || user.benutzer=='F'}">
											<input type="checkbox" id="rights" name="benutzer" checked="checked" value="F" onclick="changevalue(this)"/>
										</c:when>
										<c:otherwise>
											<input type="checkbox" id="rights" name="benutzer" value="N" onclick="changevalue(this)"/>
										</c:otherwise>
									</c:choose>
								</td>
								<td align="center">
									<input type="hidden" id="ma_kuerzel_hidden" name="ma_kuerzel_hidden" value="<c:out value='${user.ma_kuerzel}' />" />
								</td>
						    </tr>
				</c:forEach>


Na ja und wenn ich jetzt mein aktualisierunsbutton drücke um die werte auszulsesen bekomm ich eben nur die gecheckten. hat ich glaub ich schon geschrieben ...
folglich bekomme ich beim Eintrag in die datenbank über meine funktion eine array index out of bounds exception, da die einzelnen werte nicht gleich der anzahl der nutzer sind. die einzelnen checkboxes haben auch alle einen wert von mir zugewiesen bekommen. entweder f oder n. das half allerdings auch nicht.

weiß echt nicht mehr weiter. kann mir jemand helfen. bitte.... danke
 
ich kann bei einer erneuten abfragen (AKTUALISIERUNG der rechte --> zum schreiben auf dem Server) nur die checkboxes auslesen, die auch wirklich gecheckt sind.

das ist das ganz normale verhalten der checkboxen, nur diejenigen, die aktiviert sind, schickt der browser als name/value-paar ab. wie willst du sonst unterscheiden können, welche aktiviert sind?

du darfst nicht über die werte aus der datenbank loopen, sondern über diejenigen, die geschickt wurden. diese solltest du aber zuerst auf gültigkeit überprüfen.
 
das ist doch "bulls***"!!! doofe checkboxes.
hat jemand vielleicht einen anderen vorschlag wie ich es gestalten könnte.

hab schon überlegt, ob ich zu jeder checkbox ein hidden field hinterlegen soll, mit dem ich per javascript den wert(value) ändere und dann das hiddenfield mit meiner schleife auslese.
aber das ist ja mal total der mehraufwand...

--> dazu bin ich mir jetzt gerade was am zusammenknauben. code kommt wenn er fertig ist!

falls es auch noch irgendwie einfacher geht!!!??? bitte hier um antwort! danke.
 
Zuletzt bearbeitet:
Leg lieber für jeden Benutzer ein hidden-input mit der ID an. Die Checkboxes enthalten als Namen diese Benutzerid. Wenn du für einen Benutzer eine Checkbox bekommst, bekommt er die Rechte, ansonsten verliert er sie.
 
habe ich dabei aber nicht das problem, das ich jeweils nur ein einzelnes recht an einen benutzer vergeben kann. ich wollte darüber allerdings eine etwas komplexere zugriffsstruktur regeln.

sprich so ca. 20 bis 30 checkboxen pro benutzer
 
Also warum so kompliziert: Wenn die Seite zurück kommt, dann kannst Du alle bestehenden Rechte der Benutzer löschen und sie komplett neu anlegen, anhand der gesetzten Checkboxen.
Alternativ kannst Du Dir in der Sitzung merken, welche Checkboxen aktiv waren und vergleichst dies mit der zurückgemeldeten Liste. Die Differenz legst Du an oder löscht Du. Wenn Du keine Sitzungsvariable dafür verwenden willst, weil vielleicht parallel andere ebenfalls die Seite aufhaben könnten, kannst Du den Abgleich auch direkt mit der DB machen, wo Du dann die Tabelle sperren kannst.
 
Also warum so kompliziert: Wenn die Seite zurück kommt, dann kannst Du alle bestehenden Rechte der Benutzer löschen und sie komplett neu anlegen, anhand der gesetzten Checkboxen.

funktioniert aber nicht wenn, nicht immer alle Benutzer angezeigt werden. Dann würden die die nicht angezeigt werden, auch gelöscht werden.

habe ich dabei aber nicht das problem, das ich jeweils nur ein einzelnes recht an einen benutzer vergeben kann. ich wollte darüber allerdings eine etwas komplexere zugriffsstruktur regeln.

sprich so ca. 20 bis 30 checkboxen pro benutzer

und? Da du die Checkboxen ja den Rechten zuordnen mußt um zu wissen welche Rechte gesetzt sind.

mal nen beispiel:
PHP:
<input type="hidden" name="user_id" value="42">
<input type="checkbox" name="recht1_42">
<input type="checkbox" name="recht2_42">
<input type="checkbox" name="recht3_42">

usw
 
habs jetzt so gemacht!

PHP:
...
function changevalue(field, namehid)
{	
	var len = document.getElementsByName(namehid).length;
	var val = document.getElementsByName(namehid)[field.value-1].value;
		
	if(val == 'F') document.getElementsByName(namehid)[field.value-1].value = 'N';
	else if(val == 'N') document.getElementsByName(namehid)[field.value-1].value = 'F';
	else document.getElementsByName(namehid)[field.value-1].value = 'N';
	//window.alert(namehid + " status war: " + val);
}
...

und auf der seite so ...
PHP:
...
		<p><h1>Benutzerrechte verwalten - aktive Nutzer (<c:out value="${FRM_Benutzer.anzahl_aktiv}" />)</h1></p>
		<table class="userrights">
			<tbody>
				<tr>
			    	<td class="pflicht"> </td>
					<td class="left"> </td>
			    	<td align="center">Logout</td>
					<td align="center">Ergänzen</td>
					<td align="center">Benutzer</td>
					<td> </td>
			    </tr>
				<c:forEach items="${FRM_Benutzer.alluser_withrights_aktiv}" var="user" varStatus="rowCounter">
					<c:choose>
					    <c:when test="${rowCounter.count % 2 == 0}">
							<tr class="hell">
						</c:when>
	          			<c:otherwise>
	            			<tr class="dunkel">
	          			</c:otherwise>
					</c:choose>
						    	<td class="user"><c:out value="${user.name}" /></td>
								<td align="right">
									<a href="./benutzer.do?action=bearbeiten&kue=<c:out value='${user.ma_kuerzel}' />">
										[<c:out value="${user.loginname}" />]
									</a>
								</td>
						    	<td align="center">
									<c:choose>
										<c:when test="${user.login_out=='J' || user.login_out=='F'}">
											<input type="checkbox" id="rights" name="login_out" checked="checked" value="<c:out value='${rowCounter.count}' />" onclick="changevalue(this, 'login_out_hidden')"/>
											<input type="hidden" id="rights_hidden" name="login_out_hidden" value="F" />
										</c:when>
										<c:otherwise>
											<input type="checkbox" id="rights" name="login_out" value="<c:out value='${rowCounter.count}' />" onclick="changevalue(this, 'login_out_hidden')"/>
											<input type="hidden" id="rights_hidden" name="login_out_hidden" value="N" />
										</c:otherwise>
									</c:choose>	
								</td>
...
								<td align="center">
									<input type="hidden" id="ma_kuerzel_hidden" name="ma_kuerzel_hidden" value="<c:out value='${user.ma_kuerzel}' />" />
								</td>
						    </tr>
				</c:forEach>
				
			</tbody>
		</table>
		<table class="userrights">
			<tbody>
				<tr>
					<td class="pflicht"> 
					</td>
					<td align="left" colspan="4">
						<input type="submit" id="updaten" name="updaten" value="Benutzerrechte aktualisieren" /></p>
					</td>
			    </tr>
			</tbody>
		</table>
		</form>
...

Danke an alle für eure Unterstützung.
 
Zurück
Oben